��� � ������� ������
#!/usr/bin/perl -w
use Net::Telnet::Cisco;
print "������� IP cisco: ";
chomp (my $cdevice = <STDIN>);
print "������� username: ";
chomp (my $clogin = <STDIN>);
print "������� password: ";
chomp (my $cpassword = <STDIN>);
$cmds = "sh ver";
$session = Net::Telnet::Cisco->new(Host => $cdevice,
Input_log => "input.log",
Output_log => "output.log"
);
$session->login ($clogin, $cpassword) ;
$session->cmd($cmds);
$session->close;
�������� ���������� ������ �������� ��������������??
Use of /g modifier is meaningless in split at
/usr/local/share/perl/5.10.1/Net/Telnet/Cisco.pm line 756
� ���������� �����������, Petr.
PM> Обясните пожалуйста почему выдается предупреждение??
PM> Use of /g modifier is meaningless in split at
PM> /usr/local/share/perl/5.10.1/Net/Telnet/Cisco.pm line 756
man perldiag говорит:
Use of /g modifier is meaningless in split
(W regexp) You used the /g modifier on the pattern for a "split"
operator. Since "split" always tries to match the pattern repeat-
edly, the "/g" has no effect.
Автор модуля Net::Telnet::Cisco неаккуратно писал код.
Можно предположить, что это не единственная неаккуратность автора
и постараться не использовать этот модуль, взяв какой-нибудь другой,
напиример, Net::Nelnet.
Или перед вызовом функции сделать $^W=0;
И после вызова включить предупреждения обратно, $^W=1;
Eugene
--
Three things are certain:
Death, taxes and lost data.
Guess which has occurred.
EG> 19 ноя 2010, пятница, в 23:14 KRAT, Petr Merkulov написал(а):
PM> Обясните пожалуйста почему выдается предупреждение??
PM> Use of /g modifier is meaningless in split at
PM> /usr/local/share/perl/5.10.1/Net/Telnet/Cisco.pm line 756
EG> man perldiag говорит:
EG> Use of /g modifier is meaningless in split
EG> (W regexp) You used the /g modifier on the pattern for a "split"
EG> operator. Since "split" always tries to match the pattern repeat-
EG> edly, the "/g" has no effect.
EG> Автор модуля Net::Telnet::Cisco неаккуратно писал код.
EG> Можно предположить, что это не единственная неаккуратность автора
EG> и постараться не использовать этот модуль, взяв какой-нибудь другой,
EG> напиример, Net::Nelnet.
EG> Или перед вызовом функции сделать $^W=0;
EG> И после вызова включить предупреждения обратно, $^W=1;
Женя, не рекомендуй bad practice. Переменную $^W использовать
категорически не стоит (тем более в таком виде - перед вызовом изменить
значение, а потом включить обратно - как минимум ее надо локализовать
минимально возможной области лексической видимости). Ибо ее семантика
совершенно не прозрачна. Вместо нее надо использовать прагму warnings.
{
no warnings; # Тут можно уточнить какие конкретно выключить, мне лень
# искать
<some code>
}
Hо конечно проще всего поправить эту строку 756 и послать патч.
Hу а что касается "не надо его использовать". Опыт многолетней
эксплуатации с постоянным опросом нескольких тысяч устройств показывает что
он вполне стабильный.
--
Best regards, Alex Bakhtin, CCIE #8439
AMT Group, Cisco Systems Gold Partner, http://www.amt.ru
EG>> Или перед вызовом функции сделать $^W=0;
EG>> И после вызова включить предупреждения обратно, $^W=1;
AB> Женя, не рекомендуй bad practice.
А вот поспорю, тем более что трафика тут нет :-)
AB> Переменную $^W использовать
AB> категорически не стоит (тем более в таком виде - перед вызовом изменить
AB> значение, а потом включить обратно - как минимум ее надо локализовать
AB> минимально возможной области лексической видимости).
Зачем её локализовывать, она ж глобальная?
AB> Ибо ее семантика совершенно не прозрачна.
man perlvar говорит, что это "The current value of the warning switch",
куда уж прозрачнее?
AB> Вместо нее надо использовать прагму warnings.
И в чём разница в данном конкретном случае?
AB> {
AB> no warnings; # Тут можно уточнить какие конкретно выключить, мне лень
AB> # искать
AB> <some code>
AB> }
Если мне мешают варнинги внутри модуля и не хочется от него отказываться,
я выключаю любые варнинги внутри него :-)
AB> Hо конечно проще всего поправить эту строку 756 и послать патч.
И после апгрейда через два года начать получать письма от крона :-)
AB> Hу а что касается "не надо его использовать". Опыт многолетней
AB> эксплуатации с постоянным опросом нескольких тысяч устройств показывает
AB> что
AB> он вполне стабильный.
Тем лучше.
Eugene
--
Учитывая мелкую дрожь летучей мыши, храбро отклонившейся от летнего
солнцестояния, дабы поухаживать за небылицами, коим с помощью пешки удалось
сделать шах и мат благодаря злым обидам светобоящихся ночных птиц, обитающих
в римском климате с распятьем на коне, самостоятельно натягивая арбалет...
20 ноя 10 18:40, Eugene Grosbein -> Petr Merkulov в сообщении по ссылке
area://ru.perl?msgid=www.svzserv.kemerovo.su+09606790:
PM>> Обясните пожалуйста почему выдается предупреждение??
PM>> Use of /g modifier is meaningless in split at
PM>> /usr/local/share/perl/5.10.1/Net/Telnet/Cisco.pm line 756
EG> man perldiag говорит:
EG> Use of /g modifier is meaningless in split
EG> (W regexp) You used the /g modifier on the pattern for a
EG> "split"
EG> operator. Since "split" always tries to match the pattern
EG> repeat-
EG> edly, the "/g" has no effect.
EG> Автор модуля Net::Telnet::Cisco неаккуратно писал код.
EG> Можно предположить, что это не единственная неаккуратность автора
EG> и постараться не использовать этот модуль, взяв какой-нибудь другой,
EG> напиример, Net::Nelnet.
EG> Или перед вызовом функции сделать $^W=0;
EG> И после вызова включить предупреждения обратно, $^W=1;
спасибо
С наилучшими пожеланиями, Petr.
EG> О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ $^W=0;
EG> О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, $^W=1;
AB> О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ bad practice.
EG> О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ :-)
О©╫ О©╫О©╫О©╫:-)
AB> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ $^W О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
AB> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ (О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
AB> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
AB> О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫).
EG> О©╫О©╫О©╫О©╫О©╫ её О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫?
О©╫О©╫О©╫О©╫, О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
"О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫" О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫? О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
AB> О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
EG> man perlvar О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫ "The current value of the warning switch",
EG> О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫?
О©╫О©╫-О©╫О©╫О©╫. perlvar О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ perlvar О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫ perlrun О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫ -w?:-) О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. use warnings О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
AB> О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ warnings.
EG> О©╫ О©╫ чёО©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫?
О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫ $^W - О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫О©╫ О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ - О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ $^W О©╫
О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ $^W О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫. HО©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ $^W=1 О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫.
AB> {
AB> no warnings; # О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫, О©╫О©╫О©╫ О©╫О©╫О©╫О©╫
AB> # О©╫О©╫О©╫О©╫О©╫О©╫
AB> <some code>
AB> }
EG> О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫,
EG> О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ :-)
О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ "О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫". О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫
О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
1. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ $^W=0; $^W=1 О©╫О©╫О©╫О©╫О©╫:
eval {
$^W = 0;
die 'Hey warning';
$^W = 1;
}
print $^W,"\n";
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫?
2. О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫ $^W О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ -w:
eval {
$^W = 0;
some code
$^W = 1;
}
print $^W,"\n";
О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫?
О©╫О©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ $^W О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫:
eval {
local $^W = 0;
die 'Hey warning';
};
HО©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫
eval {
no warnings;
die 'Hey warning';
};
О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
AB> HО©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ 756 О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫.
EG> О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫ О©╫О©╫О©╫О©╫О©╫ :-)
HО©╫, О©╫О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫ О©╫О©╫О©╫ О©╫О©╫О©╫-О©╫О©╫ О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫О©╫.
EG>> Или перед вызовом функции сделать $^W=0;
EG>> И после вызова включить предупреждения обратно, $^W=1;
AB>> Женя, не рекомендуй bad practice.
EG>> А вот поспорю, тем более что трафика тут нет :-)
AB> А зря:-)
AB>> Переменную $^W использовать
AB>> категорически не стоит (тем более в таком виде - перед вызовом изменить
AB>> значение, а потом включить обратно - как минимум ее надо локализовать
AB>> минимально возможной области лексической видимости).
EG>> Зачем её локализовывать, она ж глобальная?
AB> Женя, не пугай меня. Ты действительно не знаешь что такое
AB> "локализовать переменную" или прикидываешься? Именно потому что она
AB> глобальная ее перед изменением и надо локализовать.
Вторая попытка: зачем её локализовывать?
AB>> Ибо ее семантика совершенно не прозрачна.
EG>> man perlvar говорит, что это "The current value of the warning switch",
EG>> куда уж прозрачнее?
AB> Во-вот. perlvar говорит. Читая код с этими птичьми переменными часто
AB> без применения perlvar невозможно понять что они означают.
А $0 ты тоже не помнишь? И эти: $! $. $| $@ $$ тоже? :-)
Вопрос практики.
AB> Семантика неочевидна. После этого надо еще пойти в perlrun
AB> и посмотреть что означает ключ -w?:-)
Hаизусть надо знать -w :-)
AB> Его кстати тоже лучше не использовать. use warnings дает более
AB> четкий контроль.
AB>> Вместо нее надо использовать прагму warnings.
EG>> И в чём разница в данном конкретном случае?
AB> Разница в том, что сопровождение кода с $^W - лишние и совершенно
AB> ненужные проблемы для того, кто будет дальше этим заниматься. Да и для
AB> тебя
AB> самого через пару лет, когда ты совершенно забудешь - зачем тут это $^W и
AB> что оно должно означать.
Когда я вижу конструкцию $^W=0; call_some_func; $^W=1; - она обозначает
ровно одно, отключение варнингов.
AB> К тому же, изменение $^W в режиме выполнения
AB> совершенно не способно блокировать предупреждения из режима
AB> компиляции.
И не надо. Именно по этой причине я её и использую вместо use warnings -
чтобы ограничить её влияние временем выполнения и чтобы
предупреждения о _моём_ коде не отключались.
AB> Hужно опять-же обернуть твою $^W=1 еще в одну конструкцию и так далее.
Зачем оборачивать?
EG>> Если мне мешают варнинги внутри модуля и не хочется от него отказываться,
EG>> я выключаю любые варнинги внутри него :-)
AB> Ты выключаешь не "варнинги внутри модуля". Ты выключаешь все
AB> варнинги.
Hа то время, когда $^W равна нулю, а в это время работает только
код модуля.
AB> Давай рассмотрим две ситуации:
AB> 1. когда код, обернутый в $^W=0; $^W=1 умрет:
AB> eval {
AB> $^W = 0;
AB> die 'Hey warning';
AB> $^W = 1;
AB> }
AB> print $^W,"\n";
AB> Какое число тебе напечатают?
$ perl -e 'eval { $^W = 0; die "Hey warning"; $^W = 1; }; print $^W,"\n";'
0
С perl -we то же самое.
И нет, я не использую модули, в которых вызов die() нельзя отключить :-)
AB> 2. Когда код, обернутый в $^W будет запущен без ключа -w:
AB> eval {
AB> $^W = 0;
AB> some code
AB> $^W = 1;
AB> }
AB> print $^W,"\n";
AB> Какое число тебе напечатают?
1.
Я не пишу код без -w.
AB> Да, очевидно что локализовав $^W можно решить обе эти проблемы:
AB> eval {
AB> local $^W = 0;
AB> die 'Hey warning';
AB> };
AB> Hо если сравнить читаемость этого кода с
AB> eval {
AB> no warnings;
AB> die 'Hey warning';
AB> };
AB> Мне так представляется что выбор очевиден.
Я привык к $^W, потому что warnings нету в 5.5.3 :-)
AB>> Hо конечно проще всего поправить эту строку 756 и послать патч.
EG>> И после апгрейда через два года начать получать письма от крона :-)
AB> Hу, полезно узнать что что-то изменилось.
Полезней создавать системы, устойчивые к изменениям внешней среды :-)
Eugene
--
Hаши предки умели всё. Потом забыли.
EG> Зачем её локализовывать, она ж глобальная?
AB> Женя, не пугай меня. Ты действительно не знаешь что такое
AB> "локализовать переменную" или прикидываешься? Именно потому что она
AB> глобальная ее перед изменением и надо локализовать.
EG> Вторая попытка: зачем её локализовывать?
Чтобы по выходу из лексической области видимости ее значение
восстановилось. Это мне кажется разжевывать не надо.
AB> Ибо ее семантика совершенно не прозрачна.
EG> man perlvar говорит, что это "The current value of the warning switch",
EG> куда уж прозрачнее?
AB> Во-вот. perlvar говорит. Читая код с этими птичьми переменными часто
AB> без применения perlvar невозможно понять что они означают.
EG> А $0 ты тоже не помнишь? И эти: $! $. $| $@ $$ тоже? :-)
EG> Вопрос практики.
Hет, вопрос не практики. Вопрос написания кода так, чтобы его было
комфортно сопровождать. И да, $0 я не помню. И если мне потребуется узнать
имя файла с программой (не очень понятно зачем) - я сначала сделаю
use English qw( -no_match_vars );
и потом буду использовать $PROGRAM_NAME, а не $0. И вместо $| -
я использую STDOUT->autoflush. От $@ я пока-что не избавился, про остальные
мне в perlvar даже лень залезать. Hет никакой необходимости помнить этот
птичий язык, когда можно сказать use English и использовать семантически
значимые имена. Все эти односимвольные имена - это балласт из времен, когда
никто даже не мог подумать о том, что программы на перле могут вырасти из
полутора строчек кода до десятков тысяч.
AB> Семантика неочевидна. После этого надо еще пойти в perlrun
AB> и посмотреть что означает ключ -w?:-)
EG> Hаизусть надо знать -w :-)
Hет, его вообще не надо использовать.
AB> Его кстати тоже лучше не использовать. use warnings дает более
AB> четкий контроль.
AB> Вместо нее надо использовать прагму warnings.
EG> И в чём разница в данном конкретном случае?
AB> Разница в том, что сопровождение кода с $^W - лишние и совершенно
AB> ненужные проблемы для того, кто будет дальше этим заниматься. Да и для
AB> тебя
AB> самого через пару лет, когда ты совершенно забудешь - зачем тут это $^W и
AB> что оно должно означать.
EG> Когда я вижу конструкцию $^W=0; call_some_func; $^W=1; - она обозначает
EG> ровно одно, отключение варнингов.
Пффф. Hе надо только подобную кривулину новичкам советовать, вот и
все.
AB> Давай рассмотрим две ситуации:
AB> 1. когда код, обернутый в $^W=0; $^W=1 умрет:
AB> eval {
AB> $^W = 0;
AB> die 'Hey warning';
AB> $^W = 1;
AB> }
AB> print $^W,"\n";
AB> Какое число тебе напечатают?
EG> $ perl -e 'eval { $^W = 0; die "Hey warning"; $^W = 1; }; print $^W,"\n";'
EG> 0
EG> С perl -we то же самое.
EG> И нет, я не использую модули, в которых вызов die() нельзя отключить :-)
Вызов die - это штатный и бесплатный способ сообщить наверх об
исключительной ситуации. А eval {} - аналогично бесплатный способ эту
ситуацию перехватить. Опять же, увеличивает читаемость кода. Я лично часто
для всяких builtins типа open/close/etc использую use Fatal.
AB> Да, очевидно что локализовав $^W можно решить обе эти проблемы:
AB> eval {
AB> local $^W = 0;
AB> die 'Hey warning';
AB> };
AB> Hо если сравнить читаемость этого кода с
AB> eval {
AB> no warnings;
AB> die 'Hey warning';
AB> };
AB> Мне так представляется что выбор очевиден.
EG> Я привык к $^W, потому что warnings нету в 5.5.3 :-)
Вот так бы сразу и сказал. Hо советовать подобное не надо. Ибо за годы
с момента появления 5.5.4 мир существенно изменился. И с ростом объема кода
в проектах эти конструкции все сильнее начинают тянуть на дно, как камни. С
каждой новой тысячей строк в проекте все сложнее разобраться, если не
придерживаться изначально базовых правил, повышающих читаемость кода.
find core www parser \( -name "*.p[ml]" -and -not -name "migrate.pl" \)
-print0 | xargs -0 wc -l | grep total
36444 total
И даже в 5.5.3 это не отменяет необходимости локализовать $^W.
В общем, тому, чей был оригинальный вопрос
1. Поставить perltidy.
2. Поставить perlcritic.
3. Прочитать camel book.
4. Прочитать perl best practices.