Почему Perl жалуется на "Использование неявного разделения на @_ не рекомендуется"? - PullRequest
26 голосов
/ 13 марта 2010

Этот код вызывает жалобу ниже:

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

Ответы [ 3 ]

33 голосов
/ 13 марта 2010

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

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

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

или

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

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

15 голосов
/ 13 марта 2010

Пусть Диагностика предоставьте больше информации:

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
10 голосов
/ 13 марта 2010

Из split документов:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...