perl中的文本文件操作

时间:2017-08-26 18:19:29

标签: perl

此处我尝试将文件从# 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     

2 个答案:

答案 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"

(在这种情况下创建一个块是不必要的,但通常应这样做,以便当块超出范围时,输入记录分隔符重新获得它的先前值 - 这里是默认值\nlocal仅使用块范围内指定的值

所以,这个程序一次读取行的行而不是一行,(因为$/分隔符是"# 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