Perl скрипт работает на 5.8.4 и 5.12.4, но не на 5.10.0 - PullRequest
3 голосов
/ 11 ноября 2011

У меня есть скрипт ниже от пользователя.При запуске на Perl 5.8.4 и 5.12.4, он печатает 1, но не в 5.10.0 (печатает 0).

perl  -e ' my $a=0; my $net="<*2>ColBnk<2"; if (($net =~ s/([(<])/$1/g) != ($net =~ s/([>)])/$1/g)){$a++} print $a;'

Это проблема с кодом (сравнение строковой переменной с != вместо ne или это может быть из-за отсутствия точки с запятой после $a++).Я попытался отладить его, напечатав значения ($net =~ s/([(<])/$1/g) и ($net =~ s/([>)])/$1/g), и оба печатают одно и то же значение.Пожалуйста, используйте приведенный ниже код

use strict;
use warnings; 


#/mu/bin/perl  -e '
 my $a=0; 
 my $net="<*2>ColBnk<2"; 

 my $test="<*2>ColBnk<2"; 
 $test =~ s/([(<])/$1/g;
 print "\n$test" ;
 $test =~ s/([>)])/$1/g;
 print "\n$test" ;

 if (($net =~ s/([(<])/$1/g) ne ($net =~ s/([>)])/$1/g)){$a++;} 

 print "\n Value of a =$a";

 #'

Не могли бы вы предоставить любые указатели.Спасибо за помощь, Ашиш

1 Ответ

8 голосов
/ 11 ноября 2011

Я могу подтвердить, что он работает в 5.8.9 и 5.14.2, но не работает в 5.10.0. Это должна быть ошибка, введенная где-то между 5.8 и 5.10, и впоследствии исправленная. Я использовал Porting / bisect.pl, чтобы узнать, где он сломался. Это был этот коммит , который был представлен в Perl 5.9.4. Затем он был исправлен этим коммитом , который был представлен в Perl 5.10.1.

Когда я пытался использовать bisect.pl, я продолжал получать сообщение о необходимости иметь компилятор C (хотя он у меня установлен). Оказывается, что bisect.pl не использует обычное обнаружение компилятором скрипта Perl Configure (предположительно, чтобы сэкономить время). Если значение по умолчанию не работает, вам нужно использовать параметр -D в bisect.pl, чтобы установить его. (например, я использовал -D{cc,ld}=/usr/bin/gcc).

Точное изменение, вызвавшее ошибку, можно найти, выполнив следующие шаги:

$ git clone git://perl5.git.perl.org/perl.git
$ mkdir perl-bisect
$ cd perl
$ cp -a Porting/bisect* ../perl-bisect/
$ ../perl-bisect/bisect.pl --target=miniperl --end=v5.10.0 --start=perl-5.8.4 \
  -e 'my $a=0; my $net="<*2>ColBnk<2"; if (($net =~ s/([(<])/$1/g) != ($net =~ s/([>)])/$1/g)){$a++} die unless $a;'

Если вам необходимо использовать Perl 5.10.0, то вы можете обойти ошибку, сохранив результат каждого s///g во временной переменной, а затем сравнив две переменные:

perl -e 'my $a=0; my $net="<*2>ColBnk<2"; my $x = ($net =~ s/([(<])/$1/g); my $y = ($net =~ s/([>)])/$1/g); if ($x != $y){$a++} print $a;'

Но лучшим решением является обновление до фиксированной версии. Perl 5.10 официально закончен, но вы в любом случае можете установить 5.10.1, если не хотите вносить большие изменения. Или вы можете обновить до 5.12 или 5.14.

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