此处我尝试将文件从# start data
拆分为# end data
,如果字符串'Pen'或'Laptop'存在,代码应该继续
写入文件,如果不是,则应写入out文件。
Input
# start data a1
Data1 Book 1234
Data1 Pen 54635
Data1 Laptop 4567
Data1 Lens 6473
# end data a1
# start data a2
Data2 Book 1234
Data2 Box 54635
Data2 Card 4567
Data2 Lens 6473
# end data a2
Expected ouput
# start data a2
Data2 Book 1234
Data2 Box 54635
Data2 Card 4567
Data2 Lens 6473
# end data a2
使用的代码截图:
#!/usr/local/perl
use warnings;
use strict;
open(filein, "<Input.txt");
open(fileout, ">ouput.txt");
my @array;
my $strt =qr/^#\sstart\sdata/;
my $end=qr/^#\send\sdata/;
while(<filein>)
{
@array= split(/$strt/../$end/,$_);
foreach my $i(@array)
{
if($i =~ /Pen|Laptop/)
{
next;
}
else
{
print fileout "$_";
}
}
}
close(filein);
close(fileout);
Obtained Output from the above snippet
# start data a1
Data1 Book 1234
Data1 Book 1234
Data1 Pen 54635
Data1 Laptop 4567
Data1 Lens 6473
# end data a1
# start data a2
Data1 Book 1234
Data1 Book 1234
Data1 Box 54635
Data1 Box 54635
Data1 Card 4567
Data1 Card 4567
Data1 Lens 6473
# end data a2
答案 0 :(得分:1)
range operator不能用作split的参数 - 它需要/PATTERN/
。
我无法解释您从代码中获得的结果,错误地使用了split。它真的很奇怪!
对您的代码提出一些意见。
你是using
严格和警告。找到正在开发的代码中的错误的好方法
您应该使用首选的3参数打开文件,更喜欢使用词法文件句柄,$in
使用裸字文件句柄filein
。并且应始终检查文件是否已正确打开. . . or die $!
。
open(filein, "<Input.txt");
更好地写为 - open my $in, '<', 'Input.txt' or die $!;
print fileout "$_";
$_
周围的引号是不必要的,只需打印$_
变量
使用某些perl功能获取所需输出的工作程序可以是(下面) -
open my $out, '>', 'file2' or die $!;
{
local $/ = "# end data\n";
while (<$in>) {
print $out $_ unless /Pen|Laptop/;
}
}
默认输入记录分隔符为\n
。在这里,我将它(块的本地)定义为"# end data\n"
。
(在这种情况下创建一个块是不必要的,但通常应这样做,以便当块超出范围时,输入记录分隔符重新获得它的先前值 - 这里是默认值\n
。local
仅使用块范围内指定的值
所以,这个程序一次读取行的行而不是一行,(因为$/
分隔符是"# end data\n"
而不是"\n"
。
答案 1 :(得分:0)
将为您提供几乎所需的输出
#!/usr/bin/perl
open (FH,"text.txt") || die "Not able to open text.txt $!";
@values=();
while($line = <FH>)
{
unless($line=~/end data/)
{
chomp($line);
push(@values,$line);
next;
}
if ( grep{ $_ =~ /Pen|Laptop/i} @values )
{
@values=();
}
else
{
open(FH2,">>newtext.txt") || die "Not able to open newtext.txt $!";
foreach (@values)
{
print FH2 "$_\n";
}
close(FH2);
@values=();
}
}
close(FH);
text.txt的内容: -
# start data a1
Data1 Book 1234
Data1 Pen 54635
Data1 Laptop 4567
Data1 Lens 6473
# end data a1
# start data a2
Data2 Book 1234
Data2 Box 54635
Data2 Card 4567
Data2 Lens 6473
# end data a2
# start data a3
Data2 Book 1234
Data2 Box 54635
Data2 Lamp 4567
Data2 Lens 6473
# end data a3
在newtext.txt中输出: -
# start data a2
Data2 Book 1234
Data2 Box 54635
Data2 Card 4567
Data2 Lens 6473
# start data a3
Data2 Book 1234
Data2 Box 54635
Data2 Lamp 4567
Data2 Lens 6473