У меня есть несколько предупреждений, подобных следующему, которые часто появляются, когда Perl интерпретирует мой код:
Smartmatch is experimental at /home/user/www/cgi-bin/safari/lib/SAFARI/Data.pm line 395.
И несколько из того, где я переопределяю подпрограмму модуля CPAN, содержащую ошибки:
Subroutine Net::Amazon::S3::Client::Object::put_part redefined at /usr/local/share/perl5/FaithTree/Backup.pm line 65.
Оба они являются преднамеренными вещами в коде. Я нашел Smartmatch прекрасным инструментом, который я намеренно использую без каких-либо проблем, и я отменил эти подпрограммы именно потому, что они не работали должным образом в вышестоящем модуле. Есть ли «правильный» способ сказать Perl не показывать такие предупреждения? Если в них все еще есть потребность, есть ли правильный способ хотя бы обуздать их, чтобы они не перегружали журналы сервера?
Я прочитал еще один вопрос, который я мог бы использовать use experimental qw(smartmatch switch);
, чтобы скрыть предупреждение Smartmatch. Но я менее уверен, что делать с предупреждением о переопределении.
Я не уверен, что назвал бы Smartmatch «замечательным инструментом».
@TLP Есть ли причина избегать смарт-матча? Это конечно кажется полезным..
@demo Патч на самом деле находится в приложении - я просто поместил его в собственное пространство имен модулей, чтобы его можно было установить с помощью MakeMaker. Одно из исправлений уже отправлено вверх по течению; Мне также нужно отправить еще один отчет об ошибке. Спасибо!
@ TimothyR.Butler «Есть ли причина избегать смарт-матча?» --- тьфу, да; об этом много написано. Я предполагаю, что вы, вероятно, используете несколько основ, которые ясны, интуитивно понятны и не слишком сложны, и неудивительно, что это нравится. Не вдаваясь во все остальные подробности, главная проблема в том, что она почти наверняка будет изменена, и, вероятно, довольно сильно, и, возможно, до неузнаваемости — или того хуже. Таким образом, весь код, который его использует, должен был бы измениться.
Я не могу не подчеркнуть, что, отключив обязательное «экспериментальное» предупреждение, вы, как кодер, берете на себя полную ответственность за полный или странный случайный сбой вашего кода в будущем выпуске perl.
@TimothyR.Butler Smartmatch не делает ничего, чего нельзя было бы сделать без smartmatch. Ваш реальный вопрос должен быть «Как мне заставить мой код работать без Smartmatch», а не гораздо худшая альтернатива «Как мне скрыть предупреждения от экспериментальных функций».
@TLP Я полагаю, я должен исследовать это. Я нахожу это очень полезным для поиска массивов, в первую очередь.
Smartmatch недавно был объявлен устаревшим разработчиками Perl. Его планируется полностью удалить из Perl в Perl 5.42. См. nntp.perl.org/group/perl.perl5.porters/2022/12/msg265180.html.
use experimental qw(feature ...);
использовать экспериментальные функции без предупреждений. Чтобы подавить другие предупреждения, запустите свой код с включенной прагмой no warnings ...
, как описано в perldoc
no warnings 'redefine';
sub Someone::Elses::Package::my_monkey_patch_func { ... }
@c = (1, 2, undef, 4);
print join(";", @c); # emits warning
{
no warnings 'uninitialized';
print join(":", @c); # warning suppressed
}
Обратите внимание, что вы захотите применить это no warnings
к этой единственной строке, иначе оно будет применяться ко всей остальной части файла. { no warnings 'redefine'; sub ... }
.
Обратите внимание, что если вы пытаетесь исправить модуль в модуле, вы должны изменить его только для своих целей, а затем вернуть исходный код, чтобы это не повлияло на другой код. Демо