Forum Webscript.Ru
Программирование => Perl => Тема начата: Phoinix от 14 Января 2004, 13:02:39
-
При вызове процедуры из модуля:
(@mass1, %mass2) = MyModule(@mass3);
Процедура модуля:
sub MyModule {
my %temp_mass;
foreach (@_) {
if (s///gi) {$temp_mass{$1} .= $_; $_ = \'\'}
}
return (@_, %temp_mass)
}
Не присваивает значения @mass1 = @_ и %mass2 = %temp_mass, хотя в самой процедуре @_ и %temp_mass определены...
Пришлось изменить немного по другому:
@mass1 = @mass3;
%mass2 = MyModule(@mass1);
sub MyModule {
my %temp_mass;
foreach (@_) {
if (s///gi) {$temp_mass{$1} .= $_; $_ = \'\'}
}
return %temp_mass
}
При этом я получаю верные значения @mass1 и %mass2,
Но как-нибудь возможно использование первого варианта, либо использовать конструкцию:
@mass1 = @mass3;
MyModule(@mass3, %mass2);
sub MyModule {
foreach (@_) {
if (s///gi) {(?) .= $_; $_ = \'\'}
}
return 1
}
Как выбрать элемент хеша по-умолчанию? при использовании $_{$1} = присваивается значение не $_, а $1, т.е. $_{$1} = $1... как побороть не пойму...
P.S. т.е. я получаю %mass2 но при этом значение ключа получается сам ключ...
-
Не присваивает значения @mass1 = @_ и %mass2 = %temp_mass, хотя в самой процедуре @_ и %temp_mass определены...
Правильно. Твой хэшик в данном месте становится массивчиком и возвращается совмещенный с другим массивчиком ;)
Как выбрать элемент хеша по-умолчанию?
А нету такого :) Есть текущий, оператором each ты можешь изьять его. Можешь придумать чегонить сам.
Мой огромный совет: Почитай про ссылки я тебе давно об этом говорю. Дело в том, что механизм передачи/приема значений из функция в perl\'е реализован универсальным спобом. Универсальность заключается в том. что программист реализовывает тот способ передачи/приема, который ему больше понравится сам. Но для этого необходимо знать про ссылки. Полистай perldoc perlref или еще что нить.
-
А нету такого Есть текущий, оператором each ты можешь изьять его. Можешь придумать чегонить сам.
Извиняюсь, за не точность... я передаю в процедуру хеш, как мне его определить? Точнее как я могу его использовать в самой процедуре, мне нужен не элемент по-умолчанию, а хеш по-умолчанию... элемент у меня как раз таки определен...
Твой хэшик в данном месте становится массивчиком и возвращается совмещенный с другим массивчиком
А я как раз таки думаю и не возвращать ничего, вернуть просто 1, но при этом провести обработку двух массивов: в одном убрать элементы (точнее обнулить), в другой добавить...
-
Еще раз настоятельно рекомендую применить мой совет. Все ответы там.
-
ondr
Угу... уже применил спасибо...
но вопрос при разименовывании ссылки:
my @array = @$_[0];
выдает ошибку:
Not an ARRAY reference
приходится разименовывать так:
my $link = @$_[0];
my @array = @$link;
-
Все понял...
my @array = @{$_[0]};
-
my @array = @{ $_[0] };
У Perl конечно синтаксический анализатор просто шикарный, но до искуственного интелекта еще далеко ;) Так, что иногда стоит писать максимально точно в соответствии с установленными правилами.