Этот код инициировал жалобу ниже:
#!/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
". У меня действительно нет "контекста" для проблемы, таким образом, я ожидаю, что Вы помогаете объяснить что случилось с кодом.
Вы используете split
в скалярном контексте, а в скалярном контексте он разбивает на массив @_
. Perl предупреждает вас, что вы, возможно, только что расщепили @_. (Дополнительную информацию см. в perldoc split).
Чтобы получить количество полей, используйте следующий код:
my @items = split(/\s+/, $s);
my $num_of_item = @items;
или
my $num_of_item = () = split /\s+/, $s, -1;
Примечание: Трехаргументная форма split() необходима, потому что без указания ограничения split отделит только один фрагмент (на один больше, чем нужно в задании). задании).
Из документации split:
В скалярном контексте возвращает количество найденных полей. В скалярном и void контексте разбивает на массив @_. Однако использование split в скалярном контексте и контексте void не рекомендуется, так как он искажает аргументы вашей подпрограммы.
Итак, поскольку вы используете его в скалярном контексте, он разделяет массив @_
, что является устаревшим использованием. (Он должен делать разбиение, так как это сломало бы старый код, ожидающий, что он будет разбиваться на @_
- насколько я знаю, нет способа обойти предупреждение без присваивания во временный массив. Евгений Y явно указал это в своем ответе)
Пусть 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 синтаксис) Это создает много работы для компилятора, когда вы захламляете список аргументов подпрограммы, поэтому будет лучше, если вы присваиваете результаты split() в явном виде массиву (или списку).
Лучший способ получить диагностическую информацию - из командной строки:
perl -Mdiagnostics my_program.pl