我必须修改Perl脚本,这是我第一次尝试理解Perl.我看到以下内容:
my %trades;
...
foreach my $row (@$rows) {
@{$trades{pop @$row}} = @$row;
}
Run Code Online (Sandbox Code Playgroud)
我对此感到困惑,因为看起来我们正在弹出数组中的最后一项,@$row并将哈希键设置%trades为弹出的项并将值设置为@$row.
这种理解是否正确?
amo*_*mon 26
要理解这段代码,我们需要清楚三件事:
评估顺序:
EXPR_A = EXPR_B
Run Code Online (Sandbox Code Playgroud)
在评估EXPR_B之前评估EXPR_A.
复制语义:
@new_array = @old_array
Run Code Online (Sandbox Code Playgroud)
将@old_arrayover 的值复制到@new_array.
解除对复杂数据结构的引用:
@{ $trades{$key} }
Run Code Online (Sandbox Code Playgroud)
访问叫做入口$key在%trades散列,并且将其视为数组引用.
您的代码一起等同于:
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)
无论谁写了这一行,都对评估顺序有非常准确的了解,并且喜欢折磨维护程序员.