Perl совпадение вне "если" не сбрасывает $ 1 в цикле - PullRequest
4 голосов
/ 28 октября 2010

Я работаю над исправлением оболочки Zoidberg Perl, чтобы исправить некоторые ошибки, которые выдают современные версии Perl при тестировании. Обратите внимание, я не являюсь первоначальным автором и не критикую его. Я столкнулся с интересной проблемой, о которой я хотел бы рассказать немного истории.

Приведенный ниже код принимает массив входных данных и для каждого снимает и заканчивает сигил. Затем он сохраняет этот сигил в переменной, если он не нашел, что он хранит 0 вместо этого. Код, который был в исходном файле, выглядел как тест А и должен был работать до и включая perl v5.8 с cpantesters результатами. В любом случае проблема заключается в том, что если s /// не находится внутри критерия «если», то после зацикливания переменная $ 1 сохраняется с последним значением. Вот мои тесты. Мне было интересно, могут ли люди объяснить, почему это происходит и / или почему это работало, я думаю, что понимаю, что происходит.

#!/usr/bin/perl

use strict;
use warnings;

my @a = qw/n a$ b@ c/;
my @b = @a;
my @c = @a;

print "Test A -- Doesn't work (c !-> 0)\n";
for (@a) {
  s/([\$\@\%])$//;
  my $arg = $1 || 0;
  print $_ . " -> " . $arg . "\n";
}

print "\nTest B -- Works\n";
for (@b) {
  my $arg;
  if (s/([\$\@\%])$//) {;
    $arg = $1;
  }
  $arg ||= 0;
  print $_ . " -> " . $arg . "\n";
}

print "\nTest C -- Works, more clever\n";
for (@c) {
  my $arg = s/([\$\@\%])$// ? $1 : 0;
  print $_ . " -> " . $arg . "\n";
}

1 Ответ

7 голосов
/ 28 октября 2010

С perlre :

ПРИМЕЧАНИЕ: Неудачные совпадения в Perl не сбрасывают переменные совпадения, которые облегчает написание кода, который тесты для серии более конкретных дела и помнит лучший матч.

Но вы правы, тест А сработал так же, как два других в 5.8.9. Я не могу найти ничего в примечаниях к выпуску 5.10.0 , которые бы это объясняли, но в 5.10 были многочисленные изменения RE, и одно из них должно было повлиять на это. Я не думаю, что поведение 5.8 когда-либо было задумано.

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