Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Ссылка на массив


Автор: burakov 4.5.2011, 11:27


Код

my $ref = ();
print scalar (@$ref); 


по идее должно напечатать 0, а пишет
не могу использовать undefined value as an ARRAY


вопрос вот в чем, часто использую ссылки для передачи из попрограммы - как то удобно это
А в результате непонятного вот такого поведения ссылки на массив, пришлось, сначала с массивом поработать, а затем через foreach запихать его в ссылку ,
может есть более простой синтаксис??? передачи массива по ссылке?

Код

sub do1 {
    my $str = shift;
    my @array = ();
    
    my $pattern = '<td class="propname">(.+?)</td><td>(.+?)</td>'; 
    while ($str =~ /$pattern/gi) {
        # push (@array, $1 .': '.$2); 
        
    }
    
    if (scalar (@array) == 0) {
        push (@array, '-'); 
    }
    
    my $ref_array = ();
    foreach (@array) {
        push (@$ref_array, $_); 
    }

    return $ref_array; 
}




Спасибо.

Автор: arto 4.5.2011, 11:46
# perl -le 'my $ref = []; print scalar @$ref'
0
#

Автор: burakov 4.5.2011, 12:37
А почему не работает в моем варианте (с круглыми скобками)?
Кто поможет расшифровать? чего я такое написал?

Автор: Pfailed 4.5.2011, 13:15
Код

my $ref = ();

Присваиваете скаляру список. При этом в скаляр ($ref) заносится последний элемент списка. undef в данном случае, т.к список пустой.

Код

my $ref = (5, 2, 8);

Посмотрите что даёт этот код, станет понятно.


Цитата(burakov @  4.5.2011,  11:27 Найти цитируемый пост)
может есть более простой синтаксис?

Достаточно было
Код

return \@array;


Автор: burakov 4.5.2011, 15:03
Блин, сколько всего написал уже
Всегда думал 
что 

$ref = ()
это ссылка на безымянный массив. И главное что все всегда работало - этот косяк который обнаружил с undef перый за 5 лет
$ref = {} а если так, то ссылка на безымянный хеш.

а как тогда указать - на что ссылка?
Или как ссылку разименуешь, так perl и будет ее обрабатывать?

Автор: Pfailed 4.5.2011, 15:33
За 5 лет можно было бы уже и какую-нибудь умную книжку прочитать.
[] - ссылка на анонимный массив
{} - ссылка на анонимный хеш
() - список
@a - массив
\@a - ссылка на массив
%a - хеш
\%a - ссылка на хеш

Автор: SkoobyDoo 4.5.2011, 15:45
Если надо узнать, какая структура данных скрывается за ссылкой, можно воспользоваться функцией ref

Код

print ref $ref;

Автор: burakov 4.5.2011, 15:58
Так вроде ж где то и прочитал то ... что $ref = () - я ж не сам такое выдумал. smile

Спасибо за ответы, 

но все равно непонятно - чем допустим массив от списка (в perl) отличается - ведь у него массивы то и есть списки
то есть 
$ref = ();
по идее тоже самое что и $ref = []

Код вот ниже вполне рабочий
Код

my @array = (1..10);
my $ref_array = ();
foreach (@array) {
    push (@$ref_array, $_); 
}
print @$ref_array;





Автор: Pfailed 4.5.2011, 16:50
Список - неизменчивая последовательность
Массив - напротив

Например в perldoc:
map BLOCK LIST
shift ARRAY

Видно, что у map вторым аргументом может быть любая последовательность, а у shift аргументом может быть только массив, т.к. shift изменяет свой аргумент.

Подробнее можно найти в сети. https://www.socialtext.net/perl5/array_vs_list

В вашем примере my $ref_array = () эквивалентно my $ref_array = undef. Уже писал почему.
Затем происходит автооживление: http://en.wikipedia.org/wiki/Autovivification

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)