2015-10-20 44 views
-1

我比较两个字符串,如(textid, citeid)如何声明字符串比较无限循环?

如果两个ID (textid, citeid)相等对应uniqueid应在textid在整个文本引用部分取代。

MWE:

#!C:\Strawberry\perl\bin\perl 

use strict; 
use warnings; 
use 5.010; 
open(IN,"$ARGV[0]\.html")||die("Input LaTeX filename without .html extension\n"); 
local $/; 
my $String_Match=<IN>; 

my ($textid) = $String_Match =~ m/textid="(.*?)"/; 
my ($citeid) = $String_Match =~ m/citeid="(.*?)"/; 
my ($uniqueid) = $String_Match =~ m/ref uniqueid="(.*?)"/; 

if ($textid eq $citeid) 
{ 
     if ($String_Match=~m/textid="(.*?)"/s) 
       { 
       $String_Match =~ s/textid="(.*?)"/textid="$uniqueid"/si; 
       } 
} 

print $String_Match; 

字符串比较eq功能不工作等(同时或做-同时)

上面MWE执行条件仅一次无限循环。但是我的所需输出textid在整个文件中应该被替换为uniqueid

我的输入文件:

Text Citation Part 
    <xref textid="Narain:1982">1</xref> 
    <xref textid="Nasir:2012">2</xref> 
    <xref textid="Yao:2011">3</xref> 
    <xref textid="Cogley:1968">4</xref> 

    Reference Citation Part 
    <ref uniqueid="j_zna-2014-0260_ref_001"><citeid="Narain:1982"></ref> 
    <ref uniqueid="j_zna-2014-0260_ref_002"><citeid="Nasir:2012"></ref> 
    <ref uniqueid="j_zna-2014-0260_ref_003"><citeid="Yao:2011"></ref> 
    <ref uniqueid="j_zna-2014-0260_ref_004"><citeid="Cogley:1968"></ref> 

我所需的输出文件:> out.txt

Text Citation Part 
<xref textid="j_zna-2014-0260_ref_001">1</xref> 
<xref textid="j_zna-2014-0260_ref_002">2</xref> 
<xref textid="j_zna-2014-0260_ref_003">3</xref> 
<xref textid="j_zna-2014-0260_ref_004">4</xref> 

Reference Citation Part 
<ref uniqueid="j_zna-2014-0260_ref_001"><citeid="Narain:1982"></ref> 
<ref uniqueid="j_zna-2014-0260_ref_002"><citeid="Nasir:2012"></ref> 
<ref uniqueid="j_zna-2014-0260_ref_003"><citeid="Yao:2011"></ref> 
<ref uniqueid="j_zna-2014-0260_ref_004"><citeid="Cogley:1968"></ref> 

请指点如何执行逻辑.....

+0

故意输入和输出的空白区别? – simbabque

+0

@simbabque我无法理解。你在说什么? – Vetri

+0

我会逐行浏览文件,以textid作为关键字将数字存储在散列中,然后将所有唯一ID存储在那里,然后从中构建您的输出。你当然也可以像你这样做,然后抓住所有textids到数组等,但我会逐行找到更简单。 – bytepusher

回答

0

字符串比较eq功能不适用于无限循环(while或do-while)

它不会。您实际上并未更改循环中$textid$citeid的值,因此您的条件为总是为真。

我假设你有一个类似的问题,您刚才的问题:How to match the two same id and import the required ids

但问题依旧。 A while循环继续执行,直到其测试条件不再满足。

因为你不改变你的循环中$textid$citeid,你只是将相同的文本转换遍地$String_Match(也许。如果它永远不会在第一时间匹配,甚至没有应用的变换,你只是去转转什么都不做。

事实上,这是相当难以在第一时间说你打算你的while(或if)环路什么摆在首位实际上做

知道什么可能是有用的是,perl有hash es。您可以在perldata中阅读它们 - 它们让您可以将键和值关联起来。

等,例如:

my $input_text = '<ref uniqueid="j_zna-2014-0260_ref_001"><citeid="Narain:1982"></ref>'; 

my ($cite_id) = $input_text =~ m/citeid="(.*?)"/; 
my ($unique_id) = $input_text =~ m/uniqueid="(.*?)"/; 

my %unique_id_for; 
$unique_id_for{$cite_id} = $unique_id; 

这将构建你一个哈希关联“引用标识”,并从您的参考列表“唯一ID”。

'Narain:1982' => 'j_zna-2014-0260_ref_001' 

然后,您可以在脚本的其余部分将其用作搜索和替换的一部分。