在脚本中进行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;
  }
}