我必须对Perl脚本进行修改,这是我第一次理解Perl的尝试.我看到以下内容:
my %trades; ... foreach my $row (@$rows) { @{$trades{pop @$row}} = @$row; }
我感到困惑,因为看起来我们弹出数组@ $row中的最后一个项目,并将%trades的哈希键设置为弹出的项目,并将该值设置为@ $row.
这个理解正确吗?
解决方法
要了解这段代码,我们需要清楚三件事情:
>评估顺序:
EXPR_A = EXPR_B
在评估EXPR_A之前评估EXPR_B.
>复制语义:
@new_array = @old_array
将@old_array的值复制到@new_array.
>复制数据结构的解释:
@{ $trades{$key} }
在%trades哈希中访问名为$key的条目,并将其视为数组引用.
一起,您的代码相当于此:
foreach my $row (@$rows) { my @copy = @$row; my $key = pop @$row; @{ $trades{$key} } = @copy; }
(同时保留所有副作用我可以看到)
所以例如
$rows = [ [1,2,"keyA"],[3,4,"keyB"],];
会创造
%trades = ( keyA => [1,keyB => [3,); $rows = [ [1,2],4],];
谁写的这一行对评估顺序有非常精确的知识,并喜欢酷刑维护程序员.