这是一个similiar question。我有这个源文件,我想把蓝色记录在blue.out和绿色记录在green.out中。我从这里要去哪里?
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 $_ ;
}
}发布于 2013-12-21 04:36:16
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;发布于 2013-12-21 04:38:07
最好在循环之前打开文件。也可能最好使用词法文件句柄。然后,您可以使用“绿色”和“蓝色”行在文件句柄之间切换,同时跳过该行,否则打印到当前文件。
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!
}警告:未经测试的代码!
发布于 2013-12-21 04:40:51
以下是另一个选择:
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} } $_;
}
}这将捕获文件名的颜色名称,并将这些颜色下面的字母写入这些文件。这避免了对颜色和文件名进行“硬编码”。
希望这能有所帮助!
https://stackoverflow.com/questions/20715381
复制相似问题