可以使用变量来命名数组吗?
例如:
my $input1="AAA";
my $input2="BBB";
my @{$input1};
my @{$input2};
因为$input1=AAA
.
我想创建一个数组它的名字取决于$input1
的值
最后它将创建数组@AAA
和@BBB
。
这可行吗?
需要一个"符号引用"这是一个大禁忌,有充分的理由(也可以在perlfaq7中看到,例如在本页中)。这是一个危险的古老的"特征"。它只在非常特殊的情况下使用。
使用散列
my %h = ( $input1 => $arrayref1, $input2 => $arrayref2 );
$arrayref
要么是对命名数组@ary
的引用,要么是对匿名数组[LIST]
的引用。查看如何在perlreftut中创建它们,以及教程的其余部分如何使用它们。
所以现在当你需要一个数组的名字存储在一个变量中,它是$h{$input1}
,或$h{AAA}
(如果这是$input1
的值),返回数组引用,可以取消引用访问/添加元素。参见链接的perlreftut
。
请注意,arrayref的给定方式有很大的不同。如果它是对命名数组的引用,那么该数组的任何更改都会反映在我们从哈希中得到的结果中(反之亦然)
use warnings;
use strict;
use feature 'say';
my $in1 = 'A';
my @ary = 5..7;
my %h = ( $in1 => @ary );
say $h{$in1}->[0]; #--> 5
$ary[0] = 2;
say $h{$in1}->[0]; #--> 2
$h{$in1}->[-1] = 9;
say "@ary"; #--> 2 6 9
如果我们使用一个匿名数组$in1 => [ LIST ]
,那么我们得到一个不能被修改的副本,除非直接写到$h{$in1}
(除非LIST
本身包含引用)。
如果LIST
有引用,那么对于一个独立的副本,需要一个"深度拷贝"。