什么是在程序中模仿-pi的实际Perl代码?

Par*_*roX 1 regex perl sed

这似乎是多余的,从Perl脚本本身运行perl.

my $Pref = "&*())(*&^%$#@!"; 
system("perl -pi -e 's|^SERVERNAME.*\$|SERVERNAME \"\Q$Pref\E\"|g' pserver.prefs");
Run Code Online (Sandbox Code Playgroud)

什么是模拟-pi的实际Perl代码?我只想要一些像Perl上的sed一样的东西,尽可能简单.


基于Todd Gardner的网站,它似乎基本上只是读取和写入所有文件,试图将正则表达式应用于每一行.对于像我这样的noob Perl用户来说,解决方案有点复杂,所以我使用以下方法将其缩小:

my $ftp = "/home/shared/ftp";
my $backup = $ftp . ".bak";
rename($ftp, $backup);
open (FTP, "<", $backup) or die "Can't open $backup: $!"; 
open (FTP_OUT, ">", $ftp) or die "Can't open $ftp: $!"; 
    while (<FTP>)
    {
        $_ =~ s|$panel_user \Q$panel_oldpass\E |$panel_user \Q$panel_newpass\E |g;
        print FTP_OUT $_;
    }
close(FTP);
close(FTP_OUT);
Run Code Online (Sandbox Code Playgroud)

使用两个打开有什么问题吗?应该避免这种情况还是简单的解决方案?

我必须承认,系统sed命令更简单,更清晰.

Tod*_*ner 8

查看perlrun,详细介绍了这些选项.特别是,它提出了一些选择:

从壳,说

$ perl -p -i.orig -e "s/foo/bar/; ... "
Run Code Online (Sandbox Code Playgroud)

与使用该程序相同:

#!/usr/bin/perl -pi.orig
s/foo/bar/;
Run Code Online (Sandbox Code Playgroud)

这相当于

#!/usr/bin/perl
$extension = '.orig';
LINE: while (<>) {
if ($ARGV ne $oldargv) {
    if ($extension !~ /\*/) {
    $backup = $ARGV . $extension;
    }
    else {
    ($backup = $extension) =~ s/\*/$ARGV/g;
    }
    rename($ARGV, $backup);
    open(ARGVOUT, ">$ARGV");
    select(ARGVOUT);
    $oldargv = $ARGV;
}
s/foo/bar/;
}
continue {
print;  # this prints to original filename
}
select(STDOUT);
Run Code Online (Sandbox Code Playgroud)


Sch*_*ern 6

我只是使用Tie :: File.

use Tie::File;
use File::Copy;

copy $file, "$file.bak" or die "Failed to copy $file to $file.bak: $!";
tie @array, "Tie::File", $file or die "Can't open $file: $!";
s/foo/bar/ for @array;
Run Code Online (Sandbox Code Playgroud)