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