Вы сказали:
'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, это только идея - ЕСЛИ ваша опечатка на самом деле не одна ;-)