【问题标题】:Perl Find and Replace Not working with values from arrayPerl查找和替换不适用于数组中的值
【发布时间】: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。

标签: perl csv replace


【解决方案1】:

您使用my $INPLACE_EDIT 是您的问题。你想影响全局变量:

local $INPLACE_EDIT = '.back';

和你对待@ARGV的方式一样

【讨论】:

  • 非常好,尽管出于某种原因它删除了该文件和 .back 文件中的所有内容。
  • 取消注释您的打印声明。
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 2011-07-25
  • 2012-06-17
  • 2014-01-26
  • 2020-06-24
  • 1970-01-01
相关资源
最近更新 更多