2016-01-15 5 views
1

даных HoHoAPerl: Копирование массива из хэша хэша массивов

my %FIELDS = (
    LA => { 
     NAME => [1], 
     ADDRESS => [2,3,4,5], 
     TYPE => [6], 
     LICENCE => [0], 
     ACTIVE => [], 
    }, 
... 
); 

Я пытаюсь сделать копию конкретного массива

my @ADDRESS_FIELDS = @{$FIELDS{$STATE}->{ADDRESS} }; 

Поскольку все внутри% Филдс по ссылке стрелка de-ссылки на внутренний хэш и @ {} отменяет ссылки на массив. (Я понимаю, что стрела не является строго необходимым)

print $ADDRESS_FIELDS[3]."\n"; 
print @ADDRESS_FIELDS."\n"; 

дает

5 
4 

Первая печать ведет себя, как и ожидалось, но второй один дает мне скалярное значение, я полагаю, упоминаемая массив вместо новой копии. Где я сбиваюсь с пути?

+1

Что вы имеете в виду «вместо новой копии»? «4» - это просто массив, оцененный в скалярном контексте, который дает количество элементов. Возможно, вы искали 'print '@ADDRESS_FIELDS \ n" '? – mbethke

+0

* Headdesk * Иногда мы пропускаем мелочи. Благодарю. – OBoud

ответ

4

конкатенации оператор силы скалярный контекст на операнды. Используйте запятую вместо:

print @array, "\n"; 

Обратите внимание, что элементы разделены $,, который по умолчанию пустой.

Или, чтобы отделить элементы массива по $" (пробел по умолчанию) на выходе, используйте

print "@array\n"; 

Или присоединиться к ним сами:

print join(' ', @array), "\n"; 
0
print @ADDRESS_FIELDS."\n"; 

Оценивает ваш массив в скалярном контексте и возвращает количество элементов (что в вашем случае равно 4).

print join(', ', @ADDRESS_FIELDS)."\n"; 

- это то, что вы хотите, я думаю.

НТН

1
cat my.pl 
#!/bin/perl 
# 
use strict; 
use warnings; 
use Data::Dumper; 

my %FIELDS = (
    LA => { 
     NAME => [1], 
     ADDRESS => [2,3,4,5], 
     TYPE => [6], 
     LICENCE => [0], 
     ACTIVE => [] 
    }, 
); 

my @addy = @{$FIELDS{LA}->{ADDRESS}}; 
foreach my $i(@addy){ 
    print "i=$i\n"; 
} 
perl my.pl 
i=2 
i=3 
i=4 
i=5 
+0

Вы забыли указать LA –

Смежные вопросы