perl: ссылка на элемент хэша?
От: slava_phirsov Россия  
Дата: 29.12.09 08:19
Оценка:
Доброго всем времени суток, вот такой вопрос из серии "хак или не хак".

Потребовалось задавать некоторые настройки скрипта в виде опций в командной строке, а те, которые не заданы — те оставлять по умолчанию, и один гигакодер написал что-то вроде нижеследующего (как вы, надеюсь, понимаете, print в данный фрагмент кода я вставил специально, чтобы полюбоваться результатами):

use warnings;
use strict;

use Getopt::Long;

my %vars = (foo => 'abc', bar => 'def');
Getopt::Long::GetOptions('foo=s' => \$vars{foo}, 'bar=s' => \$vars{bar});

for (keys %vars) {
    print "$_ => $vars{$_}\n";
}


Вообще-то говоря, в Getopt::Long::GetOptions есть возможность прямо задавать ссылку на хэш в качестве аргумента, но сей комсомолец учился преодолевать трудности, и дал ссылки на элементы хэша. И оно заработало (во всяком случае на Perl 5.8.8), хотя лично я никогда не слышал о такой штуке, как "ссылка на элемент хэша". Откуда, собственно говоря, и вопрос — а не хак ли это?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re: perl: ссылка на элемент хэша?
От: anonymous Россия http://denis.ibaev.name/
Дата: 11.01.10 18:21
Оценка: +1 -1
Здравствуйте, slava_phirsov, Вы писали:

_>Доброго всем времени суток, вот такой вопрос из серии "хак или не хак".


Нет, не хак, это просто ссылка на скаляр, а уж где этот скаляр находится — не важно.
Re[2]: perl: ссылка на элемент хэша?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.01.10 14:01
Оценка:
Здравствуйте, anonymous, Вы писали:

A>Здравствуйте, slava_phirsov, Вы писали:


_>>Доброго всем времени суток, вот такой вопрос из серии "хак или не хак".


A>Нет, не хак, это просто ссылка на скаляр, а уж где этот скаляр находится — не важно.


Это не так. Достаточно сделать простенький тест:

$a = [1,2,3];
%b = ( 'x' => $a );
$aa = \$b{'x'};
print $$aa, "\n";
$c = [4,5,6];
$$aa = $c;
print $a, " ", $b{'x'}, " ", $c, "\n";
$a = $c;
print $a, " ", $b{'x'}, " ", $c, "\n";


Смотрим на вывод:

$ perl 1.pl
ARRAY(0x8103a48)
ARRAY(0x8103a48) ARRAY(0x811718c) ARRAY(0x811718c)
ARRAY(0x811718c) ARRAY(0x811718c) ARRAY(0x811718c)


Если бы это была "ссылка на просто скаляр", то действие строки 6 привело бы к тому, что $a (который является значением в хэше %b) получил бы значение, равное $c. Вместо этого, произошла замена только в хэше (чему равно значение), но не оригинального скаляра. И только в строке заменилось значение $a.
The God is real, unless declared integer.
Re[3]: perl: ссылка на элемент хэша?
От: frogkiller Россия  
Дата: 18.01.10 16:22
Оценка:
Здравствуйте, netch80, Вы писали:

A>>Нет, не хак, это просто ссылка на скаляр, а уж где этот скаляр находится — не важно.

N>Это не так. Достаточно сделать простенький тест:

N>
N>$a = [1,2,3];
N>%b = ( 'x' => $a );
N>$aa = \$b{'x'};
N>print $$aa, "\n";
N>$c = [4,5,6];
N>$$aa = $c;
N>print $a, " ", $b{'x'}, " ", $c, "\n";
N>$a = $c;
N>print $a, " ", $b{'x'}, " ", $c, "\n";
N>


N>Если бы это была "ссылка на просто скаляр", то действие строки 6 привело бы к тому, что $a (который является значением в хэше %b) получил бы значение, равное $c. Вместо этого, произошла замена только в хэше (чему равно значение), но не оригинального скаляра. И только в строке заменилось значение $a.



Вот правильный тест:
$c = 1;
$a = \$c;
%b = ( x => $a );
$d = \$b{x};

$$$d = 2;

print $c;


У тебя же — ссылка на массив. А \[$a,$b$c] равно [\$a,\$b,\$c] — отсюда и наблюдаемое поведение.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[4]: perl: ссылка на элемент хэша?
От: frogkiller Россия  
Дата: 18.01.10 16:24
Оценка:
Здравствуйте, frogkiller, Вы писали:

Пропустил запятую.
F>А \[$a,$b,$c] равно [\$a,\$b,\$c] — отсюда и наблюдаемое поведение.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.