此代码片段中的取消引用是如何工作的?

问题描述 投票:0回答:3

我很难理解这段小代码片段:

my $ref = \@{$seq->{$label}{$ARGV[4]}};

我可以得到一些帮助来破译这个吗?

perl
3个回答
6
投票

让我们像这样重写它

my $ref = \@{

    $seq->{ $label }{ $ARGV[4] }

}

外面的

my $ref =
是一个作业。我想这已经很清楚了

然后

@{ ... }
取消引用 将大括号的内容作为数组,然后
\
对其进行引用。引用取消了取消引用,因此它与相同

my $ref = $seq->{ $label }{ $ARGV[4] }

除了取消引用会导致程序死掉

不是数组引用

如果内容不是对数组的引用

现在我们有了

$seq->{ $label }{ $ARGV[4] }

它使用

$seq

 作为哈希值的引用,并使用 
$label
 作为第一级键,
$ARGV[4]
(第五个命令行参数)作为第二级键

该声明是由一个我会慷慨地称为“可怜的程序员”的人写的。我怀疑它是否旨在检查哈希值是否是数组引用,并且至少应该将

$ARGV[4]

复制到命名变量以使含义清晰


3
投票
  • $seq
     是哈希引用
  • $seq->{$label}
     返回解引用哈希中 
    $label
     键的值
  • 该值是另一个哈希值,从中我们可以得到
  • $ARGV[4]
     键的值
    
    
    • @ARGV
       是命令行参数数组,
      $ARGV[4]
       是索引 4 处的元素
  • 所有这些都会返回一个数组引用,该引用由
  • @{...}
     取消引用
    
  • 在前面添加反斜杠会将其变回数组引用
总结:它是对数组的引用,该数组是

$ARGV[4]

 返回的哈希中 
$seq->{$label}
 键的值,恕我直言,整个事情可以写成

my $ref = $seq->{$label}{$ARGV[4]};

参见

Borodin 的回答,了解 \@{$ref}

$ref
 之间的区别。


1
投票
my $ref = \@{$seq->{$label}{$ARGV[4]}};

操作顺序最好从内到外进行:

  1. $ARGV[4]
     :通过命令行传入的第五个参数(例如,
    ./perlscript.pl "argument1" "argument2" "argument3" "argument4" "argument5.txt"
  2. $seq->{ $label }{ $ARGV[4]}
    :这保存了对数组的引用,我们知道这一点,因为当您尝试通过将其包装在
    @{ ... }
    中来取消引用它时,您会收到一条警告,指出“不是数组引用”。此外,您还可以使用裸字符串代替变量(例如,
    $seq->{ 'some label' }{ 'some other label'}
    @{ $seq->{ $label }{ $ARGV[4] } }
  3. :这是在取消引用,如#3
  4. 中所述
    \@{ $seq->{ $label }{ $ARGV[4] } }
  5. :斜杠再次使其成为引用,澄清数组引用被保存在哈希中
  6. my $ref = \@{ $seq->{ $label }{ $ARGV[4] } };
  7. :您的标准变量赋值
  8. 
    
  9. 我们还没有看到太多其他代码,所以很难说这可能需要更新多少。通常您会希望清理您的输入,以确保没有传入错误或极大的数据。此外,您还希望使其更有意义。
$seq
实际上可以是序列或任何东西,

$label

不太容易识别,并且像您所做的那样使用任何
$ARGV
,通常意味着其他地方没有做其他事情。

© www.soinside.com 2019 - 2024. All rights reserved.