Как распечатать один массив многомерного массива в Perl?

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

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


person lotsofsloths    schedule 02.03.2010    source источник


Ответы (4)


Ну вот.

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

#!/usr/bin/perl
@array = ();
open(myfile,"sometext.txt");
while(<myfile>)
{
    chomp;
    push(@array,[split(" ")]);
}
close(myfile);
print @{@array[0]};
person Community    schedule 02.03.2010
comment
@Vlad: На самом деле не массивы массивов, а массивы ссылок на массивы. Кроме того, ваша линия shebang, скорее всего, неверна. - person Sinan Ünür; 02.03.2010
comment
Строка shebang была написана так в исходном посте. - person James Thompson; 02.03.2010
comment
все равно это неправильно. полные пути в *nix начинаются с /, поэтому шебанг #!/usr/bin/perl - person ghostdog74; 02.03.2010
comment
Линия Shebang была неправильной. Я просто вырезал и вставил исходный код, не обращая внимания на первую строчку. - person Vlad; 02.03.2010
comment
Что не так со строкой @{array[0]}. Вполне допустимый способ форсировать контекст. - person Vlad; 04.03.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;
person Sinan Ünür    schedule 02.03.2010

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

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

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

Или это:

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

Или это:

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

Вот ваш пример кода, немного переписанный для дополнительной проверки ошибок и включения strict и предупреждения. Когда они включены, 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";
}
person James Thompson    schedule 02.03.2010
comment
@Джеймс Томпсон split /\s+/ и split ' ' разные. - person Sinan Ünür; 02.03.2010

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

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

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

print Dumper( @array );

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

use Smart::Comments;
#...
### @array
person Axeman    schedule 02.03.2010