我需要从<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} $_;
}
我做错了什么?
答案 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。