yorool_gui: (Default)
Michael Ilyin ([personal profile] yorool_gui) wrote2005-03-14 05:10 pm

о Perl

Перл замечательный язык, когда на нем пишу Я. Когда на нем пишут другие -- это кошмар. И подозреваю, что это взаимно.

use strict;
...
no strict 'refs';
...
$self->{LABELS}->{$title} = $3;
$self->{LABELS}->{$title}->{NUM} = $num++;

Это работатет. Но я не понимаю, ради чего надо так извращаться. Это не тот Перл, на котором пишу я. На моем Перле ref $self->{LABELS}->{$title} будет либо SCALAR, либо HASH, но никак не то и другое одновременно. А вот на Перле этого человека в $self->{LABELS}->{$title} хранятся сразу два значения и ему это удобно. Но это другой язык.

[identity profile] yorool-gui.livejournal.com 2005-03-14 02:26 pm (UTC)(link)
Как раз и LABELS и NUM без кавычек отлично работает и при полном use strict. Я сам этим постоянно пользуюсь -- никаких проблем это не порождает, просто syntax sugar.
А вот no strict 'refs' -- это да. Я около часа тоже этот код понимать просто отказывался, тем более что no strict 'refs' было не сразу под use strict, а пятью строчками ниже, куда я сначала не поглядел.
Я, кстати, так толком и не пониямаю, как это работает. Не, я помню что-то про хитрые структуры, в которых хранятся перловые переменные и догадываюсь, что они просто хранят там два значения для разных типов. Но что вернет ref на такую переменную -- не понимаю.

[identity profile] blacklion.livejournal.com 2005-03-14 02:28 pm (UTC)(link)
ref -- ссылку на скаляр. А если мы обращаемся к нему как к хэшу, оно ищет, нету ли хэша с таким именем.

А вот без кавычек -- да, работает всегда. Но все равно очень не люблю. Потому что для меня идентификатор без типа в перле -- это однозначно константа (use constant { LABEL => 1, NUM => 2 };)

[identity profile] yorool-gui.livejournal.com 2005-03-14 02:51 pm (UTC)(link)
именно это я и имел в виду в исходном посте, насчет взаимно-кошмарного кода :-)

[identity profile] sorhed.livejournal.com 2005-03-14 02:56 pm (UTC)(link)
Ну, кстати, вы же не будете утверждать, что $hashref->{some_key} — это однозначное зло? :) Мне всегда было лень писать $hashref->{'some_key'}, тем более, и strict смотрит на это сквозь пальцы.

[identity profile] blacklion.livejournal.com 2005-03-14 02:59 pm (UTC)(link)
Однозначного зла вовсе нет :)

Да, это минорное зло. Я уже привык в чужом коде. Но сам не ленюсь :)

[identity profile] yorool-gui.livejournal.com 2005-03-14 04:35 pm (UTC)(link)
Блин, я только сейчас разобрался, что же там происходит. Там же глобальные переменные засирались как из гамномета, причем если попадались одинаковые значения, то они и отображались на одну и ту же переменную, отчего происходил Реальный Геморрой. Теперь мне все ясно, а исходный пост признается ересью.