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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нюансы в списках, Perl продолжает удивлять :о) 
:(
    Опции темы
ginnie
Дата 26.6.2008, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемые коллеги!

Perl не перестает преподносить сюрпризы в самых неожиданных местах.

Скажите, что выведет print в следующем фрагменте:

Код

my @array;

my %hash = (
    a => 1,
    b => @array,
    c => 3,
);

print 'b=', $hash{b};


Пояснения можно прочитать в документации.

Это сообщение отредактировал(а) ginnie - 26.6.2008, 19:50


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
n4n0bit
Дата 26.6.2008, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



гы)  smile 

Проинтапритировав в выводе получил 'c', эта навернео связано с тем что массив @array не определен, поэтому значение ключа 'b' будет 
слудующий ключ 'c'  smileно

Но вот тут кортина немнога другая в выводе :

Код

#!/usr/bin/perl

my %hash = (
    a => 1,
    B => @a,
    c => 3,
    D => @b,
    e => 4,
    f => 5,
    X => @c,
    Z => @d
);


for( keys %hash )
{
    print "$_ = $hash{$_}\n"
}


Вывод для разных значений ключей хеша %hash:

Код

# если массив
e = 4
a = 1
X = Z
3 = D # по логике тут должно быть D = e
f = 5
B = c

# если хэш
e = 4
a = 1
X = Z
3 = D
f = 5
B = c

# если скаляр
e = 4
a = 1
X = 
B = 
Z = 
c = 3
D = 
f = 5

# если undef
e = 4
a = 1
X = 
B = 
Z = 
c = 3
D = 
f = 5




Это сообщение отредактировал(а) n4n0bit - 26.6.2008, 20:23
PM MAIL WWW Jabber   Вверх
Nab
Дата 26.6.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да интересное замечание, но вполне логичное.

%hash = ( A => B => C => D => E => G);

абсолютно идентичен

%hash = ( A,  B, C, D, E, G );

или

%hash = ( A,  B => C, D => E, G );

или

%hash = ( A,  B, (C, D, E), G );

что в итоге если заменим

%hash = ( A,  B, (), G );

получиться

%hash = ( A => B, G => undef);

потому как пустой список, это даже не undef, это ничто smile в данном контексте.






--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
Nab
Дата 27.6.2008, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это я все к тому что '=>' в перле это всего лишь замена ','.
Его  можно использовать везде.

Код

my_func($a, $b, 'name', 'value');
#тоже самое что и
my_func($a => $b => 'name' => 'value');


поэтому самый первый вариант:
Код

my @array;

my %hash = (
    a => 1,
    b => @array,
    c => 3,
);

print 'b=', $hash{b};

идентичен следующему:
Код

my @array;

my %hash = (a, 1, b, @array, c, 3 );

print 'b=', $hash{b};


А так как список @array пустой, то так и получааеться что ключу 'b' присваиваеться значение 'c'. И соответсвенно сдвигаються все остальные значения, что показали результаты n4n0bit.


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
KSURi
Дата 27.6.2008, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

C:\>perl -Mstrict -MData::Dumper -we"my@a;my%b=(a=>'b',c=>@a,d=>'e');print Dumper \%b"
Odd number of elements in hash assignment at -e line 1.
$VAR1 = {
          'e' => undef,
          'c' => 'd',
          'a' => 'b'
        };

C:\>

Думаю n4n0bit прав. Хотя на мой взгляд, было бы логичнее присвоить 'c' undef.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Bulat
Дата 27.6.2008, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


татарский Нео
***


Профиль
Группа: Завсегдатай
Сообщений: 1701
Регистрация: 22.3.2006
Где: Альметьевск

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



Хе-хе..

Анонимный хеш вряд ли знаком с таким понятием как "перегрузка" smile


--------------------
менеджер по кодеврайтингу  smile 
PM MAIL WWW   Вверх
Nab
Дата 27.6.2008, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(KSURi @  27.6.2008,  09:20 Найти цитируемый пост)
Думаю n4n0bit прав. Хотя на мой взгляд, было бы логичнее присвоить 'c' undef.

Что значит логичнее?

Со стороны логики там все норм, обысновенное приведение типов, присваивание хешу значений массива.

%hash = @array;

просто оно оформлено еще с дополнительными элементами и скорее неочевидное чем нелогичное.

Нужно глянуть с другой стороны, насколько логична сама конструкция, если человек хотел получить массив как элемент то ему необходимо было указывать ссылку на массив, а не массив. Тогда было бы абсолютно пофиг сколько там элементов.

Если человек не ошибочно делает такую конструкцию, то какой ответ он хотел получить интересно. А если это опечатка, то и результат 'нелогичен' smile

А undef там в принципе быть не мог, все таки массив может содержать ноль или больше элементов, но не undef. smile




--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
ginnie
Дата 27.6.2008, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый Nab, Вы абсолютно правы, использование массива при инициализации хеша в примере дано для упрощения. В реальной программе вместо массива используется вызов функции.
Я раньше не знал, что пустой список игнорируется внутри другого списка (плохо читал документацию), решил написать, чтобы другие тоже обратили внимание.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
nitr
Дата 27.6.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



 smile 
Nab, пропавший, но непропащий ;)
Хорошо, что снова в "наших" рядах smile


--------------------
PM   Вверх
amg
Дата 28.6.2008, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(nitr @  27.6.2008,  20:16 Найти цитируемый пост)
Nab, пропавший, но непропащий ;)
Хорошо, что снова в "наших" рядах
Присоединяюсь!

PM MAIL   Вверх
Nab
Дата 28.6.2008, 07:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 smile 
Я тоже ребят рад что вас тут всех встретил smile 

Правда я давно чистым перлом не занимался, поэтому кое что прийдеться подтянуть. Но надеюсь буду полезен форуму, а он мне smile


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


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

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


 




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


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

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