如何在搜索/替换perl脚本中查找值并使用它们的减法

时间:2014-07-31 11:30:54

标签: regex perl

我需要从<fpage>327</fpage><lpage>335</lpage>这样的行中获取值,并使用它们的差异来替换NaN行中的<page-count count="NaN"/>

示例输入文件:

...many lines
<volume>74</volume>
<issue>3</issue>
<fpage>327</fpage>
<lpage>335</lpage>
...many lines
<counts><fig-count count="3"/><table-count count="2"/><equation-count count="0"/><ref-count count="37"/><page-count count="0"/></counts>
...many lines

所需的示例输出文件:

...many lines
<volume>74</volume>
<issue>3</issue>
<fpage>327</fpage>
<lpage>335</lpage>
...many lines
<counts><fig-count count="3"/><table-count count="2"/><equation-count count="0"/><ref-count count="37"/><page-count count="8"/></counts>
...many lines

以下是我正在尝试但我得到<page-count count="0"/>

while ( <$input> ) {
    my $fpage = $1 if $fpage =~ m/<fpage>(\d+)/;
    my $lpage = $1 if $lpage =~ m/<lpage>(\d+)/;
    my $pages = $lpage - $fpage;
    $_ =~ s!<page-count count="NaN"/>!<page-count count="${pages}"/>!;

    print {$output} $_;
}

我做错了什么?

2 个答案:

答案 0 :(得分:0)

您实际上并没有测试fpage和lpage的输入。尝试类似:

while ( my $in = <$input> ) {
    my $fpage = $1 if $in =~ /<fpage>(\d+)/;
    my $lpage = $1 if $in =~ /<lpage>(\d+)/;
    my $pages = $lpage - $fpage;
    $in =~ s!<page-count count="NaN"/>!<page-count count="${pages}"/>!;

    print {$output} $in;
}

注意:只有在while循环的每次迭代中都有匹配和替换的整个文本块时,这才有效。

答案 1 :(得分:0)

1)您的变量$fpage$lpage在每次迭代时都超出范围。您可以通过将其decleration移动到while循环之外来扩展范围。

2)=~没有做你想做的事情。命令$fpage =~ m/<fpage>(\d+)/告诉正则表达式在变量$fpage内搜索。要搜索的默认变量为$_,因此您对$_ =~的使用是多余的(并且样式不好)

3)如果NaN多次出现,那么您当前的代码只能捕获第一次出现。

my $fpage;
my $lpage;
while ( <$input> ) {
    $fpage = $1 if $fpage =~ m/<fpage>(\d+)/;
    $lpage = $1 if $lpage =~ m/<lpage>(\d+)/;
    my $pages = $lpage - $fpage;
    s!<page-count count="NaN"/>!<page-count count="${pages}"/>!;

    print {$output} $_;
}

这不会检查您在页数之前实际找到fpage和lpage。