我在一个非常庞大的perl程序中有一行代码,我不明白。
map {$cycle{$_}=1} split(/\s*,\s*/,$cycle);
$ cycle是一个字符串,并且在此行上方声明了我的%周期。我得到了"分裂" part将字符串分隔成它的元素,但是第二部分中的s和斜线是什么,我根本不理解上半部分。 前半部分是真正令人困惑的部分,该分裂字符串的所有元素会发生什么? 我之前从未使用过Perl。感谢您提供的任何解释
答案 0 :(得分:4)
误导了map
。
添加一些空白,看起来像是
map {
$cycle{$_} = 1
} split /\s*,\s*/, $cycle;
因此,$cycle
在逗号中被分割,包括可能在其之前或之后的任何空格,并且%cycle
的相应元素对于split
中的每个项目都设置为1
应写成
$cycle{$_} = 1 for split /\s*,\s*/, $cycle;
或者
for ( split /\s*,\s*/, $cycle ) {
$cycle{$_} = 1;
}
如果你知道谁编写了原始代码,请给我们一个耳光。
答案 1 :(得分:2)
split
的第一个参数是一个正则表达式,用于定义要返回的项的分隔。它传统上作为匹配运算符提供给split
。
/.../
是匹配运算符。这是
的简短形式m/.../
然而,
split /.../, ....
和
split m/.../, ....
实际上表现为
split qr/.../, ....
qr/.../
编译正则表达式模式并以标量形式返回编译后的表单。
m//
中记录了包含qr//
和\s*,\s*
的运算符。
作为正则表达式模式,
\s*
表示零个或多个空格字符(map
),后跟逗号,后跟零个或多个空白字符。
正则表达式记录在perlop。
中 map BLOCK LIST
用于执行foreach循环。当它返回的值被忽略时
for (LIST) BLOCK
只是一种奇怪的写作方式
map { $cycle{$_} = 1 } split(/\s*,\s*/, $cycle);
所以
$cycle{$_} = 1 for split(/\s*,\s*/, $cycle);
与
相同for (split(/\s*,\s*/, $cycle)) {
$cycle{$_} = 1;
}
或
for my $val (split(/\s*,\s*/, $cycle)) {
$cycle{$val} = 1;
}
或
my %cycle = map { $_ => 1 } split(/\s*,\s*/, $cycle);
更合适地使用地图
my @anon;
for (split(/\s*,\s*/, $cycle)) {
push @anon, $_ => 1;
}
my %cycle = @anon;
相当于
my %cycle; ++$cycle{$_} for split(/\s*,\s*/, $cycle);
虽然以下效率更高:
{{1}}