【发布时间】:2014-04-18 22:53:08
【问题描述】:
对于这个脚本,我正在提取一个 csv 文件,其中包含需要找到的内容和替换内容。然后将这些值 $pattern1 和 $replacement1 插入到查找和替换函数中。理想情况下,这将采用 csv 密钥文件并就地替换原始数据文件。
use English;
use strict;
use warnings;
sub inplace_sanitize {
my ( $datafile, $pattern1, $replacement1 ) = @_;
local @ARGV = ( $datafile ),
my $INPLACE_EDIT = '.back';
while ( <> ) {
s/\Q$pattern1/$replacement1/g;
#print;
}
}
sub main
{
# Select Key for Find & Replace
my $filename = 'stmre_fr_key.csv';
open(INPUT, $filename) or die "Cannot open $filename";
# Read the header line.
my $line = <INPUT>;
# Read the lines one by one.
while($line = <INPUT>)
{
chomp($line);
#Split & Assign
my ($replacement1, $pattern1) = split(',', $line);
# Select Data File
my $datafile = 'rawdata.csv';
#Find & Replace Data File
&inplace_sanitize( $datafile, $pattern1, $replacement1 );
}
}
close(INPUT);
main();
所以这不起作用,因为它不执行替换。如果没有inplace_sanitizecall,它会正确打印出$replacement1 和$pattern1。如果您定义 $replacement1 = 'replace'; 和 $pattern1 = 'find';,inplace_sanitize 将自行工作。但是在一起是行不通的。有什么想法吗?
样品:
$replacement1 = '7306e005';
$pattern1 = 'leighs_satcon011016001_00753b94';
stmre_fr_key.csv:
find,replace
leighs_satcon011016001_00753b94,7306e005
leighs_satcon011016001_00753b95,7306e006
.
.
.
【问题讨论】:
-
显示一些示例输入和输出。你的映射文件真的是
replacement,pattern的形式,左边有替换吗? -
's/\Q$pattern1\E/\Q$replacement1\E/g;'尝试一下,这里的重要性在于,还要以 \E 结束 \Q,并且你要为两者都这样做。我从 Eclipse complete-ant-cmd.pl 脚本中偷了这个 :)
-
您对
my $INPLACE_EDIT的使用看起来很可疑。应该是local $INPLACE_EDIT -
感谢升级 alexmac。