Привет, переделывая скрипты наткнулся на такое(упрощено):
my @array=("AB","AC");
for (@array) {
print "before: $_";
my $a = ~s/A//g;
print " after: $_\n";
}
Чувствую что-то не то.. не хватает базовых знаний
Почему $_ изменилась?
Насколько целесообразно так делать и не чреват ли такой подход проблемами в будущем?
Как будет идеологически верно работать с $_ в таком контексте?
>Привет, переделывая скрипты наткнулся на такое(упрощено):
>my @array=("AB","AC");
>for (@array) {
>print "before: $_";
>my $a = ~s/A//g;
>print " after: $_\n";
>}
>Чувствую что-то не то.. не хватает базовых знаний
>Почему $_ изменилась?Потому что оператор замены 's/', как и все другие операторы, по умолчанию работает с операндом $_.
>Насколько целесообразно так делать и не чреват ли такой подход проблемами в
>будущем?Не чреват.
>Как будет идеологически верно работать с $_ в таком контексте?Как идеология позволяет, так и рабатайте.
>[оверквотинг удален]
>
>Потому что оператор замены 's/', как и все другие операторы, по умолчанию
>работает с операндом $_.
>>Насколько целесообразно так делать и не чреват ли такой подход проблемами в
>>будущем?
>
>Не чреват.
>>Как будет идеологически верно работать с $_ в таком контексте?
>
>Как идеология позволяет, так и рабатайте.спасибо
>>Насколько целесообразно так делать и не чреват ли такой подход проблемами в
>>будущем?
>
>Не чреват.Категорически неверно. Использование $_ вполне может привести к проблемам, причем трудно отлавливаемым. В общем случае нельзя сочетать $_ и невстроенные(те что отсутствуют в man perlfunc) функции.
>Использование $_ вполне может привести к проблемам, причем трудно отлавливаемым.Не могу не согласиться. Создание нового кода, вообще всегда чревато проблемами.
>В общем случае нельзя сочетать $_ и невстроенные(те что отсутствуют в
>man perlfunc) функции.То есть это работать не должно?
print myfunc($_);
sub myfunc {
return shift;
}
Я имел ввиду потенциальную опасность кода вроде такого:
foreach (@list) {
&my_func;
print $hash{$_};
}
В зависимости от my_func этот код может работать правильно либо неправильно, причем на одном наборе данных все будет хорошо, а вот на другом плохо. Не стоит забывать что вызов своей функции может быть добавлен в цикл и позже или может быть изменена сама функция. В результате получаем неустойчивый код. Поэтому для цикла лучше объявлять итерационную переменную явно, а не использовать $_. Разумеется есть ситуации где использование $_ более чем оправдано.
>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Убери пробел между `=' и `~', получится то, на что оно похоже.