在Perl中,@ array [1]和$ array [1]之间有什么区别?

cap*_*ser 8 arrays perl

我一直在研究阵列切片,坦率地说,没有看到选择@array[1]和之间的区别$array[1].有区别吗?

#!/usr/bin/perl 
@array = (1,3);
print "\nPrinting out full array..\@array\n";
print "@array\n";
print "\n";
print "Printing out \@array[1]\n";
print "@array[1]\n";
print "Printing out \$array[1]\n";
print "$array[1]\n";
print "\n\n";
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 12

这是一个FAQ.

在许多情况下,这两种形式可能会以相同的方式工作(但不是全部,正如您在FAQ中的示例中所看到的那样),但$array[1]更清楚地表达了意图.


Mar*_*lis 11

$@被称为印记:听到什么印记告诉你

当你看到$你正在处理一件事.当你看到@你有一系列的东西.

@array[ 1 ]是一个切片,列表中包含选定元素的@array列表.你只在这个切片中放了一个元素,第二个元素@array,但无论如何它都是一个列表.

$array[ 1 ] 是列表的第二个元素,单个值,标量.

@hash{ 'one', 'two' }是另一种切片:这次我们切片哈希(%hash),获得一个列表,其中的值对应于键onetwo.

差异在哪里?虽然差异很小,但是当您需要单个值时,应避免使用单个元素切片.请记住,在表达式的右侧,单个元素切片的行为类似于标量,但当它们位于表达式的左侧时,它们将成为列表赋值:它们为表达式提供列表上下文.

如果您对标量和列表上下文之间的区别感到不舒服,请不要使用单个元素切片以避免在某些情况下出现意外结果(例如使用行输入操作符时< >).

检查文档和快乐的Perl.

  • 此外,`使用warnings`将有助于避免由发光像警告使用单元素切片(运行OP的代码时)`标量值@array [1]更好写成$阵列[1]在-e线7.` (4认同)