gpt4 book ai didi

perl - perl -pi -e 到底是做什么的?

转载 作者:行者123 更新时间:2023-12-02 06:57:40 25 4
gpt4 key购买 nike

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

关于一些 SO 问题,我可以阅读:

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

但是这个例子没有显示文件保存的部分。

Perl 如何确定 EOL?没有发生更改时它会触摸文件吗?例如,如果我有一个旧的 MAC 文件(仅限 \r)。它如何处理s/^foo/bar/gm

我尝试使用 Perl 调试器,但它并没有真正的帮助。所以我只是想猜测:

#!/usr/bin/env perl

my $pattern = shift;
map &process, @ARGV;
# perl -pi -e PATTERN <files>...
sub process {
next unless -f;
open my $fh, '<', $_;
my $extract;
read $fh, $extract, 1024;
seek &fh, 0, 0;
if ($extract =~ /\r\n/) {
$/ = "\r\n";
} elsif ($extract =~ /\r[^\n]/) {
$/ = "\r";
} else {
$/ = "\n";
}

my $out = '';
while(<&fh>) {
my $__ = $_;

eval $pattern;

my $changes = 1 if $_ ne $__;
$out .= $_;
}

if($changes)
{
open my $fh, '>', $_;
print $fh $out;
}
close &fh;
}

最佳答案

您可以通过核心模块 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 循环遍历给定文件中的行,执行代码并将 $_ 设置为该行并打印结果 $_。

魔术变量 $^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 - perl -pi -e 到底是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28131528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com