perl – 了解推送到哈希和|| = []构造. (在样板中生成.t)

前端之家收集整理的这篇文章主要介绍了perl – 了解推送到哈希和|| = []构造. (在样板中生成.t)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在重新熟悉Perl,并且刚刚使用模块启动程序来初始化一个新项目.我现在正试图理解生成代码.一切都很好,除了以下指示:
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}||=[]},$.;
        }
    }
  }
  ...
}

我有两个问题:

> || = [].这是|后跟| =,或者这是一个还是||然后是a = [].有人能跟我说说这里发生的事吗? (我猜测“如果散列是空的,则创建一个空的匿名数组来初始化散列”,但我很难看到它是如何从代码中形成的.)
>推@ {$违反{$desc}},$.我理解这意味着“将行号分配给密钥$desc以防止违反哈希值.但是从我读过的代码中,”查找$vioc {$desc}的密钥desc的值($violated {$desc然后使用此值作为数组的符号引用(@ {$value}部分),然后将行号推送到该数组“.我不知道如何协调这两个视图.

我认为在这行代码中我有很多东西需要学习 – 有人可以通过它来帮助我吗?

解决方法

> || =:这是一个赋值运算符.例
$a ||= $b;
# corresponds to
$a = $a || $b;

见男人perlop.在你的例子中

$a ||= [];
# corresponds to
$a = $a || [];

即:如果左操作数被定义为空,否则分配一个空数组引用
>%违反包含每个值的数组引用.你可以这样看:

my $array_ref = $violated{$desc};
push @{array_ref},$.;

写得更详细:

if (! $violated{$desc} ) {
      $violated{$desc} = [];
  }
  my $array_ref = $violated{$desc};
  push @{ $array_ref },$.;

编辑

数组和数组引用

>一个用()构造的数组,包含一个动态有序的元素列表(在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

要访问数组引用,您需要取消引用它:

@{ $array_ref };

my @array = @{ $array_ref }; # is valid

您可以将{$array_ref}作为数组访问

${ $array_ref }[0]

现在回到你在评论中的问题:%violated是一个带有以下键值对的哈希:一个字符串($desc)和一个数组引用

猜你在找的Perl相关文章