Я могу подтвердить, что он работает в 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.