如果在多行替换中死亡,Perl会报告错误的行号。这是预期还是错误?

时间:2016-03-16 08:28:31

标签: windows perl

当我运行以下代码时,脚本将以expected three at c:\temp\die.pl line 13.终止。

use warnings;
use strict;

my $text = 'one two Three';

$text =~ s{

  (\w+)  # Find a word
  \s+
  (\w+)  # Find another word
  \s+
  (\w+)  # Find third word

}{

   # Insert a few lines on purpose
   # to make the point.

   die 'expected one'   unless $1 eq 'one';
   die 'expected two'   unless $2 eq 'two';
   die 'expected three' unless $3 eq 'three';

}ex;

我有点惊讶,因为导致死亡的实际行是第21行。

当计算(?)死亡线时,解释器似乎不计算替换的模式部分。第6行将是$text =~ s{,然后是代码,直到}{被"跳过",使第7行成为以下空行,第8行# Insert a few lines on purpose,依此类推,直至达到{ {1}}计算了13行。

预计会出现这种情况吗?

有没有办法让perl打印真正的死亡线?

die 'expected three' unless $3 eq 'three';perl -v

开头

使用鲤鱼代替死亡

有人建议我使用This is perl 5, version 18, subversion 1 (v5.18.1) built for MSWin32-x86-multi-thread-64int代替carp

它现在已经死亡(或鲤鱼),只有稍微不同的die我将其归属于额外的第三行expected three at c:\temp\die.pl line 14

1 个答案:

答案 0 :(得分:4)

一点点调查显示:

v5.10.1在第13行死亡。
v5.18.4在第13行死亡。
v5.20.2在第21行死亡。
v5.22.0在第21行死亡。

然后在检查perldelta for 5.20后,我发现:

  

现在可以正确报告多行引号类运算符中的行号。 [perl#3643]

因此,似乎获得正确行号的唯一方法是升级到更高版本的perl。