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