2015-07-27 3 views
0

Я пытаюсь написать код, который позволит мне распечатать список массивов в Perl.Печать списка массивов в Perl?

У меня есть список массивов GPS координат под названием @points, отформатированный с массивами широты/долготы следующим образом:

@points = [34.2,17.5],[-64.1, 110.35],[54.8,77.1], and so on and so forth 

Я могу напечатать список сам по себе, используя print "$_\n" for @points;, однако это только дает мне ссылка на память для массива. Я знаю, что вы не можете просто печатать массивы, как строки или целые числа, однако я зациклен на том, как на самом деле перебирать список и печатать целые числа. Я попытался использовать цикл foreach и @_ для печати с каждым шагом, но это тоже не помогло. Если кто-то может дать мне какое-либо руководство по этому поводу, мы будем очень благодарны.

+0

Почему бы вам не использовать Data Dumper? – texasbruce

+0

Прежде всего потому, что я хочу знать, как сделать это сам, чтобы сделать себя лучшим программистом, но также потому, что этот код будет запущен как плагин для правительственного приложения, которое поддерживает только очень старую версию perl (don спросите, это не имеет никакого смысла), и в прошлом у меня были проблемы с использованием библиотек, не входящих в основной дистрибутив perl. – XeroG

+0

'say" @ $ _ "для @points;' –

ответ

0

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

В вашем примере - @points не 2d структуры, это список ссылок - поэтому, если вы печатаете его вы получите:

print "@points"; 

Дает:

ARRAY(0x4a6dec) ARRAY(0x4a6fb4) ARRAY(0x12fef64) 

Так вы необходимо разыменовать каждый из этих элементов. Существует несколько способов сделать это, но, по существу, @{$reference} - это то, как это работает.

Есть несколько способов выполнения этой задачи, но по существу:

foreach my $group (@points) { 
    print join ("\n", @$group),"\n"; 
} 

Например - присоединяйся в один итерация, Еогеасп это совсем другое. (Примечание - @$group и @{$group} означают то же самое, так что вам не нужны фигурные скобки Если вы пытаетесь сделать @ $ группы [1] вы бы это нужно, чтобы неоднозначность, были ли вы после @{$group[1]} или @{$group}[1].)

Или другой:

use feature qw (say); 
say for map { @$_ } @points; 

Это делает использование того факта, что map претендующего преобразования к каждому элементу @points, и что «трансформировать» просто «разыменования и дать мне элементы».

Конечно, тогда вы «разбили квартиру» @points и не сохранили свою взаимную связь.

+0

Это делается! Я знал, что я делаю ошибку где-то со ссылками, но я не понимал, что вам нужно явно разыменовать массив, чтобы затем использовать и манипулировать им. Большое спасибо за ваш ответ! – XeroG

1

Необходимо использовать знак @{ ... }dereference ссылки на ваш массив.Это даст вам простой массив, который вы можете распечатать прямо или манипулировать с join встроенной командой, чтобы получить более форматированный вывод:

use strict; 
use warnings; 

my @points = ([34.2,17.5],[-64.1, 110.35],[54.8,77.1]); 
print join(',', @$_), "\n" foreach my @points; 

выход:

34.2,17.5 
-64.1,110.35 
54.8,77.1 

Следует отметить, что я поместил скобки вокруг определения из @points массива:

my @points = ([34.2,17.5],[-64.1, 110.35],[54.8,77.1]); 

эти скобки необходимы из-за того, как lists are constructed in Perl, без т Кромка настоящее @points будет присваиваться только последнюю ссылку на массив [54.8,77.1]

+0

Большое спасибо за помощь. Я не был знаком с процессом разыменования, и именно там я застрял. – XeroG

1

Вы можете использовать CPAN модуль Data::Dumper, это просто:

use strict; 
use warnings; 
use Data::Dumper; 

my @points = ([34.2,17.5], [-64.1, 110.35], [54.8,77.1]); 
$Data::Dumper::Terse = 1; 
print Dumper(\@points), "\n"; 

#---> prints: 
[ 
    [ 
    '34.2', 
    '17.5' 
    ], 
    [ 
    '-64.1', 
    '110.35' 
    ], 
    [ 
    '54.8', 
    '77.1' 
    ] 
] 
0

Еще один решение для этого, хотя я изменил @points к reference.

use strict; 
use warnings; 
my $points = [[34.2,17.5],[-64.1, 110.35],[54.8,77.1]]; 

for(my $i = 0; $i<=6; $i++) 
{ 
    print $points->[$i]->[0]; 
    print "\n"; 
    print $points->[$i]->[1]; 
    print "\n"; 
} 
Смежные вопросы