在脚本中进行Perl就地编辑(而不是一行程序)
因此,我已经习惯了在脚本中进行Perl就地编辑(而不是一行程序),perl,Perl,因此,我已经习惯了perl-I使用perl,就像我使用sed和就地编辑一样 perlvar中的$^I文档: $^I 就地编辑扩展名的当前值。使用undef禁用就地编辑 嗯。所以这意味着我可能会在脚本中乱搞“就地”编辑 我遇到的问题是: 如果我跑步: perl -pi -e 's/^/fish/' test_file 然后把它脱下来: BEGIN { $^I = ""; } LINE: while (defined($_ = <ARGV>)) { s/^/fish/; } c
perl-I
使用perl,就像我使用sed
和就地编辑一样
perlvar
中的$^I
文档:
$^I
就地编辑扩展名的当前值。使用undef禁用就地编辑
嗯。所以这意味着我可能会在脚本中乱搞“就地”编辑
我遇到的问题是:
如果我跑步:
perl -pi -e 's/^/fish/' test_file
然后把它脱下来:
BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
s/^/fish/;
}
continue {
die "-p destination: $!\n" unless print $_;
}
我如何“使”这种情况发生?这是一个更改$\uuuuuuu
(就像s/somethingese/
默认情况下所做的那样)并让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;
}
}
使用严格;
使用警告;
我们的$^I='.bak';
而(my$file=glob'*.csv'){
打印“正在处理$file\n”;
我们的@ARGV=($file);
而(){
tr/a-z/a-z/;
印刷品;
}
}
您可以对基于记录的文件(如CSV)进行就地编辑,但不能对XML进行编辑。我正在考虑使用XML
之类的XML::Twig
s处理程序,purge
和flush
。已经说过-XML::Twig
已经parsefile\u就位了
,所以这是没有意义的。所以,只是为了澄清一下-打印
这是一个重要的元素,或者它必须修改并输出$\uu
?已测试-打印任何内容都会替换文件中的内容。似乎只有在“while”循环中才会这样做。@Sobrique:不,是
操作符在@ARGV
中打开文件进行读取时发挥了神奇的作用(我认为ARGV->readline
的工作方式不同)。它重命名原始文件并使用原始名称在ARGVOUT
上打开一个新文件进行输出,并执行选择ARGVOUT
操作,因此您不必在打印
语句中指定句柄
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;
}
}