2012-06-18 3 views
1

Хорошего дня,Perl поменять два слова

У меня есть простая рабочая рутина в Perl, что SWAPS два слова:

т.е. John Doe -----> Doe John

Вот оно:

sub SwapTokens() 
{ 
    my ($currentToken) = @_; 

    $currentToken =~ s/([A-Za-z]+) ([A-Za-z]+)/$2 $1/; 
    # $currentToken =~ s/(\u\L) (\u\L)/$2 $1/; 
    return $currentToken; 
} 

следующие выходы использования именно то, что я хочу:

print &SwapTokens("John Doe"); 

Но когда я раскомментирую строку '$ currentToken = ~ s/(\ u \ L) (\ u \ L)/$ 2 $ 1 /;

У меня есть ошибка. Я что-то упускаю, похоже, что мой синтаксис верен.

ТИА,

Coson

+1

Возможно ли помочь вам, если вы разработаете больше, чем «Я получаю сообщение об ошибке»; почему вы пытаетесь выполнить второе регулярное выражение, если первый уже работает по мере необходимости? – lanzz

+0

Ошибка, которую я получаю: Ошибка синтаксиса в строке script.pl XX, рядом с "(\ u \ L) (\ u \ L" Неверное объявление основной подпрограммы :: IsTitleCase2 в файле scriptname.pl – coson

ответ

-4

\L означает "lowercase till \E"; т. е. в какой-то момент ее необходимо выполнить на уровне \E. У вас нет \E в вашем регулярном выражении, поэтому оно недействительно; добавляя \E после каждого \L получает скрипт для компиляции, хотя я не знаю, что вы на самом деле пытаетесь выполнить там.

+0

I ' т. е. пытаюсь обменять два слова друг на друга. Я использую регулярное выражение, которое должно содержать заголовочные слова. – coson

+0

Пробовал и получил: Квантор не следует за символом в регулярном выражении, отмеченный <- ЗДЕСЬ в m/(+ <- - ЗДЕСЬ) (+)/в строке scriptname.pl 31. – coson

+1

'\ u. \ L. * \ E' совпадает с' .. * 'и' [[: upper:]] [[: lower: ]] * - это, в основном, старый способ сделать (ранее размещенный) '\ p {Lu} \ p {Ll} +'. – ikegami

5

\u не является атомом регулярного выражения, который соответствует заглавной букве. \L не является атомом регулярного выражения, который соответствует ряду строчных букв. Вы ищете

s/(\p{Lu}\p{Ll}+) (\p{Lu}\p{Ll}+)/$2 $1/; 

\p{Lu} Uppercase letter. 
\p{Ll} Lowercase letter. 

$ unichars '\p{Lu}' | head -n 5 
A U+0041 LATIN CAPITAL LETTER A 
B U+0042 LATIN CAPITAL LETTER B 
C U+0043 LATIN CAPITAL LETTER C 
D U+0044 LATIN CAPITAL LETTER D 
E U+0045 LATIN CAPITAL LETTER E 

$ unichars '\p{Ll}' | head -n 5 
a U+0061 LATIN SMALL LETTER A 
b U+0062 LATIN SMALL LETTER B 
c U+0063 LATIN SMALL LETTER C 
d U+0064 LATIN SMALL LETTER D 
e U+0065 LATIN SMALL LETTER E 
+0

+1 для использования свойств юникода, действительно может начаться интересное обсуждение, если OP заинтересованы.) – raina77ow

+2

@ raina77ow, Большая проблема - это b что имена следуют такой ограниченной схеме. – ikegami

5

Может быть, вы ищете что-то вроде этого:

sub swap_the_words { 
    my ($processed_string) = @_; 
    $processed_string =~ s/([A-Z][A-Za-z]+) ([A-Z][A-Za-z]+)/$2 $1/; 
    return $processed_string; 
} 
print swap_the_words('John Doe'); # prints Doe John 

Что касается \u и \l, они хороши для изменения строки - не регулярное выражение. Например, вы можете немного изменить сценарий, как это ...

$processed_string =~ s/([a-z]+) ([a-z]+)/\u\L$2\E \u\L$1\E/i; 
    ... 
    print swap_the_words('cOsOn hAcKeR'); # Hacker Coson 

... так что ваши слова не только местами, но, учитывая надлежащее дело, а также. Обратите внимание, однако, что эти модификаторы используются в заменяющей части оператора s///.

+0

Ahh, не знал, что они хороши для изменения строки ... – coson

Смежные вопросы