Почему Perl жалуется: "Использование неявного split to @_ устарело"?
Этот код вызывает следующую жалобу:
#!/usr/bin/perl
use strict;
use warnings;
my $s = "aaa bbb";
my $num_of_item = split(/\s+/, $s) ;
print $num_of_item;
Когда я запускаю код, Perl жалуется, что "Use of implicit split to @_ is deprecated
".
У меня действительно нет "контекста" проблемы, поэтому я ожидаю, что вы поможете объяснить, что случилось с
код.
Ответы
Ответ 1
Вы используете split
в скалярном контексте, а в скалярном контексте он разбивается на массив @_
. Perl предупреждает вас, что вы, возможно, только что скрепили @_. (Подробнее см. perldoc split.
Чтобы получить количество полей, используйте этот код:
my @items = split(/\s+/, $s);
my $num_of_item = @items;
или
my $num_of_item = () = split /\s+/, $s, -1;
Примечание. Форма с тремя аргументами split() необходима, поскольку без указания предела разделитель будет отделяться только на одну часть (еще одна, чем требуется в
задание).
Ответ 2
Пусть diagnostics предоставляет дополнительную информацию:
use strict;
use warnings;
use diagnostics; # comment this out when you are done debugging
my $s = "aaa bbb";
my $num_of_item = split(/\s+/, $s) ;
print $num_of_item;
Использование неявного разделения для @_ устарело
(D устаревший, синтаксис W) Он много работает для компилятора, когда вы clobber список аргументов подпрограммы, поэтому лучше, если вы назначаете результаты split() явно в массив (или список).
Лучший способ получить диагностическую информацию - из командной строки:
perl -Mdiagnostics my_program.pl
Ответ 3
Из split docs:
В скалярном контексте возвращает количество найденных полей. В скалярном и пустотном контексте он разбивается на массив @_. Однако использование split в скалярном и void-контексте устарело, потому что оно clobbers ваши аргументы подпрограммы.
Итак, поскольку вы используете его в скалярном контексте, он разбивается на массив @_
, который является устаревшим использованием. (Это должно сделать раскол, хотя, поскольку он сломал старый код, ожидая, что он разделится на @_
- никоим образом не будет вокруг предупреждения, не назначая во временном массиве, насколько я знаю. Eugene Y имеет это явно в своем ответ.)