2013-07-04 3 views

ответ

0

^: средний символ ":" в начале строки. Кроме того, он будет захватывать только одного "слово" после того, как :

0

Это означает ^ В настоящее время начало линии А :

например:

$string = q~:Thats~;

$hash{Thats} = 1;

$string2 = q~Thats~;

Заявление успешно завершено $string, но оно не работает $string2, потому что оно начинается не с :.

6
^  start at beginning of string 
:  match a literal colon 
(  capture the following string 
\w+  matching one or more alphanumeric characters 
)  end capture 

Захват хранится в $1, который затем становится ключ в хэш %hash ниже.

Итак, если у вас есть строка :foo, вы будете соответствовать foo и получите $hash{foo} = 1. Цель этого кода - это, без сомнения, извлечь определенные строки и дедупировать их с помощью хэша.

0

Вы сказали:

'And the $str has to contain one or more words ...'

Я не уверен, если это просто опечатка или если ваше намерение отличается от вашего маленького примера. Теперь (согласно вашему сообщению) ваше регулярное выражение будет соответствовать строке, например: :Hello. В Perl, это может быть записано также как

my %hash =(); 
my $str = ':Hello'; 

$hash{ $1 }++ if $str =~ /^:(\w+)/; 

Теперь, если вы хотите изменить ^: в своем регулярном выражении к [:^], что означает: ваше слово в строке должно предшествовать «начала строки» ^ ИЛИ двоеточие :, ваше регулярное выражение теперь может соответствовать строкам вроде: 'Hello:World:Perl:Script'; (возможно, это было реальное намерение).

Такая строка может быть затем рассекают в время цикла:

$hash{ $1 }++ while $str =~ /[:^](\w+)/g; 

Если вы печатаете захваченные ключи: print "@{[keys %hash]}"; результат будет: Perl Script Hello World (порядок ключей не определен).

Эти строки широко распространены в мире unix, например. переменные среды PATH, LD_LIBRARY_PATH, а также файл /etc/passwd выглядит так.

BTW, это только идея - ЕСЛИ ваша опечатка на самом деле не одна ;-)

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