Perl文件I / O问题:脚本擦除所有文件内容而不是仅删除数字。

时间:2014-11-21 03:40:28

标签: perl

我一直试图让这个Perl脚本删除文件中的数字行,并且遇到了一些问题。我是一个Perl菜鸟,我只用它来做这个家庭作业。不过,我做了很多研究,这段代码看起来应该可行,但不是从包含

的文本文件中删除数字
  

01现在是

     

02时间

     

03删除

     

04号码

我的脚本只删除整个文件内容。任何人都可以告诉我我的逻辑或语法有什么不对,或者它可能是什么?

#!/usr/bin/perl

open my $in, '<', "rmv_num_lines.txt" or die "Can't read from file.\n"; # open for reading

@array = <in>; # fill array with contents of file

open my $out, '>', "rmv_num_lines.txt" or die "Can't write to file.\n"; # open for writing

while( <$in> ){
        foreach $item(@array){
                if($item =~ /\d/){ # if line contains a digit
                        $item =~ s/\d/\n/; # erase digit, I think?
}
}
        print $out $_;  # print edited array into file
}

close $out;

2 个答案:

答案 0 :(得分:4)

  • 您使用@array = <in>;代替@array = <$in>;
  • 当您实际尝试使用while (<$in>)阅读文件时,它已被open '>'破坏。
  • s/\d/\n/不只是删除一个数字;它在其位置添加了换行符。

#!/usr/bin/perl

use strict;
use warnings;

my $qfn = 'rmv_num_lines.txt';

open my $in_fh, '<', $qfn
   or die "Can't open $qfn: $!\n";

my @lines = <$in_fh>;

open my $out_fh, '>', $qfn
   or die "Can't create $qfn: $!\n";

for my $line (@lines) {
    $line =~ s/^\d+ //;
    print $out_fh $line;
}

作为一个单行:

perl -i -pe's/^\d+ //' rmv_num_lines.txt

答案 1 :(得分:2)

请你试试这个:

#!/usr/bin/perl
open(my $fh_in, '<', "rmv_num_lines.txt");
my $temp = ""; #Create temporarily Scalar Variable
while (<$fh_in>)
{
    $_=~s/^\d+ //;
    $temp .= $_; #Sequence storage in the temp variable
}
close($fh_in); #Close the file before Creating the same
open(my $fh_out, '>', "rmv_num_lines.txt");
print $fh_out $temp;