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

而不是打印此多维数组中的第一个数组的元素,它会输出十六进制(?)指针引用。如果有人知道我可以如何打印这个数组,请张贴如何和它将不胜感激。如何在Perl中打印一个多维数组的数组?

回答

3

你在这里。

Perl的多维数组实际上是对数组的引用的数组。在perl中,引用仅仅是一个标量变量。所以,当你试图打印你的整个数组时,它只打印出那个参考。您需要使用@ {}将标量的上下文更改为数组。

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

@Vlad:不是真正的*数组*,而是**引用数组**。另外,你的榜单很可能是错误的。 – 2010-03-02 01:15:53

+0

shebang系列原文是这样写的。 – 2010-03-02 01:19:22

+3

还是错的。 * nix中的完整路径以“/”开头,因此shebang是'#!/ usr/bin/perl' – ghostdog74 2010-03-02 01:29:38

4

Perl在这种情况下并不完全符合您的要求。你需要明确告诉Perl如何打印出你的数组。

试试这个:

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

或者这样:

foreach my $element (@{ $array[0] }) { 
    print $element, "\n"; 
} 

或者这样:

print join ' ', @{ $array[0] }; 
print "\n"; 

这是你的示例代码,重新编写了一下做更多的错误检查,并打开strictwarnings。当这些功能打开时,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"; 
} 
+0

@James Thompson'split/\ s + /'和'split'''是不同的。 – 2010-03-02 01:11:41

11

您应该使用strictwarnings。后者会告诉你访问第一行的方式是$array[0]。现在,该值是对您推送到@array的匿名数组的引用。所以,你需要取消引用的是: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; 
3

我很惊讶,没有人没有提到这一点,但打印复杂数据的标准方法是Data::Dumper

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

你也可以这样做:

print Dumper(@array); 

当然,你不能击败方便的Smart::Comments,所有你需要做的就是利用 三个初始哈希创建评论:

use Smart::Comments; 
#... 
### @array