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

첫 번째 배열의 요소를이 다차원 배열에 인쇄하는 대신 16 진수 (?) 포인터 참조를 출력합니다. 누구든지 내가이 어레이를 어떻게 인쇄 할 수 있는지 알고 있다면, 어떻게 게시하면 좋을까요?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 : 배열 * 배열은 아니지만 ** 배열 참조 ** 배열. 게다가, 당신은 그녀의 라인을 잘못 확률이 매우 높습니다. –

+0

원래의 게시물에 shebang 라인이 쓰여졌습니다. –

+3

여전히 잘못되었습니다. * nix의 전체 경로는 "/"로 시작하므로, Shebang은'#!/usr/bin/perl' – ghostdog74

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 ''은 다릅니다. –

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 
관련 문제