gpt4 book ai didi

regex - 在这些 Perl 单行代码中会发生什么?

转载 作者:行者123 更新时间:2023-12-01 08:29:56 24 4
gpt4 key购买 nike

我正在尝试了解 cli 中的 perl one 衬里。
例如,如果我需要在文件中进行替换:

perl -e 's/eat/read/g' file  

什么都没有发生。

如果我这样做:

perl -i -e 's/eat/read/g' file

文件也没有任何反应。

只有当我这样做时:

perl -p -i -e 's/eat/read/g' file

文件中的内联替换发生了。
如果我这样做了

perl -n -i -e 's/eat/read/g' file

文件变空!

谁能解释一下不同之处以及每种情况会发生什么?

最佳答案

B::Deparse模块将显示开关对您的 perl 代码的作用,

perl -MO=Deparse -e 's/eat/read/g' file
s/eat/read/g;

这里没什么意思,你的代码按原样执行。

perl -MO=Deparse -i -e 's/eat/read/g' file
BEGIN { $^I = ""; }
s/eat/read/g;

好的,-i更改了全局变量 $^I 用于内联编辑,但没有文件被读取,并且这里没有循环。

perl -MO=Deparse -p -i -e 's/eat/read/g' file
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/eat/read/g;
}
continue {
print $_;
}

所以 -p添加 while(){}循环读取每一行,由您的代码更改,然后再次写入文件(在 continue{} block 中打印)

perl -MO=Deparse -n -i -e 's/eat/read/g' file
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/eat/read/g;
}

所以 -n没有 continue{} block 打印像 -p开关,在s///之后必须手动打印如果您想对文件进行所需的更改,则替换(否则不会打印任何内容,并且您的文件结束时会被截断,正如您已经注意到的那样)。

关于regex - 在这些 Perl 单行代码中会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21498619/

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