所以,我习惯于perl -i使用perl,因为我愿意sed和就地编辑.
$^Iin 的文档perlvar:
$ ^ I inplace-edit扩展的当前值.使用undef禁用就地编辑.
好.所以这意味着我可能会在脚本中进行"就地"编辑?
我遇到麻烦的是这样的:
如果我跑:
perl -pi -e 's/^/fish/' test_file
Run Code Online (Sandbox Code Playgroud)
然后解析它:
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/^/fish/;
}
continue {
die "-p destination: $!\n" unless print $_;
}
Run Code Online (Sandbox Code Playgroud)
现在 - 如果我想要$^I在脚本中使用,请说:
foreach my $file ( glob "*.csv" ) {
#inplace edit these files - maybe using Text::CSV to manipulate?
}
Run Code Online (Sandbox Code Playgroud)
我如何"启用"这种情况发生?这是一个改变的问题$_(s/something/somethingelse/默认情况下),并让perl隐式打印出来吗?或者还有其他事情发生了吗?
我的主要问题是 - 我可以执行应用CSV转换(或XML调整或类似)的"就地编辑".
我很欣赏我可以打开单独的文件句柄,阅读/打印等.我想知道是否有另一种方式.(即使它只是在情境上有用).
由-i命令行选项或设置启用的就地编辑行为$^I仅适用于ARGV文件句柄.这意味着文件必须在命令行上命名,或者@ARGV必须在程序中设置
该程序将所有CSV文件中的所有小写字母更改为大写.请注意,我已设置$^I为非空字符串,建议您在测试时保留原始数据文件
use strict;
use warnings;
our $^I = '.bak';
while ( my $file = glob '*.csv' ) {
print "Processing $file\n";
our @ARGV = ($file);
while ( <ARGV> ) {
tr/a-z/A-Z/;
print;
}
}
Run Code Online (Sandbox Code Playgroud)