为什么在Perl中连接数组会产生数字?

时间:2017-02-16 20:58:25

标签: arrays perl concatenation

我只是尝试在Perl中使用+运算符连接数组并得到奇怪的结果:

perl -wE 'say([1, 2, 3] + [4, 5, 6])'
73464360

对哈希执行相同操作似乎是语法错误:

perl -wE 'say({} + {})'
syntax error at -e line 1, near "} +"
Execution of -e aborted due to compilation errors.

第一个表达的结果是什么?是否记录在哪里?

2 个答案:

答案 0 :(得分:7)

它来自引用的数量,它产生引用的内存地址。

perl -E 'say \@a; say 0+\@a; printf "%x\n",0+\@a'

典型输出(尽管每次运行程序时都可能会改变)

ARRAY(0x1470518)
21431576
1470518      <--- same number as in first line

您的哈希引用示例几乎可以正常工作,但似乎Perl正在将第一组{}块解析为代码块而不是哈希引用。如果您使用一元+并强制Perl将其视为哈希引用,它将起作用。我的意思是“工作”。

perl -E 'say(+{} + {})'
40007168

答案 1 :(得分:3)

因为Perl中的+只是算术运算符。它迫使其论点被解释为数字,无论如何。这就是为什么Perl有一个单独的字符串连接运算符(.)。

有效的做法是添加存储数组的地址。

通过简单地列出数组,一个接一个地完成数组连接。但是,如果您使用对数组的引用([ ... ]),则必须先使用@{ ... }取消引用它们:

perl -wE 'say( @{[1,2,3]}, @{[4,5,6]} )'

但通常你会使用数组变量而不需要额外的语法。

perl -wE 'my @a = (1,2,3); my @b = (4,5,6); say join("-",@a,@b)'
#=> 1-2-3-4-5-6

哈希也是如此; my %c = (%a,%b);会合并%a%b的内容(按此顺序,以便%b的任何公共密钥的值都会覆盖%a的)进入新的哈希%c。您可以使用my $c = { %$a, %$b };对引用执行相同的操作。您在+尝试中遇到的一个问题是{}可能被解释为空代码块而不是空哈希。