Tom*_*Tom 6 perl hashtable operators
我正在重新熟悉Perl,并且刚刚用来module-starter
初始化一个新项目.我现在正试图理解生成的代码.一切都很好,除了以下指示:
sub not_in_file_ok {
my ($filename, %regex) = @_;
open( my $fh, '<', $filename )
or die "couldn't open $filename for reading: $!";
my %violated;
while (my $line = <$fh>) {
while (my ($desc, $regex) = each %regex) {
if ($line =~ $regex) {
##I'm having problems here
push @{$violated{$desc}||=[]}, $.;
}
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
||=[]
.这是|
其次|=
,还是这一个或||
后跟=[]
.有人能跟我说说这里发生的事吗?(我猜测"如果散列是空的,则创建一个空的匿名数组来初始化散列",但我很难看到它是如何从代码中形成的.)push @{$violated{$desc}}, $.
我明白这意味着"的行号分配给该键$desc
的散列%violated
,但是从I读取,代码"查找密钥的值desc
的 $violated{$desc}
(在$violated{$desc}
部分),然后使用该值作为符号引用到一个数组(该@{$value}
部分),然后将行号推送到该数组".我不知道如何协调这两个视图.我认为在这行代码中我有很多东西需要学习 - 有人可以通过它来帮助我吗?
||=
:这是一个赋值运算符.例
$a ||= $b;
# corresponds to
$a = $a || $b;
Run Code Online (Sandbox Code Playgroud)
看man perlop
.在你的例子中
$a ||= [];
# corresponds to
$a = $a || [];
Run Code Online (Sandbox Code Playgroud)
即:如果左操作数被定义为空,否则分配一个空数组引用
%violated
包含每个值的数组引用.你可以这样看:
my $array_ref = $violated{$desc};
push @{array_ref}, $.;
Run Code Online (Sandbox Code Playgroud)写得更详细:
if (! $violated{$desc} ) {
$violated{$desc} = [];
}
my $array_ref = $violated{$desc};
push @{ $array_ref }, $.;
Run Code Online (Sandbox Code Playgroud)
编辑
数组和数组引用
用数组构造()
并包含动态有序元素列表的数组(在Perl数组中可以动态增长)
数组引用是对数组的引用(或多或少是没有指针运算的指针).您可以使用创建和数组引用[]
例
my @a = ( 1, 2, 3);
# $a[0] will contain 1
my $array_ref = [ 10, 11, 12 ];
# array_ref is a _pointer_ to an array containing 10, 11 and 12
Run Code Online (Sandbox Code Playgroud)
要访问数组引用,您需要取消引用它:
@{ $array_ref };
my @array = @{ $array_ref }; # is valid
Run Code Online (Sandbox Code Playgroud)
您可以{ $array_ref}
作为数组访问
${ $array_ref }[0]
Run Code Online (Sandbox Code Playgroud)
现在回到你在评论中的问题:%violated
是一个带有以下键值对的哈希:一个字符串($ desc)和一个数组引用