Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays perl中$arr[0]和@arr[0]之间有什么区别?_Arrays_Perl - Fatal编程技术网

Arrays perl中$arr[0]和@arr[0]之间有什么区别?

Arrays perl中$arr[0]和@arr[0]之间有什么区别?,arrays,perl,Arrays,Perl,我有这样的perl编码 @arr = qw(1 2 3 4); print $arr[0],"\n"; print @arr[0],"\n"; 两个输出的答案都是1,那么区别是什么? 内存存储有什么不同吗?将@符号与数组元素一起使用是与单个元素列表一起使用。如果启用“使用警告”,它将告诉您: 标量值@arr[0]最好在foo.pl行709处写成$arr[0] 如果您还使用诊断,它将解释很多内容 在foo.pl第709行(#1)处,标量值@arr[0]最好写为$arr[0] (W语法)您使用了

我有这样的perl编码

@arr = qw(1 2 3 4);

print $arr[0],"\n";
print @arr[0],"\n";
两个输出的答案都是1,那么区别是什么?
内存存储有什么不同吗?

@
符号与数组元素一起使用是与单个元素列表一起使用。如果启用“使用警告”,它将告诉您:

标量值@arr[0]最好在foo.pl行709处写成$arr[0]

如果您还
使用诊断
,它将解释很多内容

在foo.pl第709行(#1)处,标量值@arr[0]最好写为$arr[0]

(W语法)您使用了数组切片(由@表示)来选择 数组的单个元素。一般来说,最好要求一个标量 值(以$表示)。区别在于$foo[&bar]总是 在赋值和求值时,其行为类似于标量 它的参数,而@foo[&bar]在指定给时的行为类似于列表 它,并为其下标提供一个列表上下文,这样做可能会很奇怪 如果您只希望有一个下标,则会出现问题

另一方面,如果你真的希望治疗这个阵列 元素作为列表,您需要了解引用是如何工作的,因为 Perl不会为您在标量和列表之间神奇地转换。 见perlref

所以一般来说,您应该使用变量调用返回的类型的符号。对于单个数组元素,这是标量,因此使用
$

使用
@
意味着它返回一个列表。数组本身返回一个列表,数组切片也返回一个列表。这里你用一个元素做了一个切片。这不是一个大问题,但也不是它的意图,这就是为什么Perl会警告您这一点

只需
使用警告
,同时
使用严格的
(并使用
my
声明变量),并始终使用正确的符号

不要将
use diagnostics
放入生产代码中,因为这会大大降低速度。如果你不明白警告,就用它


另请参见。

@
符号与数组元素一起使用是与单个元素列表一起使用。如果启用“使用警告”,它将告诉您:

标量值@arr[0]最好在foo.pl行709处写成$arr[0]

如果您还
使用诊断
,它将解释很多内容

在foo.pl第709行(#1)处,标量值@arr[0]最好写为$arr[0]

(W语法)您使用了数组切片(由@表示)来选择 数组的单个元素。一般来说,最好要求一个标量 值(以$表示)。区别在于$foo[&bar]总是 在赋值和求值时,其行为类似于标量 它的参数,而@foo[&bar]在指定给时的行为类似于列表 它,并为其下标提供一个列表上下文,这样做可能会很奇怪 如果您只希望有一个下标,则会出现问题

另一方面,如果你真的希望治疗这个阵列 元素作为列表,您需要了解引用是如何工作的,因为 Perl不会为您在标量和列表之间神奇地转换。 见perlref

所以一般来说,您应该使用变量调用返回的类型的符号。对于单个数组元素,这是标量,因此使用
$

使用
@
意味着它返回一个列表。数组本身返回一个列表,数组切片也返回一个列表。这里你用一个元素做了一个切片。这不是一个大问题,但也不是它的意图,这就是为什么Perl会警告您这一点

只需
使用警告
,同时
使用严格的
(并使用
my
声明变量),并始终使用正确的符号

不要将
use diagnostics
放入生产代码中,因为这会大大降低速度。如果你不明白警告,就用它


另请参见。

$arr[0]
是一个单标量,
@arr[0]
是一个单标量列表。
$arr[0]
是一个单标量,
@arr[0]
是一个单标量列表。它真的“老式”吗?这就是Perl的老版本的工作原理吗?在我使用Perl的二十年中,它总是错的:-)@dave我认为你是对的。我想,它只是没有对此发出警告。我正试图找到一些相关的参考资料,因为我认为这可能是Perl 4遗留下来的,但很难找到任何这么旧的文档。@dave我认为这会让它更清楚。这本身并没有错,只是另一回事:)它真的“过时”吗?这就是Perl的老版本的工作原理吗?在我使用Perl的二十年中,它总是错的:-)@dave我认为你是对的。我想,它只是没有对此发出警告。我正试图找到一些相关的参考资料,因为我认为这可能是Perl 4遗留下来的,但很难找到任何这么旧的文档。@dave我认为这会让它更清楚。这本身并没有错,只是另一回事:)