Почему Perl жалуется, что “Использование неявного разделения к _ удерживается от использования”?

Этот код инициировал жалобу ниже:

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

26
задан toolic 12 March 2010 в 22:14
поделиться

3 ответа

Вы используете split в скалярном контексте, а в скалярном контексте он разбивает на массив @_. Perl предупреждает вас, что вы, возможно, только что расщепили @_. (Дополнительную информацию см. в perldoc split).

Чтобы получить количество полей, используйте следующий код:

my @items = split(/\s+/, $s);
my $num_of_item = @items;

или

my $num_of_item = () = split /\s+/, $s, -1;

Примечание: Трехаргументная форма split() необходима, потому что без указания ограничения split отделит только один фрагмент (на один больше, чем нужно в задании). задании).

33
ответ дан 28 November 2019 в 06:48
поделиться

Из документации split:

В скалярном контексте возвращает количество найденных полей. В скалярном и void контексте разбивает на массив @_. Однако использование split в скалярном контексте и контексте void не рекомендуется, так как он искажает аргументы вашей подпрограммы.

Итак, поскольку вы используете его в скалярном контексте, он разделяет массив @_, что является устаревшим использованием. (Он должен делать разбиение, так как это сломало бы старый код, ожидающий, что он будет разбиваться на @_ - насколько я знаю, нет способа обойти предупреждение без присваивания во временный массив. Евгений Y явно указал это в своем ответе)

.
10
ответ дан 28 November 2019 в 06:48
поделиться

Пусть 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
15
ответ дан 28 November 2019 в 06:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: