Перл замечательный язык, когда на нем пишу Я. Когда на нем пишут другие -- это кошмар. И подозреваю, что это взаимно.
use strict;
...
no strict 'refs';
...
$self->{LABELS}->{$title} = $3;
$self->{LABELS}->{$title}->{NUM} = $num++;
Это работатет. Но я не понимаю, ради чего надо так извращаться. Это не тот Перл, на котором пишу я. На моем Перле ref $self->{LABELS}->{$title} будет либо SCALAR, либо HASH, но никак не то и другое одновременно. А вот на Перле этого человека в $self->{LABELS}->{$title} хранятся сразу два значения и ему это удобно. Но это другой язык.
use strict;
...
no strict 'refs';
...
$self->{LABELS}->{$title} = $3;
$self->{LABELS}->{$title}->{NUM} = $num++;
Это работатет. Но я не понимаю, ради чего надо так извращаться. Это не тот Перл, на котором пишу я. На моем Перле ref $self->{LABELS}->{$title} будет либо SCALAR, либо HASH, но никак не то и другое одновременно. А вот на Перле этого человека в $self->{LABELS}->{$title} хранятся сразу два значения и ему это удобно. Но это другой язык.
no subject
Date: 2005-03-14 02:16 pm (UTC)no subject
Date: 2005-03-14 02:21 pm (UTC)no subject
Date: 2005-03-14 02:23 pm (UTC)no subject
Date: 2005-03-14 02:27 pm (UTC)(хотя, конечно, всё равно было бы неплохо, чтобы strict шёл по дефолту, а извращенцы вроде меня использовали бы no strict в специально отведённых местах).
no subject
Date: 2005-03-14 02:29 pm (UTC)А вот какова необходимость в том, что бы она была такая ивзращенная?
no subject
Date: 2005-03-14 02:32 pm (UTC)Где-то в недрах perldoc perlobj сказано, что если менять @ISA динамически где ни попадя, то ничего хорошего из этого не выйдет, так как оно там кэшируется. А мне как раз надо было динамически. Чтобы если девелопер захотел в живой системе созданный объект унаследовать от чего-нибудь ещё — то нет проблем.
no subject
Date: 2005-03-14 02:37 pm (UTC)Вообще, плохо понимаю, зачем такое может понадобится и почему тогда это не реализовать через AUTOLOAD в виде модуля Class::DynamicInheritance какого-нибудь, от которого наследоватьв се такие классы...
no subject
Date: 2005-03-14 02:40 pm (UTC)Ну, в общем, вот о чём я говорю:
sub AUTOLOAD { my ($this) = @_; my $method_name = $AUTOLOAD; $method_name =~ s/^(.*):://; my $class_name = $1; $class_name =~ s/^(.*):://; my $package_name = $1; my $method = $this->get_method($method_name, $class_name); if ($method) { my $code = $method->{code}; my $result = eval ($code); if ($@) { $this->error($@); } return $result; } else { $this->error("Method $method_name for $class_name is not found."); } } sub get_method { my ($this, $method_name, $class_name) = @_; my $class = $this->{STORAGE}->get_class($class_name); my $class_id = $class->{class_id}; my $method = $this->{STORAGE}->get_object(-name => $method_name, -class => 'Method', -of_class => $class_id); if ($method) { return $method; } else { if ($class_name ne 'Object') { my $parent_class_id = $class->{parent}; my $parent_class_name = $this->{STORAGE}->get_class($parent_class_id)->{name}; return $this->get_method($method_name, $parent_class_name); } else { return undef; } } }no subject
Date: 2005-03-14 02:46 pm (UTC)no subject
Date: 2005-03-14 02:48 pm (UTC)А нестриктные референсы я всё-таки убрал, оказывается :) Блин, вот что значит три месяца в код не заглядывать.
no subject
Date: 2005-03-14 02:54 pm (UTC)Хотя, производительность так должна страдать...
no subject
Date: 2005-03-14 02:55 pm (UTC)no subject
Date: 2005-03-14 02:59 pm (UTC)no subject
Date: 2005-03-14 03:00 pm (UTC)и можно без хлебаа ещё я где-то слышал, что после эвала можно просто хранить ссылки на code references, только не знаю пока ещё, как :)no subject
Date: 2005-03-14 03:09 pm (UTC)var code = new Function( "some code; goes; here;" );
А про Perl -- Я как раз только что думал, как бы получить CodeV из eval'а... Вот так, сходу, способа не вижу... Т.е. вижу, но кривой до невозможности:
sub getCode { my $code = $_[0]; local *F; my $name = sprintf( "__getCode_unique_name_0x%08x_%s", $$, md5_hex($code) ); open(F, "> /var/tmp/$$.pl"); print F "sub ", $name, " { "; print F $code; print F "}"; close(F); require "/var/tmp/$$.pl"; ### # DAMN! { no strict 'ref'; $code = \&{$name}; } ### unlink("/var/tmp/$$.pl"); return $code; } Но ведь крииииво... И будет ли работать... Ччерт, давно на перле не писал...no subject
Date: 2005-03-14 03:14 pm (UTC)no subject
Date: 2005-03-14 03:19 pm (UTC)no subject
Date: 2005-03-14 03:25 pm (UTC)my $codeRef = eval "sub { $codeStr } ";
ВСЕ! Работает!
no subject
Date: 2005-03-14 03:27 pm (UTC)no subject
Date: 2005-03-15 08:28 am (UTC)no subject
Date: 2005-03-15 11:27 am (UTC)no subject
Date: 2005-03-14 02:30 pm (UTC)$possibly_unititalized ||= 'default_value';
no subject
Date: 2005-03-14 02:32 pm (UTC)no subject
Date: 2005-03-14 02:22 pm (UTC)use strict;
use utf8;
use warnings FATAL => 'uninitialized';
Это спасает от безумного кода :)
no subject
Date: 2005-03-14 02:22 pm (UTC)no subject
Date: 2005-03-14 02:26 pm (UTC)А вот no strict 'refs' -- это да. Я около часа тоже этот код понимать просто отказывался, тем более что no strict 'refs' было не сразу под use strict, а пятью строчками ниже, куда я сначала не поглядел.
Я, кстати, так толком и не пониямаю, как это работает. Не, я помню что-то про хитрые структуры, в которых хранятся перловые переменные и догадываюсь, что они просто хранят там два значения для разных типов. Но что вернет ref на такую переменную -- не понимаю.
no subject
Date: 2005-03-14 02:28 pm (UTC)А вот без кавычек -- да, работает всегда. Но все равно очень не люблю. Потому что для меня идентификатор без типа в перле -- это однозначно константа (use constant { LABEL => 1, NUM => 2 };)
no subject
Date: 2005-03-14 02:51 pm (UTC)no subject
Date: 2005-03-14 02:56 pm (UTC)no subject
Date: 2005-03-14 02:59 pm (UTC)Да, это минорное зло. Я уже привык в чужом коде. Но сам не ленюсь :)
no subject
Date: 2005-03-14 04:35 pm (UTC)no subject
Date: 2005-03-14 02:19 pm (UTC)Но там без экстремизма было.