perl中的文本文件操作
在这里,我试图将文件从perl中的文本文件操作,perl,Perl,在这里,我试图将文件从#开始数据拆分为#结束数据,如果字符串“Pen”或“Laptop”存在,则代码应继续执行,而不必删除 写入文件,否则应写入输出文件 Input # start data a1 Data1 Book 1234 Data1 Pen 54635 Data1 Laptop 4567 Data1 Lens 6473 # end data a1
#开始数据
拆分为#结束数据
,如果字符串“Pen”或“Laptop”存在,则代码应继续执行,而不必删除
写入文件,否则应写入输出文件
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
snipppet使用的代码为:
#!/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
#/usr/local/perl
使用警告;
严格使用;
打开(filein,“output.txt”);
我的@数组;
我的$strt=qr/^\sstart\sdata/;
我的$end=qr/^\send\sdata/;
while()
{
@数组=拆分(/$strt/./$end/,$);
foreach my$i(@array)
{
如果($i=~/Pen |膝上型电脑/)
{
下一个
}
其他的
{
打印文件输出“$”;
}
}
}
关闭(归档);
关闭(归档);
已从上述代码段获得输出
#起始数据a1
数据1第1234册
数据1第1234册
数据1笔54635
Data1笔记本电脑4567
数据1镜头6473
#结束数据a1
#起始数据a2
数据1第1234册
数据1第1234册
数据1框54635
数据1框54635
数据1卡4567
数据1卡4567
数据1镜头6473
#结束数据a2
不能用作的参数-它需要一个/PATTERN/
我无法解释您使用不正确的split使用代码得到的结果。它的行为真的很奇怪
对代码的一些注释
您正在使用严格和警告。在正在开发的代码中查找错误的良好实践
您应该使用首选的3参数打开文件,首选词法文件句柄,$in
而不是纯文字文件句柄,filein
。并且应该始终检查文件是否打开时没有错误,。要么死代码>
下面的脚本将为您提供几乎所需的输出
#!/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);
以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
您好,您已经显示了您的预期输出,但没有显示您当前的输出,或者您认为问题所在。您可以提出您的问题以更清楚地了解您需要什么吗?您好,我已经更新了我从代码中获得的输出。我想主要是我使用的正则表达式的问题。敬请建议您好,谢谢您的输入。但是我有一个问题或者怀疑我更改了输入格式。然后我尝试使用给出的代码,但它没有打印任何输出。我使用的表达式是(local$/=“#end data(.*)\n”。。输入中的更改在上述输入描述中更新,请建议“我更改了输入格式”“不要这样做-这会导致我的示例不正确。如果缓冲区中的行与笔或笔记本电脑不匹配,请使用缓冲区并打印行。
# 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
# 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