我无法让它发挥作用。
#!/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”感谢教这条老狗......
答案 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$/;
}