我很难理解这段小代码片段:
my $ref = \@{$seq->{$label}{$ARGV[4]}};
我可以得到一些帮助来破译这个吗?
让我们像这样重写它
my $ref = \@{
$seq->{ $label }{ $ARGV[4] }
}
外面的
my $ref =
是一个作业。我想这已经很清楚了
然后
@{ ... }
取消引用 将大括号的内容作为数组,然后 \
对其进行引用。引用取消了取消引用,因此它与相同
my $ref = $seq->{ $label }{ $ARGV[4] }
除了取消引用会导致程序死掉
不是数组引用如果内容不是对数组的引用
现在我们有了
$seq->{ $label }{ $ARGV[4] }
它使用
$seq
作为哈希值的引用,并使用
$label
作为第一级键,
$ARGV[4]
(第五个命令行参数)作为第二级键该声明是由一个我会慷慨地称为“可怜的程序员”的人写的。我怀疑它是否旨在检查哈希值是否是数组引用,并且至少应该将
$ARGV[4]
复制到命名变量以使含义清晰
$seq
是哈希引用
$seq->{$label}
返回解引用哈希中
$label
键的值
$ARGV[4]
键的值
@ARGV
是命令行参数数组,
$ARGV[4]
是索引 4 处的元素
@{...}
取消引用
$ARGV[4]
返回的哈希中
$seq->{$label}
键的值,恕我直言,整个事情可以写成
my $ref = $seq->{$label}{$ARGV[4]};
参见
Borodin 的回答,了解 \@{$ref}
和
$ref
之间的区别。
my $ref = \@{$seq->{$label}{$ARGV[4]}};
操作顺序最好从内到外进行:
$ARGV[4]
:通过命令行传入的第五个参数(例如,
./perlscript.pl "argument1" "argument2" "argument3" "argument4" "argument5.txt"
)
$seq->{ $label }{ $ARGV[4]}
:这保存了对数组的引用,我们知道这一点,因为当您尝试通过将其包装在
@{ ... }
中来取消引用它时,您会收到一条警告,指出“不是数组引用”。此外,您还可以使用裸字符串代替变量(例如,
$seq->{ 'some label' }{ 'some other label'}
)
@{ $seq->{ $label }{ $ARGV[4] } }
\@{ $seq->{ $label }{ $ARGV[4] } }
my $ref = \@{ $seq->{ $label }{ $ARGV[4] } };
$seq
$label
不太容易识别,并且像您所做的那样使用任何
$ARGV
,通常意味着其他地方没有做其他事情。