2014-01-16 6 views
1

У меня есть текстовый файл, содержащий следующие строки, как, напримерДобавить заголовки в виде текстового файла в Perl

This is line 
This is line with test 
This is ine with 2test 
This is line 2 
This is line 3 
This is line with 3test 
This is line 4 
This is line with 4test 

Теперь я хочу код, чтобы изменить текстовый файл следующим образом:

Lines with test 
This is line with test 
This is ine with 2test 
This is line with 3test 
This is line with 4test 

Lines without test 
This is line 
This is line 2 
This is line 3 
This is line 4 

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

#!/usr/bin/perl 
use strict; 
use warnings; 
open(FH, '<filetest.txt'); 
my @queues = <FH>; 
close(FH); 
open(OFH,'>testfile.txt'); 
my $name; 
foreach $name(@queues) 
{ 
if($name =~ 'test') 
{ 
print OFH "Lines with test\n"; 
print OFH $1; 
} 
else{ 
print OFH "Lines without test\n"; 
print OFH $1; 
} 
close(OFH); 
} 

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

+0

«из-за некоторые ошибки» - синтаксические ошибки, чтобы быть точными. Подсказка: источник ошибки может быть немного раньше места, где сообщалось об ошибке. Также обратите внимание, что '#' начинает комментарий строки, и что регулярные выражения должны использовать какую-то цитату из регулярного выражения, например '/ foo /'. Но даже после этого ваш код имеет различные ошибки. (1) Чтение и запись в тот же файл сразу не сработает. (2) Вы используете устаревший синтаксис для 'open' и не выполняете проверку ошибок. (3) '$ 1' не будет заполнен. Используйте '$ _'. (4) Вы выводите заголовок для * каждой строки *. Вместо этого сначала помещаем строки в массивы. (...) – amon

ответ

2

У попробовать с:

#!/usr/bin/perl 
use strict; 
use warnings; 

my $infile = 'filetest.txt'; 
my $outfile = 'testfile.txt'; 

# use 3-arg open and if open succeeded 
open my $fh_in, '<', $infile or die "Unable to open file '$infile' for reading: $!"; 

my @with_test; 
my @without_test; 
while (<$fh_in>) { 
    if (/test/) { 
     push @with_test, $_; 
    } else { 
     push @without_test, $_; 
    } 
} 
close $fh_in; 

open my $fh_out, '>', $outfile or die "Unable to open file '$outile' for writting: $!"; 
print $fh_out "Lines with test\n"; 
print $fh_out @with_test; 
print $fh_out "Lines without test\n"; 
print $fh_out @without_test; 

close $fh_out; 
+0

Спасибо M42. Это работает. Я на самом деле немного изменил свой скрипт, поэтому вывод записывается в самого вторжения. Мне не нужна копия инфила. Вы видите какую-либо проблему при этом? – user3164754

+0

@ user3164754: Добро пожаловать. Вы можете использовать тот же файл для ввода и вывода, потому что входной файл закрыт до его открытия для вывода. Но я бы сделал резервную копию перед обработкой ... – Toto

1

Я не проверял это. Идея заключается в том, чтобы написать «с помощью теста» строки в файл сразу «без теста» линия не сохраняется (в массиве с именем «без») до конца программы, а затем написала

#!/usr/bin/perl 
use strict; 
use warnings; 
open(FH, '<filetest.txt'); 
my @queues = <FH>; 
close(FH); 
open(OFH,'>testfile.txt'); 
my $name; 
my @without=(); 
foreach $name(@queues) 
{ 
if($name =~ 'test') 
{ 
    print OFH $name; 
} 
else{ 
    push @without, $name; 
} 
print OFH "\n\nlines without\n"; 
print OFH @without; 

} 
+0

Синтаксис 'push' не так, вы изменили порядок аргументов! – Toto

+0

@ M42 вы правы, исправили его – Vorsprung

0

также вы должны добавить local $/ перед чтением дескриптора файла. проверить это: how to read the whole file. Формат матча должен быть таким: if($somestr =~ /#/). , и вы не должны закрывать дескриптор файла в цикле.

#!/usr/bin/perl 

use strict; 
use warnings; 
local $/; 
open(FH, 'file#.txt'); 
my $s; 
$s = <FH>; 
close(FH); 
open(FH, '>file#.txt'); 
my @queues = split(/\n/, $s); 
my @arr; 
my @arr2; 
for($s=0; $s<$#queues+1; $s++) 
{ 

    if($queues[$s] =~ /#/) 
    { 
     push(@arr, $queues[$s]."\n"); 
    } 
    else 
    { 
     push(@arr2, $queues[$s]."\n"); 
    } 
} 
print FH "lines with #\n"; 
print FH @arr; 
print FH "lines without #\n"; 
print FH @arr2; 
+0

Зачем вам локализовать '$ /', а затем повторно реализовать его функции с помощью 'split'? Выход из '$ /' в одиночку и чтение всего файла в массив намного эффективнее. Кроме того, почему вы использовали цикл (C) для цикла (вместо этого) вместо цикла foreach? Вы также не должны повторно использовать '$ s'. Единственная часть этого ответа, которая лучше, чем вопрос, заключается в том, что вы нажимаете элементы на два массива. –

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

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