【问题标题】:What does this Perl syntax mean?这个 Perl 语法是什么意思?
【发布时间】:2014-10-14 01:13:16
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以在 perl 的不同上下文中绑定一个名字,例如你可以有$cycle@cycle,和%cycle。在此示例中,必须在此 map 语句上方声明一个名为循环的散列。 (哈希用% sigil 声明)
  • 上面声明了一个哈希!我会添加一个提及这一点的编辑,谢谢。

标签: perl syntax map split


【解决方案1】:

这是对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;
}

如果你知道谁编写了原始代码,那么请给我一巴掌。

【讨论】:

  • 但是 %cycle 里面有什么元素可以对应呢?它包含的唯一一次是一行说我的 %cycle
  • 键和值在添加到散列中时会变得栩栩如生。您无需详细定义或描述哈希即可使用。
【解决方案2】:

split 的第一个参数是一个正则表达式,用于定义将要返回的项目分开的内容。它传统上作为匹配运算符提供给split

/.../

是匹配运算符。这是

的简写形式
m/.../

然而,

split /.../, ....

split m/.../, ....

实际上表现得像

split qr/.../, ....

qr/.../ 编译其中的正则表达式模式并以标量返回编译后的形式。

m//qr// 等运算符记录在 perlop 中。


作为一个正则表达式模式,

\s*,\s*

表示零个或多个空白字符 (\s*),后跟一个逗号,后跟零个或多个空白字符。

正则表达式记录在perlre


map 用于执行 foreach 循环。当它返回的值被忽略时

map BLOCK LIST

只是一种奇怪的写作方式

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);

map

【讨论】:

  • split 远远早于qr//
  • 或者为了避免循环,my @anon = split(/\s*,\s*/, $cycle); my %cycle; @cycle{@anon} = (1) x @anon;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2011-11-13
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多