编辑perl中的文件内容

yan*_*kel 1 perl file-handling

我想读取一个输入文件,然后删除一行,如果它匹配我的正则表达式.并保存文件没有该行.

我已经写了

open(my $fh, '<:encoding(UTF-8)', $original_file_path or die "Could not open file $original_file_path $!";

while (my $line = <$fh> ) {
    chomp $line;
    if ($line ~=/myregex/){
        delete line from file
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢

Dad*_*ada 6

您可以修改一个文件的地方使用-i标志.

在您的情况下,一个简单的一个班轮将做:

perl -i -ne 'print unless /myregex/' the_name_of_your_file
Run Code Online (Sandbox Code Playgroud)

如PerlDuck所述,如果您希望保留原始文件的副本,则可以:在-i标志之后添加扩展名,如-i.bak-i~,然后原始文件将在其名称后保留此扩展名.

您可以在perlrun上找到有关就地文件修改的更多信息.

请注意,如果您使用的是Windows(MS-DOS),则需要为备份文件指定一个扩展名,以后可以自由删除.看到这个链接.

您可以通过设置$^I为不同的值来在脚本中获取相同的行为undef.例如:

#!/usr/bin/perl
use strict;
use warnings 'all';

{
    local @ARGV = ( $original_file_path );
    local $^I = ''; # or set it to something else if you want to keep a backup
    while (<>) {
        print unless /myregex/
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经习惯了local @ARGV,如果你已经有了东西@ARGV,它不会造成任何麻烦.如果@ARGV是空的,那push @ARGV, $original_file_path也没关系.


但是,如果您在脚本中有更多的事情要做,您可能更喜欢完整的脚本而不是单行.在这种情况下,您应该读取输入文件,并将要保留的行打印到另一个文件,然后move将第二个文件打印到第一个文件.

  • 您还可以在`-i`开关中添加(可选)扩展名,例如`perl -i.bak -ne ...`.然后原始(未更改的)文件保留一个`.bak`扩展名(如果你弄乱你的正则表达式). (2认同)