Как напечатать один массив многомерного массива в Perl? - PullRequest
3 голосов
/ 02 марта 2010
#!usr/bin/perl
@array = ();
open(myfile,"sometext.txt");
while(<myfile>)
{
    chomp;
    push(@array,[split(" ")]);
}
close(myfile);
print @array[0];

Вместо того, чтобы печатать элементы первого массива в этом многомерном массиве, он выводит ссылку на шестнадцатеричный (?) Указатель. Если кто-нибудь знает, как я могу напечатать этот массив, пожалуйста, напишите, как это сделать, и он будет очень признателен.

Ответы [ 4 ]

11 голосов
/ 02 марта 2010

Вы должны использовать strict и warnings. Последний сказал бы вам, что доступ к первому ряду - $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;
4 голосов
/ 02 марта 2010

Perl не делает именно то, что вы хотите в этом случае. Вам нужно явно указать Perl, как распечатать ваш массив.

Попробуйте это:

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

Или это:

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

Или это:

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

Вот ваш пример кода, немного переписанный для дополнительной проверки ошибок и включения строгих и предупреждений . Когда они включены, 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";
}
3 голосов
/ 02 марта 2010

Я удивлен, что никто еще не упомянул об этом, но стандартный способ печати сложных данных - Data::Dumper.

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

Вы также можете сделать:

print Dumper( @array );

Конечно, вы не можете победить легкость Smart::Comments, все, что вам нужно сделать, это создать комментарий, используя три начальных хэша:

use Smart::Comments;
#...
### @array
3 голосов
/ 02 марта 2010

Вот, пожалуйста.

Многомерные массивы Perl - это действительно массивы ссылок на массивы. В Perl ссылка - это просто скалярная переменная. Итак, когда вы пытаетесь распечатать весь массив, он печатает только эту ссылку. Вам нужно использовать @ {} для изменения контекста скаляра на массив.

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