Perl在脚本中编辑(而不是一个班轮)

时间:2015-06-24 11:10:34

标签: perl

所以,我已经习惯perl -i使用perl,因为我会sed进行编辑。

$^Iperlvar的文档:

  

$ ^ I   inplace-edit扩展的当前值。使用undef禁用就地编辑。

行。所以这意味着我可能会在脚本中进行“就地”编辑?

我遇到麻烦的是:

如果我跑:

perl -pi -e 's/^/fish/' test_file

然后解除它:

BEGIN { $^I = ""; }
LINE: while (defined($_ = <ARGV>)) {
    s/^/fish/;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

现在 - 如果我想在脚本中使用$^I,请说:

 foreach my $file  ( glob "*.csv" ) {
     #inplace edit these files - maybe using Text::CSV to manipulate? 
 }

如何“启用”这种情况发生?这是一个更改$_(默认为s/something/somethingelse/)并让perl隐式打印的问题吗?或者还有其他事情发生了吗?

我的主要问题是 - 我可以执行应用CSV转换(或XML调整或类似)的“就地编辑”。

我很欣赏我可以打开单独的文件句柄,阅读/打印等。我想知道是否有另一种方式。 (即使它只是在情境上有用)。

1 个答案:

答案 0 :(得分:8)

-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;
  }
}