如何使用perl脚本动态替换字符串

如何使用perl脚本动态替换字符串,perl,replace,Perl,Replace,我试图解决以下问题 我有两个文件。Address.txt和File.txt。我想使用perl脚本将所有A/B/C/D(File.txt)替换为相应的字符串值(从Address.txt文件读取)。它不会在我的输出文件中替换。我得到了与File.txt相同的内容。 我试过下面的代码 这是Address.txt文件 A,APPLE B,BAL C,CAT D,DOG E,ELEPHANT F,FROG G,GOD H,HORCE 这是File.txt A B C X Y X M N O D E F

我试图解决以下问题

我有两个文件。Address.txt和File.txt。我想使用perl脚本将所有A/B/C/D(File.txt)替换为相应的字符串值(从Address.txt文件读取)。它不会在我的输出文件中替换。我得到了与File.txt相同的内容。 我试过下面的代码

这是Address.txt文件

A,APPLE
B,BAL
C,CAT
D,DOG
E,ELEPHANT
F,FROG
G,GOD
H,HORCE
这是File.txt

A B C
X Y X
M N O
D E F
F G H
这是我的密码:

use strict;
use warnings;
open (MYFILE, 'Address.txt');

foreach (<MYFILE>){
    chomp;
    my @data_new = split/,/sm;
    open INPUTFILE, "<", $ARGV[0] or die $!;
    open OUT, '>ariout.txt' or die $!;
      my $src = $data_new[0];
    my $des = $data_new[1];

      while (<INPUTFILE>) {
          # print "In while :$src \t$des\n";
          $_ =~ s/$src/$des/g;
          print OUT $_; 
      }

      close INPUTFILE;
      close OUT;
      # /usr/bin/perl -p -i -e "s/A/APPLE/g" ARGV[0];
}
close (MYFILE);
使用严格;
使用警告;
打开(MYFILE,'Address.txt');
foreach(){
咀嚼;
my@data\u new=split/,/sm;
打开INPUTFILE“,”output.txt“| | die”无法打开输出文件进行写入:$!”;

打开(我的$address_fh,“首先,这是您现有的程序,稍加重写

打开地址文件

将地址文件转换为哈希,使字母为键,字符串为值

打开另一个文件

读入其中的一行

将行拆分为单个字母

使用字母在哈希中查找

use strict;
use warnings;

open(my $a,"Address.txt")||die $!;

my %address=map {split(/,/) } map {split(' ')} <$a>;

open(my $f,"File.txt")||die $!;

my $list=<$f>;

for my $letter (split(' ',$list)) {
  print $address{$letter}."\n" if (exists $address{$letter}); 
}

首先,这是您现有的程序,稍加重写

打开地址文件

将地址文件转换为哈希,使字母为键,字符串为值

打开另一个文件

读入其中的一行

将行拆分为单个字母

使用字母在哈希中查找

use strict;
use warnings;

open(my $a,"Address.txt")||die $!;

my %address=map {split(/,/) } map {split(' ')} <$a>;

open(my $f,"File.txt")||die $!;

my $list=<$f>;

for my $letter (split(' ',$list)) {
  print $address{$letter}."\n" if (exists $address{$letter}); 
}

不完全确定输出的格式。是否保持行和列不变

我采取了与上述类似的方法,但格式与“file.txt”文件中的格式相同:

#!/usr/bin/perl
use warnings;
use strict;

open( my $out_fh, ">", "output.txt" ) || die "Can't open the output file for writing: $!";

open( my $address_fh, "<", "address.txt" ) || die "Can't open the address file: $!";
my %lookup = map { chomp; split( /,/, $_, 2 ) } <$address_fh>;

open( my $file_fh, "<", "file.txt" ) || die "Can't open the file.txt file: $!";
while (<$file_fh>) {
    my @line = split;
    for my $char ( @line ) {
        ( exists $lookup{$char} ) ? print $out_fh " $lookup{$char} " : print $out_fh " $char ";
    }
    print $out_fh "\n";
}

不完全确定输出的格式。是否保持行和列不变

我采取了与上述类似的方法,但格式与“file.txt”文件中的格式相同:

#!/usr/bin/perl
use warnings;
use strict;

open( my $out_fh, ">", "output.txt" ) || die "Can't open the output file for writing: $!";

open( my $address_fh, "<", "address.txt" ) || die "Can't open the address file: $!";
my %lookup = map { chomp; split( /,/, $_, 2 ) } <$address_fh>;

open( my $file_fh, "<", "file.txt" ) || die "Can't open the file.txt file: $!";
while (<$file_fh>) {
    my @line = split;
    for my $char ( @line ) {
        ( exists $lookup{$char} ) ? print $out_fh " $lookup{$char} " : print $out_fh " $char ";
    }
    print $out_fh "\n";
}

您的问题是,在foreach循环的每次迭代中,您都会覆盖先前对输出文件所做的任何更改

我的解决方案:

use strict;
use warnings;

open my $replacements, 'Address.txt' or die $!;

my %r;
foreach (<$replacements>) {
        chomp;
        my ($k, $v) = split/,/sm;
        $r{$k} = $v;
}
my $re = '(' . join('|', keys %r) . ')';

open my $input, "<", $ARGV[0] or die $!;

while (<$input>) {
        s/$re/$r{$1}/g;
        print;
}
使用严格;
使用警告;
打开我的$replacements、'Address.txt'或die$!;
我的%r;
foreach(){
咀嚼;
my($k,$v)=拆分/,/sm;
$r{$k}=$v;
}
my$re='('.join('|',键%r)。');

打开我的$input,“您的问题是,在foreach循环的每次迭代中,您都会覆盖先前对输出文件所做的任何更改

我的解决方案:

use strict;
use warnings;

open my $replacements, 'Address.txt' or die $!;

my %r;
foreach (<$replacements>) {
        chomp;
        my ($k, $v) = split/,/sm;
        $r{$k} = $v;
}
my $re = '(' . join('|', keys %r) . ')';

open my $input, "<", $ARGV[0] or die $!;

while (<$input>) {
        s/$re/$r{$1}/g;
        print;
}
使用严格;
使用警告;
打开我的$replacements、'Address.txt'或die$!;
我的%r;
foreach(){
咀嚼;
my($k,$v)=拆分/,/sm;
$r{$k}=$v;
}
my$re='('.join('|',键%r)。');

打开我的$input,“这里有另一个选项,可以让Perl处理文件的打开和关闭:

use strict;
use warnings;

my $addresses_txt = pop;
my %hash = map { $1 => $2 if /(.+?),(.+)/ } <>;
push @ARGV, $addresses_txt;

while (<>) {
    my @array;
    push @array, $hash{$_} // $_ for split;
    print "@array\n";
}
地址文件的名称隐式地
pop
ped off@ARGV供以后使用。然后,使用file.txt中的键/值对构建哈希

读取地址文件,
split
将每一行分割成单个元素,使用定义的or(
/
)运算符返回定义的散列项或单个元素,然后将其推送到@array上。最后,在
print
语句中插入数组


希望这有帮助!

这里有另一个选项,让Perl处理文件的打开和关闭:

use strict;
use warnings;

my $addresses_txt = pop;
my %hash = map { $1 => $2 if /(.+?),(.+)/ } <>;
push @ARGV, $addresses_txt;

while (<>) {
    my @array;
    push @array, $hash{$_} // $_ for split;
    print "@array\n";
}
#!/usr/bin/perl -w
# to replace multiple text strings in a file with text from another file

#select text from 1st file, replace in 2nd file
$file1 = 'Address.txt'; $file2 = 'File.txt';

# save the strings by which to replace
%replacement = ();
open IN,"$file1" or die "cant open $file1\n";
while(<IN>)
    {chomp $_;
    @a = split ',',$_;
    $replacement{$a[0]} = $a[1];}
close IN;

open OUT,">replaced_file";
open REPL,"$file2" or die "cant open $file2\n";
while(<REPL>)
    {chomp $_;
    @a = split ' ',$_; @replaced_data = ();
# replace strings wherever possible
    foreach $i(@a)
        {if(exists $replacement{$i}) {push @replaced_data,$replacement{$i};}
         else {push @replaced_data,$i;}
        }
    print OUT trim(join " ",@replaced_data),"\n";
    }
close REPL; close OUT;

########################################
sub trim
{
my $str = $_[0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$//;
return $str;
}
地址文件的名称隐式地
pop
ped off@ARGV供以后使用。然后,使用file.txt中的键/值对构建哈希

读取地址文件,
split
将每一行分割成单个元素,使用定义的or(
/
)运算符返回定义的散列项或单个元素,然后将其推送到@array上。最后,在
print
语句中插入数组

希望这有帮助!

#!/usr/bin/perl-w
#!/usr/bin/perl -w
# to replace multiple text strings in a file with text from another file

#select text from 1st file, replace in 2nd file
$file1 = 'Address.txt'; $file2 = 'File.txt';

# save the strings by which to replace
%replacement = ();
open IN,"$file1" or die "cant open $file1\n";
while(<IN>)
    {chomp $_;
    @a = split ',',$_;
    $replacement{$a[0]} = $a[1];}
close IN;

open OUT,">replaced_file";
open REPL,"$file2" or die "cant open $file2\n";
while(<REPL>)
    {chomp $_;
    @a = split ' ',$_; @replaced_data = ();
# replace strings wherever possible
    foreach $i(@a)
        {if(exists $replacement{$i}) {push @replaced_data,$replacement{$i};}
         else {push @replaced_data,$i;}
        }
    print OUT trim(join " ",@replaced_data),"\n";
    }
close REPL; close OUT;

########################################
sub trim
{
my $str = $_[0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$//;
return $str;
}
#用另一个文件中的文本替换文件中的多个文本字符串 #从第一个文件中选择文本,在第二个文件中替换 $file1='Address.txt';$file2='File.txt'; #保存要替换的字符串 %替换=(); 在“$file1”中打开,或在“无法打开$file1”中死亡\n; while() {chomp$"; @a=拆分',',$; $replacement{$a[0]}=$a[1];} 接近; 打开“>替换的_文件”; 打开REPL,“$file2”或die“无法打开$file2\n”; while() {chomp$"; @a=拆分“”,$替换的数据=(); #尽可能替换字符串 每$i(@a) {if(exists$replacement{$i}){push@replacemented_data,$replacement{$i};} else{push@replacemented_data$i;} } 打印修剪(连接“”@替换的\u数据),“\n”; } 关闭REPL;关闭; ######################################## 辅助微调 { 我的$str=$\u0]; $str=~s/^\s*(.*)/$1/; $str=~s/\s*$/; 返回$str; }
#!/usr/bin/perl-w
#用另一个文件中的文本替换文件中的多个文本字符串
#从第一个文件中选择文本,在第二个文件中替换
$file1='Address.txt';$file2='File.txt';
#保存要替换的字符串
%替换=();
在“$file1”中打开,或在“无法打开$file1”中死亡\n;
while()
{chomp$";
@a=拆分',',$;
$replacement{$a[0]}=$a[1];}
接近;
打开“>替换的_文件”;
打开REPL,“$file2”或die“无法打开$file2\n”;
while()
{chomp$";
@a=拆分“”,$替换的数据=();
#尽可能替换字符串
每$i(@a)
{if(exists$replacement{$i}){push@replacemented_data,$replacement{$i};}
else{push@replacemented_data$i;}
}
打印修剪(连接“”@替换的\u数据),“\n”;
}
关闭REPL;关闭;
########################################
辅助微调
{
我的$str=$\u0];
$str=~s/^\s*(.*)/$1/;
$str=~s/\s*$/;
返回$str;
}

您没有描述您面临的问题编辑问题..我没有得到替换字符串。您没有描述您面临的问题编辑问题..我没有得到替换字符串。它只是替换第一行的单词。您的代码正常工作,但我的格式在输出文件中变乱。在重放后会有额外的空间ced单词。有什么想法吗?它只是在替换第一行的单词。你的代码有效,但我的代码无效