以下代码段有什么作用?
if ($str =~ /^:(\w+)/) {
$hash{$1} = 1;
}
它使用第一次成功捕获作为散列中的键。并且$str
必须包含一个或多个单词,但我不确定是什么^:
意思
^ 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
。这段代码的目的无疑是提取某些字符串并使用哈希对它们进行重复数据删除。
你说:
'并且 $str 必须包含一个或多个单词......'
我不确定这是否只是一个错字,或者您的意图是否与您的小示例不同。现在(根据您的帖子),您的正则表达式将匹配一个字符串,如::Hello
。在 Perl 中,这也可以写成
my %hash = ();
my $str = ':Hello';
$hash{ $1 }++ if $str =~ /^:(\w+)/;
现在,如果您将^:
正则表达式更改为[:^]
,这意味着:您的字符串中的单词应该以 ' start of string '^
或冒号开头:
,那么您的正则表达式现在可以匹配如下行:('Hello:World:Perl:Script';
也许这是真正的意图)。
然后可以在 while 循环中剖析这样的字符串:
$hash{ $1 }++ while $str =~ /[:^](\w+)/g;
如果您打印捕获的键:print "@{[keys %hash]}";
结果将是:(Perl Script Hello World
键的顺序未定义)。
这些类型的字符串在 unix 世界中很普遍,例如环境变量PATH
, LD_LIBRARY_PATH
,而且文件/etc/passwd
看起来也是这样。
顺便说一句,这只是一个想法——如果你的错字不是一个;-)
^:
表示行首的“:”符号。此外,它只会在之后捕获单个“单词”:
这意味着^
在行的开头:
例如:
$string = q~:Thats~;
$hash{Thats} = 1;
$string2 = q~Thats~;
该if
语句在 处成功$string
,但在 处失败,$string2
因为它不是以 开头:
。