2014-11-18 4 views
1

Я пытаюсь получить линию по линии распечатки для следующих целей:Perl чтения и печати Линия по линии

My info 


info | info | info | 
------------------------- 
1 | 1 | 
2 
3 
. 
. 
. 

Я использую это код, но он не может печатать, как я ожидал.

use strict; 
use warnings; 

my $file = 'myfile.txt'; 
open my $info, $file or die "Could not open $file: $!"; 

while(my $line = <$info>) { 

    if ($line =~ /info | info | info | /) { 
     print $line;  
     last if $. == 10; 
    } 
} 
close $info; 

Есть что-то в коде?

Ожидаемый результат должен распечатать на CMD

info | info | info | 
------------------------- 
1 | 1 | 
2 
3 
. 
. 
. 
+3

Труба (|) является специальным символом в регулярных выражениях – harmic

+1

Что вы ожидаете от печати? – harmic

+0

@harmic Я ожидаю, что он распечатает часть из «Моя информация». его текстовый файл – user1204868

ответ

3

Как насчет:

use strict; 
use warnings; 

my $file = 'myfile.txt'; 
open my $info, $file or die "Could not open $file: $!"; 
my $print = 0; 
while(my $line = <$info>) { 
    $print = 1 if $line =~ /^info/; 
    print $line if $print; 
    last if $. == 10; 
} 
close $info; 

Обновление по любому комментарий:

Если вы хотите, чтобы соответствовать info: ** info, вы должны бежать метасимволы (здесь * характер):

$print = 1 if $line =~ /^info: \*\* info/; 

и, если есть дополнительные места:

$print = 1 if $line =~ /^\s*info:\s*\*\*\s*info/; 
+0

Спасибо! Но я не вижу распечатки в командной строке. – user1204868

+0

@ user1204868: Может быть, у вас есть пробелы перед словом 'info'? Измените регулярное выражение на: '/^\ s * info /'. – Toto

+0

Могу я проверить с помощью u, что если есть * и: в строке, на которой мне нужно посмотреть информацию. Например, я пытаюсь сделать это/^ info: ** info /, есть ли способ включить * и:? – user1204868

1

Пожалуйста, попробуйте это.

while(<DATA>) { print $_, unless($_!~m/^$/ && $_!~m/My info/i && $. >= '10'); } 

__DATA__ 
My info 
info | info | info | 
------------------------- 
1 | 1 | 
2 
3 
. 
. 
. 
+0

Спасибо! Но информация в моем текстовом файле не является фиксированным текстом. Строка «1» может стать 4 | 2 | и т. д. – user1204868

+0

Должен ли я знать, как вы хотите распечатать текст по строкам или шаблону? Поскольку я сказал код для печати каждой строки (Содержит значение), должен быть напечатан как результат. Благодарю. – ssr1012

+0

дальнейшее понимание вы будете печатать выходные данные, соответствующие вашему входу – ssr1012

4

идиоматических способ сделать это в Perl будет использовать the range operator, широко известный как флип-флоп:

perl -ne'print if /^info/ .. eof' yourfile.txt 

В программе файл это будет be:

use strict; 
use warnings; 

while (<>) { 
    print if /^info/ .. eof; 
} 
+0

Преимущество с 'eof' заключается в том, что он позволяет использовать несколько файлов. – TLP

+0

'$ .' никогда не должно быть' 0', хотя 'eof' делает более четкое намерение. –

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