【发布时间】:2010-11-06 14:21:58
【问题描述】:
这似乎是多余的,从 Perl 脚本本身运行 perl。
my $Pref = "&*())(*&^%$#@!";
system("perl -pi -e 's|^SERVERNAME.*\$|SERVERNAME \"\Q$Pref\E\"|g' pserver.prefs");
模仿 -pi 的实际 Perl 代码是什么?我只想要在 Perl 上像 sed 一样工作的东西,尽可能简单。
根据 Todd Gardner 的网站,它似乎基本上只是读取和写入所有文件,试图将正则表达式应用于每一行。对于像我这样的新手 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);
使用两个打开有什么问题吗?是否应该避免这种情况,还是可以采用简单的解决方案?
我必须承认,系统 sed 命令要简单得多。
【问题讨论】:
-
如果您想打开两个不同的文件,两次打开是正常的并且是必需的——这正是您想要的。回复:sed 更简单、更干净——绝对可能是这样,但请记住,在幕后,某些程序必须打开每个文件,检查每一行,必要时进行替换,打印出该行等。没有什么神奇的方法将替换项滑入文件而不查看文件中的数据。或者,如果有的话,我希望有人教给我们俩。