Подтвердить что ты не робот

Почему 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". У меня действительно нет "контекста" проблемы, поэтому я ожидаю, что вы поможете объяснить, что случилось с код.

4b9b3361

Ответ 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 имеет это явно в своем ответ.)