Perl - 一个衬垫文件编辑:“perl -n -i.bak -e”print除非/ ^ $ id $,/“$ filetoopena;”不工作

时间:2012-05-11 13:08:52

标签: perl file edit

我无法让它发挥作用。

#!/usr/bin/perl -w
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
my $id='123456'; 
my $filetoopen = '/home/user/public/somefile.txt';

文件包含:

123456
234564
364899
437373

所以... 一堆其他的潜艇和代码

if(-s $filetoopen){
     perl -n -i.bak -e "print unless /^$id$,/" $filetoopen;
}

我需要从文件$ filetoopen

中删除与$ id匹配的行

但是,如果$ id不在$ filetoopen中,我不希望脚本“崩溃”。

这是在.pl脚本子中,不是从命令行运行。

我认为我很接近但是,在这里读了几个小时后,我不得不求助于发布问题。

这甚至可以在脚本中使用吗?

我尝试了TIE但是,我需要知道如何在没有TIE :: FILE的情况下做到这一点。

当我尝试时,我收到错误:

在mylearningcurve.pl第456行的语法错误,靠近“bak -e”

感谢教这条老狗......

3 个答案:

答案 0 :(得分:2)

首先(这是问题的原因)$,(又名$OUTPUT_FIELD_SEPARATOR)默认为undef,我不知道你为什么要使用它在正则表达式。我觉得逗号是一个错字。

目前还不清楚你是从shell脚本还是从Perl调用它?


如果来自Perl,则根本不应该调用嵌套的Perl解释器。

如果文件很小,请将其啜饮并打印:

use File::Slurp;
my @lines = read_file($filename);
write_file($filename, grep { ! /^$id$/ } @lines);

如果文件很大,请逐行读取过滤器。

use File::Copy;
move($filename, "$filename.old") or die "Can not rename: $!\n";
open(my $fh_old, "<", "$filename.old") or die "Can not open $filename.old: $!\n";
open(my $fh, ">", $filename) or die "Can not open $filename: $!\n";
while my $line (<$fh_old>) {
    next if $line =~ /^id$/;
    print $fh $_;
}
close($fh_old);
close($fh);

如果来自shell脚本,这对我有用:

$ cat x1
123456
234564
364899
437373

$ perl -n -i.bak -e "print unless /^$id$/" x1

$ cat x1
234564
364899
437373

答案 1 :(得分:0)

if(-s $filetoopen){
     perl -n -i.bak -e "print unless /^$id$,/" $filetoopen;
}

我完全不确定你的期望。您不能只是将命令行程序放在Perl代码的中间。您需要使用system来调用外部程序。 Perl就像其他任何外部程序一样。

if(-s $filetoopen){
     system('perl', '-n -i.bak -e "print unless /^$id$,/"', $filetoopen);
}

答案 2 :(得分:0)

可以通过$^I访问-i命令行参数的功能。

local @ARGV = $filetoopen;
local $^I = '.bak';
local $_;
while (<>) {
   print if !/^$id$/;
}