2013-12-21 2 views
3

Вот similiar question. У меня есть этот исходный файл и я хочу поставить Блю записи в blue.out и Green записей в green.out. Куда я иду отсюда?Как сгенерировать два файла из одного источника в Perl?

Blue 1-3 
a 
b 
Green 1-3 
d 
e 
Blue 4-6 
i 
j 
Blue 7-9 
m 
n 
Green 4-6 
p 
q 
Green 7-9 
s 
t 

Нужные Выходные Два файла blue.out и green.out

blue.out   green.out 
------------------------------ 
a     d 
b     e 
i     p 
j     q 
m     s 
n     t 

Вот мой код

use strict; 
use warnings; 
my $blue = 'Blue'; 
my $green= 'Green'; 

while (<>) { 
    if (/$blue/) { 
     open(BLUEOUT,">>blue.out"); 
    print BLUEOUT $_ ; 
} 
    if (/$green/) { 
     open(GREENOUT,">>green.out"); 
    print GREENOUT $_ ; 
} 
} 

ответ

4
open my $blue, ">", "blue.out" or die "could not open output file blue.out: $?"; 
open my $green, ">", "green.out" or die "could not open output file green.out: $?"; 

my $curr = undef; 

while (<>) 
{ 
    if (/Blue/) { $curr = $blue; next; } 
    if (/Green/) { $curr = $green; next; } 
    print $curr $_ if defined $curr; 
} 

close $blue; 
close $green; 
+1

Вау - сходство замечательно! –

3

Это, вероятно, лучше õpe n файлы перед циклом. Также лучше всего использовать лексические файлы. Затем вы можете использовать «зеленые» и «синие» линии для переключения между файловыми дескрипторами, пропуская эту строку, в противном случае печатая в текущем файле.

open my $green, '>', "green.out" or die; 
open my $blue, '>', "blue.out" or die; 

my $output; 

while (<>) 
{ 
    if (m/^Green/) { $output = $green; next; } 
    if (m/^Blue/) { $output = $blue; next; } 
    die "No colour specified yet" if !defined $output; 
    print $output $_; # NB: no comma! 
} 

Предупреждение: непроверенный код!

+2

Хех ... мы писали почти идентичный код! –

3

Вот еще один вариант:

use strict; 
use warnings; 

my ($file, %fh); 
while (<>) { 
    if (/^([A-Z][a-z]+.+?)(?=\s+\d+-\d+$)/) { 
     $file = lc $1; 
     open $fh{$file}, '>', $file . '.out' or die 
      if !exists $fh{$file}; 
    } 
    else { 
     print { $fh{$file} } $_; 
    } 
} 

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

Надеюсь, это поможет!

+0

Для выборочных данных производительность вряд ли будет проблемой, но многократно открывает (и неявно закрывает) файлы довольно дорого - открытый файл - дорогостоящий системный вызов. Мы также можем обсуждать «.txt» и «.out» и имена файлов со всеми строчными и смешанными случаями, но вертеть - правильное слово. –

+0

@JonathanLeffler - Точка хорошо сделана. Исправлена. Я в первую очередь думал об отсутствии необходимости жестко кодировать имена файлов цветов. – Kenosis

+1

@JonathanLeffler: Этот бит кода, который я только что взломал, может быть излишним, но у вас никогда не будет слишком много переполнения: http://spatula-city.org/~im14u2c/dl/hash_open.pl –

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