当你尝试使用Perl打印数组或哈希时,它是什么意思,你得到,数组(0xd3888)?

Luk*_*uke 13 arrays perl hash

当您尝试打印数组或散列并且看到以下内容时,这意味着什么; 数组(0xd3888)或HASH(0xd3978)?

my @data = (  
['1_TEST','1_T','1_TESTER'],  
['2_TEST','2_T','2_TESTER'],  
['3_TEST','3_T','3_TESTER'],  
['4_TEST','4_T','4_TESTER'],  
['5_TEST','5_T','5_TESTER'],  
['6_TEST','6_T','^_TESTER']  
);  

foreach my $line (@data) {  
   chomp($line);  
   @random = split(/\|/,$line);  
   print "".$random[0]."".$random[1]."".$random[2]."","\n";  
}  
Run Code Online (Sandbox Code Playgroud)

结果

ARRAY(0xc1864)  
ARRAY(0xd384c)  
ARRAY(0xd3894)  
ARRAY(0xd38d0)  
ARRAY(0xd390c)  
ARRAY(0xd3948)  
Run Code Online (Sandbox Code Playgroud)

Zai*_*aid 18

很难说你是否意味着它,但你获得数组引用的原因是因为你没有打印你认为自己的东西.

你在迭代''行'时开始正确@data:

foreach my $line (@data) { ... }
Run Code Online (Sandbox Code Playgroud)

但是,下一行是禁止的.您似乎将文本字符串与数组结构混淆.是的,每行包含字符串,但Perl将其@data视为数组,而不是字符串.

split用于将字符串转换为数组.它不能在阵列上运行!同样如此chomp(有一个无关的例外).

你要做的是用以下内容替换foreach循环的内容:

foreach my $line (@data) {

    print $line->[0].", ".$line->[1].", ".$line->[2]."\n";
}
Run Code Online (Sandbox Code Playgroud)

你会注意到->符号,这是有原因的.$line指的是一个数组.它本身不是一个数组.的->箭头顺从阵列,允许访问由引用的数组的单个元素$line.

如果您对使用箭头进行引用的想法不满意(并且大多数初学者通常不这样做),您可以创建一个临时数组,如下所示,然后使用它.

foreach my $line (@data) {

    my @random = @{ $line };
    print $random[0].", ".$random[1].", ".$random[2]."\n";
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

1_TEST, 1_T, 1_TESTER
2_TEST, 2_T, 2_TESTER
3_TEST, 3_T, 3_TESTER
4_TEST, 4_T, 4_TESTER
5_TEST, 5_T, 5_TESTER
6_TEST, 6_T, ^_TESTER
Run Code Online (Sandbox Code Playgroud)

单行可能会有类似的东西print "@$_\n" for @data;(有点OTT),但是如果你想打印数组以查看它的样子(比如说,出于调试目的),我建议使用这个Data::Dump模块,为您打印阵列和哈希,而不必担心它太多.

只需放在use Data::Dump 'dump';脚本的开头,然后dump @data;.就如此容易!


Jon*_*ler 4

这意味着你没有数组;你有一个数组的引用。

请注意,数组是用圆括号指定的 - 作为列表;当您使用方括号表示法时,您正在创建对数组的引用。

foreach my $line (@data)
{
    my @array = @$line;
    print "$array[0] - $array[1] - $array[2]\n";
}
Run Code Online (Sandbox Code Playgroud)

说明差异:

my @data = (
['1_TEST','1_T','1_TESTER'],
['2_TEST','2_T','2_TESTER'],
['3_TEST','3_T','3_TESTER'],
['4_TEST','4_T','4_TESTER'],
['5_TEST','5_T','5_TESTER'],
['6_TEST','6_T','^_TESTER']
);

# Original print loop
foreach my $line (@data)
{
    chomp($line);
    @random = split(/\|/,$line);
    print "".$random[0]."".$random[1]."".$random[2]."","\n";
}

# Revised print loop
foreach my $line (@data)
{
    my @array = @$line;
    print "$array[0] - $array[1] - $array[2]\n";
}
Run Code Online (Sandbox Code Playgroud)

输出

ARRAY(0x62c0f8)
ARRAY(0x649db8)
ARRAY(0x649980)
ARRAY(0x649e48)
ARRAY(0x649ec0)
ARRAY(0x649f38)
1_TEST - 1_T - 1_TESTER
2_TEST - 2_T - 2_TESTER
3_TEST - 3_T - 3_TESTER
4_TEST - 4_T - 4_TESTER
5_TEST - 5_T - 5_TESTER
6_TEST - 6_T - ^_TESTER
Run Code Online (Sandbox Code Playgroud)

  • 您的数组内数组的示例没有任何意义。它们只会被压扁成一大团——这就是为什么你必须使用参考文献。 (3认同)