1

我不能让它工作。

#!/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”附近

谢谢你教这只老狗...

4

3 回答 3

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
于 2012-05-11T13:20:52.437 回答
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);
}
于 2012-05-11T14:41:20.643 回答
0

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

local @ARGV = $filetoopen;
local $^I = '.bak';
local $_;
while (<>) {
   print if !/^$id$/;
}
于 2012-05-11T17:41:51.860 回答