需要帮助来解释这个perl代码

时间:2015-12-31 00:39:10

标签: perl

我很难绕过这一小段代码

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

我可以获得一些解密信息吗?

3 个答案:

答案 0 :(得分:5)

让我们像这样重写它

my $ref =

外部@{ ... }是一项任务。我认为这很清楚

然后\ 取消引用大括号的内容作为数组,my $ref = $seq->{ $label }{ $ARGV[4] } 然后引用它。引用取消了取消引用,因此相同

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

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

  

不是ARRAY参考

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

现在我们有了

$seq

使用$label作为散列哈希的引用,并使用$ARGV[4]作为第一级密钥,使用$ARGV[4](第五个命令行参数)作为第二个 - 级别密钥

那句话是由一个我慷慨地称之为穷人程序员的人写的。我怀疑它是否打算检查哈希值是否为数组引用,并且至少应将Unpacking openjdk-7-jre-headless:amd64 (7u51-2.4.6-1ubuntu4) ... 复制到命名变量以使其含义清晰

答案 1 :(得分:2)

  • $seq->{$label}是哈希引用
  • $label返回解除引用哈希中$ARGV[4]键的值
  • 该值是另一个哈希值,我们从中获取@ARGV键的值
    • $ARGV[4]是命令行参数数组,@{...}是索引4处的元素
  • 所有这些都返回一个数组引用,该引用由$ARGV[4]
  • 取消引用
  • 在前面添加反斜杠会将其转回数组引用

总结:它是对数组的引用,它是$seq->{$label}返回的哈希中my $ref = $seq->{$label}{$ARGV[4]}; 键的值,整个事情可能会被写入

\@{$ref}

有关$ref和{{1}}之间的区别,请参阅Borodin's answer

答案 2 :(得分:1)

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

最好从内到外为工作顺序工作:

  1. $ARGV[4]:通过命令行传入的第五个参数(例如./perlscript.pl "argument1" "argument2" "argument3" "argument4" "argument5.txt"
  2. $seq->{ $label }{ $ARGV[4]}:这是一个数组的引用,我们知道这一点,因为当你试图通过将它包装在@{ ... }中来取消引用它时,你会收到一条警告说 Not a ARRAY参考。此外,您也可以使用裸字符串(例如$seq->{ 'some label' }{ 'some other label'}
  3. 代替变量
  4. @{ $seq->{ $label }{ $ARGV[4] } }:这正在进行解除引用,如#3
  5. 中所述
  6. \@{ $seq->{ $label }{ $ARGV[4] } }:斜杠再次使它成为引用,澄清数组引用是在哈希中保存
  7. my $ref = \@{ $seq->{ $label }{ $ARGV[4] } };:您的标准变量作业
  8. 我们还没有看到很多其他代码,所以很难说这可能需要更新多少。通常你会想要清理你的输入,以确保没有传入坏的或非常大的数据。另外,你想要使它更有意义。 $seq可能是序列或其他任何内容,$label不太可识别,并且正如您所做的那样使用任何$ARGV,通常意味着其他地方没有做其他事情。