如何在Perl中打印一个多维数组中的一个数组?

3
#!usr/bin/perl
@array = ();
open(myfile,"sometext.txt");
while(<myfile>)
{
    chomp;
    push(@array,[split(" ")]);
}
close(myfile);
print @array[0];

在这个多维数组中,打印第一个数组的元素时,它输出了十六进制的指针引用。如果有人知道如何打印此数组,请发帖说明,将不胜感激。

4个回答

10

你应该使用strictwarnings。后者会告诉你访问第一行的方式是$array[0]。现在,该值是一个匿名数组的引用,你需要对其进行解引用:print "@{ $array[0] }\n";

#!/usr/bin/perl

use strict; use warnings;

my @array;

my $input_file = 'sometext.txt';

open my $input, '<', $input_file
    or die "Cannot open '$input_file': $!";

while(<$input>) {
    chomp;
    push @array, [ split ];
}

close $input;

print "@$_\n" for @array;

4

在这种情况下,Perl不能完全按照您的要求执行。您需要明确告诉Perl如何打印出您的数组。

尝试这样做:

use Data::Dumper;
print Dumper( $array[0] );

或者是这样的:
foreach my $element ( @{ $array[0] } ) {
    print $element, "\n";
}

或者是这个:
print join ' ', @{ $array[0] };
print "\n";

这是您的示例代码,稍作修改以进行更多的错误检查,并开启 strict warnings 。当这些被打开时,Perl将进行更多的检查并限制您使用更安全的语言子集。
#!/usr/bin/perl

use strict;
use warnings; 

my @arrays;
my $fn = 'summary.txt';
open FILE, "<$fn" or die "Error opening file ($!)";

while( my $line = <FILE> ) {
    chomp $line;
    my @data = split ' ', $line;
    push @arrays, \@data;
}
close FILE or die $!;

# print out comma-separated arrays, one per line
foreach my $array (@arrays) {
    print join ",", @$array;
    print "\n";
}

@James Thompson,“split /\s+/”和“split ' '”是不同的。 - Sinan Ünür

3

请看这里。

Perl的多维数组实际上是对数组引用的数组。在Perl中,引用只是一个标量变量。因此,当您尝试打印整个数组时,它仅打印该引用。您需要使用@{}将标量的上下文更改为数组。

#!/usr/bin/perl
@array = ();
open(myfile,"sometext.txt");
while(<myfile>)
{
    chomp;
    push(@array,[split(" ")]);
}
close(myfile);
print @{@array[0]};

@Vlad:不是真正的数组的数组,而是数组引用的数组。另外,你的shebang行很可能是错误的。 - Sinan Ünür
原始帖子中就是这样写的 shebang 行。 - James Thompson
3
不对,*nix 系统中的完整路径都以 "/" 开始,因此正确的 shebang 应该是 #!/usr/bin/perl - ghostdog74
Shebang 行有误。我只是简单地复制粘贴了原始代码,没有注意到第一行。 - Vlad
@{array[0]} 行有什么问题?这是强制上下文的完全有效的方式。 - Vlad

3
我很惊讶还没有人提到,但打印复杂数据的标准方法是使用Data::Dumper
use Data::Dumper;
#...
print Dumper( $array[0] );

您也可以这样做:
print Dumper( @array );

当然,你无法击败使用Smart::Comments的易用性,你只需要创建一个带有三个初始哈希符号的注释即可。
use Smart::Comments;
#...
### @array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接