这个Perl语法是什么意思?

时间:2014-10-14 01:13:17

标签: perl syntax map split

我在一个非常庞大的perl程序中有一行代码,我不明白。

map {$cycle{$_}=1} split(/\s*,\s*/,$cycle);

$ cycle是一个字符串,并且在此行上方声明了我的%周期。我得到了"分裂" part将字符串分隔成它的元素,但是第二部分中的s和斜线是什么,我根本不理解上半部分。 前半部分是真正令人困惑的部分,该分裂字符串的所有元素会发生什么? 我之前从未使用过Perl。感谢您提供的任何解释

2 个答案:

答案 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}}

perlre