2011-01-05 4 views
2

Я пытаюсь открыть файл, сопоставить определенную строку, а затем обернуть HTML-теги вокруг этой строки. Кажется ужасно простым, но, видимо, я что-то упускаю и не понимаю правильные сопоставленные шаблоны Perl.Perl pattern match variable question

Я соответствие строки с этим:

$line =~ m/(Number of items:.*)/i; 

который помещает всю строку в $ 1. Я стараюсь, чтобы затем распечатать мою новую строку:

print "<p>" . $1 . "<\/p>; 

Я ожидаю, что напечатать это:

<p>Number of items: 22</p> 

Однако, на самом деле я получаю это:

</p>umber of items: 22 

I «Пробовал всевозможные варианты - печатать каждый бит на отдельной строке, устанавливая $ 1 для новой переменной, используя $ + и $ & и т. д., и я всегда получаю тот же результат.

Что мне не хватает?

+0

То, что вы описали, работает на моей машине. Можете ли вы опубликовать фактический код, который вы используете? –

+1

Пожалуйста, укажите полный (но минимальный) код, который вы используете. –

ответ

3

Можете ли вы предоставить полный фрагмент кода, который демонстрирует вашу проблему? Я этого не вижу.

Одно дело быть осторожным в том, что $ 1 и друзья ссылаются на съемки с последнего успешного матча в этом динамическом диапазоне. Вы всегда должны убедиться, что матч завершается успешно, прежде чем использовать один:

$line = "Foo Number of items: 97\n"; 
if ($line =~ m/(Number of items:.*)/i) { 
    print "<p>" . $1 . "<\/p>\n"; 
} 
+0

Действительно хороший момент. Я был укушен 1 долларом и т. Д., Нависший над предыдущим матчем – justintime

9

У вас есть \ г в вашей игре, которая при печати результатов в искаженной выходе.

Редактировать: Чтобы объяснить далее, скорее всего, ваш файл имеет оконные строки \ r \ n окончания строки. chomp не удаляет \ r, который затем попадает в ваше жадное совпадение и приводит к неприятному выходу (\ r означает возврат к началу строки и продолжение печати).

Вы можете удалить \ г, добавляя что-то вроде

$line =~ tr/\015//d; 
+0

Это хорошее предположение, учитывая указанное поведение. Педантизм/разъяснение: 'chomp' не будет удалять' \ r' по умолчанию, но может, если вы измените '$ /'.Обычно это не обязательно, поскольку слой perlio будет преобразовывать между новыми линиями плат и логическими во время ввода/вывода. Предостережение заключается в том, что перевод не работает, если формат файла не соответствует платформе (например, обработка файла с использованием новых строк в стиле Windows на платформе * nix). –

+0

Кажется, проблема: я использую Cygwin и читаю текстовый файл Windows. Я был chomp() в строках, но, очевидно, не получал \ r. Это никогда не было проблемой с чем-либо, что я делал раньше, и способ замены текста не заставил меня задуматься об этом. Я теперь явно заменяю \ r, и он отлично работает. Благодаря! – jeff

3

Вы только что узнали (для дальнейшего использования), насколько опасно .* может быть.

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

$line =~ m/(Number of items:\s+\d+)/; 

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

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

  • Нет связанных вопросов^_^