gpt4 book ai didi

Perl:为什么在访问数组中的特定元素时可以使用 @ 或 $?

转载 作者:行者123 更新时间:2023-12-01 07:09:15 25 4
gpt4 key购买 nike

我是 Perl 新手,一直没能找到满意的答案

my @foo = ("foo","bar")
print "@foo[0]"
foo
print "$foo[1]"
bar

不仅 @foo[0]按预期工作,但 $foo[1]也输出一个字符串。

为什么?甚至当 use strict已启用。

最佳答案

两者 @foo[0]$foo[1]是合法的 Perl 结构。
$foo[$n] ,或者更一般地说 $foo[EXPR] , 是标量元素,表示 $n -th(索引从 0 开始)数组元素 @foo (或任何 EXPR 评估为)。
@foo[LIST]是一个数组切片,@foo的元素集合由 LIST 中的索引指示.当LIST有一个元素,如 @foo[0] ,然后 @foo[LIST]是一个包含一个元素的列表。

虽然 @foo[1]是一个有效的表达方式,经验表明该结构通常使用不当,而此时更适合说 $foo[1] .因此,当启用警告并使用该构造时,会发出警告——而不是错误。
$foo[LIST]在 Perl 中也是一个有效的表达式。只是 Perl 会评估 LIST在标量上下文中并返回 @foo 的元素对应于该评估,而不是元素列表。

@foo = ("foo","bar","baz");
$foo[0] returns the scalar "foo"
@foo[1] returns the list ("bar") (and issues warning)
@foo[0,2] returns the list ("foo","baz")
$foo[0,2] returns "baz" ($foo[0,2] evaluates to $foo[2], and issues warning)
$foo[@foo] returns undef (evaluates to $foo[scalar @foo] => $foo[3])

转移:我能想出使用 @foo[SCALAR] 的唯一原因作为左值在某处区分标量/列表上下文。考虑
sub bar { wantarray ? (42,19) : 101 }
$foo[0] = bar();将分配值 101@foo 的第一个元素,但是 @foo[0] = bar()将分配值 42 .但即便如此,也不是说 ($foo[0]) = bar() 就无法完成的事情。 ,除非你打高尔夫球。

关于Perl:为什么在访问数组中的特定元素时可以使用 @ 或 $?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53731991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com