Regex 如何在Mac上使用perl在另一个文件中使用转换表转换一个文件中的字符串?

Regex 如何在Mac上使用perl在另一个文件中使用转换表转换一个文件中的字符串?,regex,arrays,macos,perl,join,Regex,Arrays,Macos,Perl,Join,我正在尝试使用perl转换文本文件中多行逗号分隔的值列表 第一个文件如下所示: A:25, B:14, C:3 A:25, E:5 B:14, D:8, E:5 A:25 AS363 B:14 SDD645 C:3 KF8756 D:8 LFK4523 E:5 FSE523 AS363, SDD645, KF8756 AS363, FSE523 SDD645, LFK4523, FSE523 第二个文件由制表符分隔,如下所示: A:25, B:14, C:3

我正在尝试使用perl转换文本文件中多行逗号分隔的值列表

第一个文件如下所示:

A:25, B:14, C:3
A:25, E:5
B:14, D:8, E:5  
A:25   AS363
B:14   SDD645
C:3    KF8756
D:8    LFK4523
E:5    FSE523
AS363, SDD645, KF8756
AS363, FSE523
SDD645, LFK4523, FSE523
第二个文件由制表符分隔,如下所示:

A:25, B:14, C:3
A:25, E:5
B:14, D:8, E:5  
A:25   AS363
B:14   SDD645
C:3    KF8756
D:8    LFK4523
E:5    FSE523
AS363, SDD645, KF8756
AS363, FSE523
SDD645, LFK4523, FSE523
理想情况下,我希望输出像原始文件一样以逗号分隔,所有内容都已转换,因此输出应如下所示:

A:25, B:14, C:3
A:25, E:5
B:14, D:8, E:5  
A:25   AS363
B:14   SDD645
C:3    KF8756
D:8    LFK4523
E:5    FSE523
AS363, SDD645, KF8756
AS363, FSE523
SDD645, LFK4523, FSE523
这是我目前的代码:

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

my $filename = $ARGV[0];
my $filename1 = $ARGV[1];

open(FILE, $filename);

while (my $line = <FILE>){
          my @items = split /\s*,\s*/, $line;
             foreach my $items (@items) {
            #print "$items\n";
}
}
close FILE;

open(FILE1, $filename1);

while (my $line1 = <FILE1>) 

{

    my @ids = split /[\r\n\t]/,$line1;
    #print "$ids[1]\n";

    if (my $items==$ids[1]){
    print "$ids[1]\n";
    }
}

close FILE1;

但这似乎也不起作用……有什么建议吗?谢谢

常用的方法是逐行读取一个文件(本例中为第二个文件),并使用哈希保存数据。作为要查找的数据的键,作为要替换的数据的值。稍后,逐行读取另一个,将其拆分为字段,并对每个字段比较哈希中是否存在:

#!/usr/bin/env perl

use warnings;
use strict;

my %hash;

die qq|Usage: perl $0 <file1> <file2>\n| unless @ARGV == 2;

open my $fh1, '<', shift or die;
open my $fh2, '<', shift or die;

while ( <$fh2> ) { 
    s/\s+$//;
    my @f = split;
    next unless @f == 2;
    $hash{ $f[0] } = $f[1];
}

while ( <$fh1> ) { 
    s/\s+$//;
    my @f = split /, /;
    for my $elem ( @f ) { 
        if ( defined $hash{ $elem } ) { 
            $elem = $hash{ $elem };
        }   
    }   
    printf qq|%s\n|, join q|, |, @f; 
}
这将产生:

AS363, SDD645, KF8756
AS363, FSE523
SDD645, LFK4523, FSE523

您需要输出与第一个文件匹配,还是看起来像第一个文件?我想答案是两者都是?我想将第一个文件与第二个文件匹配,然后再转换回第一个文件的格式谢谢!它是有效的,但我必须研究它来理解它的含义!