Perl-Übereinstimmung außerhalb von "if" setzt $ 1 in Schleife nicht zurück

Ich arbeite daran, die Zoidberg Perl-Shell zu patchen, um einige Fehler zu beheben, die moderne Perl-Versionen beim Testen verursachen. Beachten Sie, dass ich nicht der ursprüngliche Autor bin und ihn auch nicht kritisiere. Ich bin auf ein interessantes Problem gestoßen, über das ich gerne ein wenig Geschichte hätte.

Der folgende Code akzeptiert eine Reihe von Eingaben und für jedes Striping und Endsigil. Dann speichert es dieses Sigill in einer Variablen, wenn es es nicht gefunden hat, speichert es stattdessen 0. Der Code, der sich in der Originaldatei befand, sah aus wie Test A und muss bis einschließlich Perl v5.8 funktioniert habe cpantesters Ergebnisse. Das Problem ist jedenfalls, dass die Variable $ 1 beim Schleifen mit dem letzten Wert erhalten bleibt, wenn sich das s /// nicht in einem "if" -Test befindet. Hier sind meine Tests. Ich habe mich gefragt, ob die Leute erklären können, warum dies passiert und / oder warum es früher funktioniert hat. Ich glaube, ich verstehe, was passiert.

#!/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";
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage