不寻常的Perl语法

czc*_*ong 13 perl

我必须修改Perl脚本,这是我第一次尝试理解Perl.我看到以下内容:

my %trades;
...
foreach my $row (@$rows) {
  @{$trades{pop @$row}} = @$row;
}
Run Code Online (Sandbox Code Playgroud)

我对此感到困惑,因为看起来我们正在弹出数组中的最后一项,@$row并将哈希键设置%trades为弹出的项并将值设置为@$row.

这种理解是否正确?

amo*_*mon 26

要理解这段代码,我们需要清楚三件事:

您的代码一起等同于:

foreach my $row (@$rows) {
  my @copy = @$row;
  my $key = pop @$row;
  @{ $trades{$key} } = @copy;
}
Run Code Online (Sandbox Code Playgroud)

(同时保留我能看到的所有副作用)

所以举个例子

$rows = [
  [1, 2, "keyA"],
  [3, 4, "keyB"],
];
Run Code Online (Sandbox Code Playgroud)

会创造

%trades = (
  keyA => [1, 2, "keyA"],
  keyB => [3, 4, "keyB"],
);
$rows = [
  [1, 2],
  [3, 4],
];
Run Code Online (Sandbox Code Playgroud)

无论谁写了这一行,都对评估顺序有非常准确的了解,并且喜欢折磨维护程序员.

  • 编写该代码的人可能知道Perl,但对良好的软件开发实践知之甚少.而众多白痴中的一个给Perl带来了如此可怕的声誉,以至于大多数公司拒绝使用它. (6认同)
  • 具体来说,它似乎是用'@ rows`中的每一行填充`%trades`,其中每个条目的键是该行的最后一列的值. (2认同)
  • 我认为作者更希望将每个数组的最后一个元素用作其余元素的关键,并且不期望`pop`不会删除该键.就目前而言,作业更好地写成`@ {$ trades {$ row - > [ - 1]}} = @ $ row`和`pop`是多余的,只不过它改变了`$ rows`中的东西. (2认同)