我有以下代码:
@a = ((1,2,3),("test","hello"));
print @a[1]
Run Code Online (Sandbox Code Playgroud)
我期待它打印
testhello
Run Code Online (Sandbox Code Playgroud)
但它给了我2.
抱歉新手问题(Perl对我来说有点不自然),但为什么会发生这种情况,我怎样才能得到我想要的结果呢?
Perl构造的方式@a是等同于你的写作,
@a = (1,2,3,"test","hello");
Run Code Online (Sandbox Code Playgroud)
这就是为什么当你1通过写作@a[1](真的应该是$a[1])要求索引的价值时,你得到了2.为了证明这一点,如果你要做以下事情,
use strict;
use warnings;
my @a = ((1,2,3), ("test","hello"));
my @b = (1,2,3,"test","hello");
print "@a\n";
print "@b\n";
Run Code Online (Sandbox Code Playgroud)
两者都打印相同的行,
1 2 3 test hello
1 2 3 test hello
Run Code Online (Sandbox Code Playgroud)
你想要的是在你的数组中创建匿名数组 - 像这样,
my @c = ([1,2,3], ["test","hello"]);
Run Code Online (Sandbox Code Playgroud)
如果你写下面的,
use Data::Dumper;
print Dumper $c[1];
Run Code Online (Sandbox Code Playgroud)
你会看到这个打印,
$VAR1 = [
          'test',
          'hello'
        ];
Run Code Online (Sandbox Code Playgroud)
        Perl列表仅为一维,表示(1,2,(3,4))自动展平为(1,2,3,4).如果需要多维数组,则必须使用超出第一个维度的任何维度的引用(存储在标量中).
您可以使用括号表示法获取任何匿名数组引用,[1,2,3,4]或使用反斜杠引用现有数组my $ref = \@somearray.
所以构造如是my $aref = [1,2,[3,4]]一个数组引用,其中引用数组的第一个元素是1,第二个元素是2,第三个元素是另一个数组引用.
(我发现在使用多维数组时,即使对于第一个维度使用引用也不那么令人困惑,但my @array = (1,2,[3,4])也很好.)
顺便说一句,当你对perl引用进行字符串化时,会得到一些指示引用类型和内存位置的乱码,例如"ARRAY(0x7f977b02ac58)".
取消引用数组的数组引用@,或者获取引用的特定元素->.
例:
my $ref = ['A','B',['C','D']];
print $ref;                   # prints ARRAY(0x001)
print join ',', @{$ref};      # prints A,B,ARRAY(0x002)
print join ',', @$ref;        # prints A,B,ARRAY(0x002) (shortcut for above)
print $ref->[0];              # prints A
print $ref->[1];              # prints B
print $ref->[2];              # prints ARRAY(0x002)
print $ref->[2]->[0];         # prints C
print $ref->[2][0];           # prints C (shortcut for above)
print $ref->[2][1]            # prints D
print join ',', @{$ref->[2]}; # prints C,D
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5288 次  |  
        
|   最近记录:  |