2015-10-20 2 views
-1

Я сравниваю две строки, такие как (textid, citeid).Как объявить строку сравнения бесконечного цикла?

Если два Идентификаторы (textid, citeid) равны соответствующий uniqueid следует заменить в textid в течение всего текста Citation Части.

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

Я бы просмотрел файл по строкам, сохранил числа в хэше с текстом в качестве ключа, а затем сохранил там все уникальные идентификаторы, а затем построил ваш вывод из этого. Разумеется, вы также можете использовать slurp, как вы делаете, а затем захватить все текстовые объекты в массив и т. Д., Но я бы нашел линейную линию проще. – bytepusher

ответ

0

Функция сравнения строк не работает для бесконечного цикла (while или do-while)

Это не так. Фактически вы не меняете значения $textid или $citeid в вашем цикле, поэтому ваше состояние всегда true.

Я предполагаю, что у вас возникли аналогичные проблемы к вашему предыдущему вопросу: How to match the two same id and import the required ids

Но проблема остается тем же самым. Цикл while продолжает выполняться до тех пор, пока условие его тестирования больше не будет удовлетворено.

Потому что вы не измените $textid или $citeid внутри вашей петли, вы просто применяя тот же текст преобразования снова и снова $String_Match (может быть. Если он никогда не совпадает в первую очередь, преобразование даже не применяется , вы просто ходить по кругу, ничего не делая вообще.

на самом деле, это довольно трудно сказать, в первую очередь, что вы планируете свой while (или if) цикл, чтобы фактически сделать в первую очередь.

Что может быть полезно знать, так это то, что perl имеет hash эс. Вы можете прочитать о них в 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; 

Это построит вам хэш ассоциирования «процитировать идентификаторы» и «уникальные идентификаторы» из вашего списка ссылок.

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

Что вы можете использовать в остальной части своего сценария как часть поиска и замены.

Смежные вопросы