Переменная по умолчанию Perl $ _ или @_ ведет себя по-разному в OS X и Linux, используя split? - PullRequest
2 голосов
/ 28 марта 2012

Я новичок в Perl, и искали долго и упорно для ответа на эту проблему, но я застрял

1002 * Рассмотрим следующий пример:.
my $filein = $ARGV[0];
open(SNPIN,$filein);

while(<SNPIN>)
{
   chomp;
   split(/\s+/);
   print "$_[0]\n";
}

close(SNPIN);

Тестовый файлЯ использую следующие строки:

This is a test.
Is a test.
A test.

Этот скрипт прекрасно выполняется на наших серверах Linux (с Perl 5.10), выводит первое слово каждой строки - хотя он выдает мне следующее предупреждение:

Use of implicit split to @_ is deprecated at scan_test.pl line 7.

но когда я пытаюсь выполнить его на моей локальной машине под управлением OS X (с perl 5.12.3), я получаю следующую ошибку:

Useless use of split in void context at scan_test.pl line 7.
Use of uninitialized value $_[0] in concatenation (.) or string at 
scan_test.pl line 8, <SNPIN> line 1.

Очевидно, что это фиктивный скрипт.Я унаследовал чей-то чрезвычайно длинный и сложный скрипт, который работает на наших серверах, но я хотел бы разработать его локально, не просматривая весь скрипт и переназначая все вызовы переменных по умолчанию другой переменной.Независимо от того, что я пробовал (включая «использовать v5.10;»), ничто не позволит мне использовать переменную по умолчанию на моем локальном компьютере.

Есть идеи?Помощь очень ценится.

1 Ответ

7 голосов
/ 28 марта 2012

Это не платформа, а версия Perl.

Предупреждение, которое вы получили на Perl 5.10, должно было быть подсказкой: устарело означает "вы не должны использовать это, потому что этособираюсь перестать работать в какой-то более поздней версии ".Очевидно, он перестал работать где-то между Perl 5.10 и 5.12.


Чтобы исправить это, просто явно назначьте список, возвращаемый split, в массив.Если вы хотите продолжать использовать @_, это должно сработать:

chomp;
@_ = split(/\s+/);
print "$_[0]\n";

, но я бы действительно рекомендовал использовать собственный именованный массив, поскольку @_ имеет особое значение (он используется для передачи параметров вподпрограммы):

chomp;
my @items = split(/\s+/);
print "$items[0]\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...