URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7293
[ Назад ]

Исходное сообщение
"Не хватает базовых знаний"

Отправлено Hetzer , 06-Апр-08 10:57 
Привет, переделывая скрипты наткнулся на такое(упрощено):
my @array=("AB","AC");
for (@array) {
print "before: $_";
my $a = ~s/A//g;
print " after: $_\n";
}
Чувствую что-то не то.. не хватает базовых знаний
Почему $_ изменилась?
Насколько целесообразно так делать и не чреват ли такой подход проблемами в будущем?
Как будет идеологически верно работать с $_ в таком контексте?

Содержание

Сообщения в этом обсуждении
"Не хватает базовых знаний"
Отправлено idle , 07-Апр-08 09:53 
>Привет, переделывая скрипты наткнулся на такое(упрощено):
>my @array=("AB","AC");
>for (@array) {
>print "before: $_";
>my $a = ~s/A//g;
>print " after: $_\n";
>}
>Чувствую что-то не то.. не хватает базовых знаний
>Почему $_ изменилась?

Потому что оператор замены 's/', как и все другие операторы, по умолчанию работает с операндом $_.
>Насколько целесообразно так делать и не чреват ли такой подход проблемами в
>будущем?

Не чреват.
>Как будет идеологически верно работать с $_ в таком контексте?

Как идеология позволяет, так и рабатайте.


"Не хватает базовых знаний"
Отправлено Hetzer , 07-Апр-08 10:00 
>[оверквотинг удален]
>
>Потому что оператор замены 's/', как и все другие операторы, по умолчанию
>работает с операндом $_.
>>Насколько целесообразно так делать и не чреват ли такой подход проблемами в
>>будущем?
>
>Не чреват.
>>Как будет идеологически верно работать с $_ в таком контексте?
>
>Как идеология позволяет, так и рабатайте.

спасибо


"Не хватает базовых знаний"
Отправлено angra , 07-Апр-08 16:14 
>>Насколько целесообразно так делать и не чреват ли такой подход проблемами в
>>будущем?
>
>Не чреват.

Категорически неверно. Использование $_ вполне может привести к проблемам, причем трудно отлавливаемым. В общем случае нельзя сочетать $_ и невстроенные(те что отсутствуют в man perlfunc) функции.


"Не хватает базовых знаний"
Отправлено idle , 07-Апр-08 17:07 
>Использование $_ вполне может привести к проблемам, причем трудно отлавливаемым.

Не могу не согласиться. Создание нового кода, вообще всегда чревато проблемами.
>В общем случае нельзя сочетать $_ и невстроенные(те что отсутствуют в
>man perlfunc) функции.

То есть это работать не должно?


print myfunc($_);


sub myfunc {
    return shift;
}



"Не хватает базовых знаний"
Отправлено angra , 07-Апр-08 17:40 
Я имел ввиду потенциальную опасность кода вроде такого:
foreach (@list) {
  &my_func;
  print $hash{$_};
}
В зависимости от my_func этот код может работать правильно либо неправильно, причем на одном наборе данных все будет хорошо, а вот на другом плохо. Не стоит забывать что вызов своей функции может быть добавлен в цикл и позже или может быть изменена сама функция. В результате получаем неустойчивый код. Поэтому для цикла лучше объявлять итерационную переменную явно, а не использовать $_. Разумеется есть ситуации где использование $_ более чем оправдано.



"Не хватает базовых знаний"
Отправлено ACCA , 07-Апр-08 22:31 
>my @array=("AB","AC");
>for (@array) {
>print "before: $_";
>my $a = ~s/A//g;
>print " after: $_\n";
>}
>Чувствую что-то не то.. не хватает базовых знаний
>Почему $_ изменилась?

Потому, что ты сказал сделать вот что -
     1. применить к $_ regexp s/A//g (изменив $_)
     2. выполнить побитное not над результатом
     3. записать что получилось, в $a

Убери пробел между `=' и `~', получится то, на что оно похоже.