perl-pi-e到底做什么?

perl-pi-e到底做什么?,perl,Perl,我想知道Perl在使用选项Perl-pi-e执行时运行的等效代码是什么 关于一些这样的问题,我可以读到: while (<>) { ... # your script goes here } continue { print; } 从: -p假定脚本周围有一个输入循环。印刷线条。 -i由构造处理的文件将被就地编辑。 -e可用于输入一行脚本。可以给出多个-e命令来构建多行脚本。 您可以通过核心模块B::Deparse检查Perl实际使用的代码。使用选项-MO=

我想知道Perl在使用选项
Perl-pi-e
执行时运行的等效代码是什么

关于一些这样的问题,我可以读到:

while (<>) {
    ...     # your script goes here
} continue {
    print;
}
从:

-p假定脚本周围有一个输入循环。印刷线条。
-i由<>构造处理的文件将被就地编辑。
-e可用于输入一行脚本。可以给出多个-e命令来构建多行脚本。

您可以通过核心模块B::Deparse检查Perl实际使用的代码。使用选项
-MO=Deparse
激活此编译器后端模块

$ perl -MO=Deparse -p -i -e 's/X/U/' ./*.txt
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    s/X/U/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK
$perl-MO=Deparse-p-i-e's/X/U/'./*.txt
开始{$^I=”“;}
行:while(已定义($\u=)){
s/X/U/;
}
继续{
模具“-p目的地:$!\n”,除非打印$;
}
-e语法正常
因此,perl在给定文件的行上循环,执行代码时将$\设置为行,并打印生成的$\行

魔法变量be$^I设置为空字符串。这将启用就地编辑。在perldoc perlrun中解释了就地编辑。无法检查文件是否未更改。因此,编辑文件的修改时间始终会更新。显然,备份文件的修改时间与原始文件的修改时间相同

使用-0标志,您可以设置输入记录分隔符,以便为Mac文件使用“\r”

$ perl -e "print qq{aa\raa\raa}" > t.txt
$perl -015 -p -i.ori -e 's/a/b/' t.txt
$cat t.txt
ba
$ perl -MO=Deparse -015 -p -i.ori -e 's/a/b/'.txt
BEGIN { $^I = ".ori"; }
BEGIN { $/ = "\r"; $\ = undef; }
LINE: while (defined($_ = <ARGV>)) {
    s/a/b/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK
$perl-e“print qq{aa\raa\raa}>t.txt
$perl-015-p-i.ori-e's/a/b/'t.txt
$cat t.txt
文学士
$perl-MO=Deparse-015-p-i.ori-e's/a/b/'.txt
开始{$^I=“.ori”}
开始{$/=“\r”;$\=undef;}
行:while(已定义($\u=)){
s/a/b/;
}
继续{
模具“-p目的地:$!\n”,除非打印$;
}
-e语法正常

这没有多大帮助:(非常有趣的回答。我仍然有点困惑,因为我在这个输出中没有看到任何
open
print$fh$\
语句。Perl是如何打开文件的?
对我来说类似于'my@ARGV=qw/foo.txt/;my$bar=我会在哪里出错。我错过了正确的东西?@coin
的I/O操作符部分。)[perlop](http://perldoc.perl.org/perlop.html)
有一个以“空文件句柄是特殊的”开头的部分这提供了一个很好的解释。是的,deparse输出中没有显示输出文件的打开和关闭。它由inplace edit magic处理。“perldoc perlrun”中的“-i”部分解释了这一点。可以在continue块中看到
print$\u
。不需要$fh,因为inplace edit magic选择了de故障输出文件句柄。您可以使用
选择
命令执行类似操作。
据我所知是
的同义词。
$ perl -MO=Deparse -p -i -e 's/X/U/' ./*.txt
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    s/X/U/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK
$ perl -e "print qq{aa\raa\raa}" > t.txt
$perl -015 -p -i.ori -e 's/a/b/' t.txt
$cat t.txt
ba
$ perl -MO=Deparse -015 -p -i.ori -e 's/a/b/'.txt
BEGIN { $^I = ".ori"; }
BEGIN { $/ = "\r"; $\ = undef; }
LINE: while (defined($_ = <ARGV>)) {
    s/a/b/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}
-e syntax OK