Perl Regex пропускает строку - PullRequest
       0

Perl Regex пропускает строку

1 голос
/ 13 ноября 2011

Я пытаюсь сопоставить строку регулярного выражения с файлом данных в perl, но он постоянно пропускает точную строку, к которой я стремлюсь ... что здесь может быть не так?

Мой файл говорит:

<div class="definitionBox details" id="id-udt">
<span class="stempel">Udtale</span>
<span class="tekstmedium allow-glossing">
<span class="lydskrift"><span class="diskret">[</span>be&#712;g&#248;n&#704;&#601;<span class="diskret">]</span></span>
</span>

Я собираюсь перейти к строке класса "lydskrift", поэтому я пытался захватить ее содержимое несколькими способами, пока не закончил тем, что пытался сопоставить только что-то вроде этого:

while (<FILE>) {
    if ( <FILE> =~ m/(.+)/ ) {
        open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
        print (FARA $1 . "\n");
        close (FARA);
    }
}

Удивительно, но он продолжает давать мне это:

<div class="definitionBox details" id="id-udt">
<span class="tekstmedium allow-glossing">
</span>

Интересно, что он соответствует всем четырем строкам, если я помещу их в область DATA внутри одного и того же файла perl! Но это не то, что я хочу, так в чем здесь разница?

Ответы [ 2 ]

4 голосов
/ 13 ноября 2011

Прежде всего, я думаю, что в вашем файле есть еще одна строка вверху, которую вы не включили.Причина моего подозрения ниже:

Ваша проблема не в регулярном выражении, ваша проблема в том, что <FILE> читает строку каждый раз, когда вы ее вызываете.Таким образом, каждый цикл в вашем цикле читает одну строку в while(<FILE>), а затем еще одну в if(<FILE> =~ m/(.+)/).Ваш if должен быть именно таким:

if(m/(.+)/)

, чтобы он использовал переменную $_ по умолчанию, которую будет заполнять while(<FILE>).

Кроме того, ваш цикл whileвыполняет гораздо больше работы, чем нужно, вы можете просто сделать это:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
while(<FILE>) {
    print FARA;
}
close (FARA);

или даже это:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
print FARA while(<FILE>);
close (FARA);

Если вы пытаетесь пропустить пустые строки, тогдаможет быть это:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt';
while(<FILE>) {
        chomp;
        print FARA $_, "\n" if($_);
}
close (FARA);
2 голосов
/ 13 ноября 2011

Для построения на мю слишком короткое решение , вот как я бы это написал:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt' or die $!;
while (<FILE>) {
        print FARA if /./;
}
close FARA;

или, если вы также хотите пропустить строки, состоящие только из пробелов:

open FARA, '>>:encoding(UTF-8)', 'udtale.txt' or die $!;
while (<FILE>) {
        print FARA if /\S/;
}
close FARA;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...