这个Perl正则表达式做了什么?

时间:2013-07-04 07:49:26

标签: regex perl

以下代码段的作用是什么?

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

它使用第一次成功捕获作为哈希中的键。 $str必须包含一个或多个字词,但我不确定^:的含义

4 个答案:

答案 0 :(得分: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。毫无疑问,此代码的目的是提取某些字符串并使用哈希值对其进行重复数据删除。

答案 1 :(得分:0)

^:在行的开头表示“:”符号。此外,它仅会在:

之后捕获单个“字”

答案 2 :(得分:0)

这意味着^在第一行:

的开头

e.g:

$string = q~:Thats~;

$hash{Thats} = 1;

$string2 = q~Thats~;

if语句在$string处成功,但在$string2处失败,因为它不以:开头。

答案 3 :(得分:0)

你说:

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

我不确定这只是一个错字,还是你的意图与你的小例子不同。现在(根据你的帖子),你的正则表达式会匹配一个字符串,如::Hello。在Perl中,这可以像

一样编写
my %hash = ();
my $str = ':Hello';

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

现在,如果您将正则表达式中的^:更改为[:^],则表示:您的字符串中的单词前面应加上'字符串的开头'{ {1}}或冒号^,您的正则表达式现在可以匹配如下行::(也许这是真正的意图)。

然后可以在while循环中解析这样的字符串:

'Hello:World:Perl:Script';

如果您打印捕获的密钥:$hash{ $1 }++ while $str =~ /[:^](\w+)/g; 结果将是:print "@{[keys %hash]}";(键的顺序未定义)。

这些类型的字符串在unix世界中很普遍,例如环境变量Perl Script Hello WorldPATH以及文件LD_LIBRARY_PATH都是这样的。

顺便说一下,这只是一个想法 - 如果你的错字不是真的那个; - )