Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылка на массив, непонятное поведение 
:(
    Опции темы
burakov
Дата 4.5.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет





Код

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; 
}




Спасибо.


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
arto
Дата 4.5.2011, 11:46 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -le 'my $ref = []; print scalar @$ref'
0
#
PM MAIL ICQ   Вверх
burakov
Дата 4.5.2011, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



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



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
Pfailed
Дата 4.5.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Код

my $ref = ();

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

Код

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

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


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

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

return \@array;




--------------------
PM MAIL   Вверх
burakov
Дата 4.5.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Блин, сколько всего написал уже
Всегда думал 
что 

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

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


--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
Pfailed
Дата 4.5.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



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



--------------------
PM MAIL   Вверх
SkoobyDoo
Дата 4.5.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 4.10.2007

Репутация: нет
Всего: нет



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

Код

print ref $ref;


Это сообщение отредактировал(а) SkoobyDoo - 4.5.2011, 15:46
PM MAIL   Вверх
burakov
Дата 4.5.2011, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



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

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

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

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

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







--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
Pfailed
Дата 4.5.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Список - неизменчивая последовательность
Массив - напротив

Например в 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


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.