如何迭代多个正则表达式?

时间:2015-02-17 22:36:13

标签: regex perl hash replace file-handling

因此,为了开始我在使代码更清洁方面遇到困难,我从逻辑上知道它是一团糟,但我相对较新。无论如何,我们正在使用的是:

 sub Regexin    {

        open (my $in, "<", "regexin.txt") or die "cannot open: $!";
        open (my $out, ">", "regexin1.txt") or die "cannot open: $!";
        while (<$in>)
        {
        s/#Location/$EmergInfo[0]/g;
        s/#LastUpdate/$EmergInfo[1]/g;
        s/#AddInfo/$EmergInfo[2]/g;
        s/#SpecInst/$EmergInfo[3]/g;
        s/#MsdsLoc/$EmergInfo[4]/g;
        s/#SpillLoc/$EmergInfo[5]/g;
        s/#CONTACT1/$EmergInfo[6]/g;
        s/#CONTACT2/$EmergInfo[7]/g;
        s/#DEPARTMENT1/$EmergInfo[8]/g;
        s/#DEPARTMENT2/$EmergInfo[9]/g;
        s/#OFFICE1/$EmergInfo[10]/g;
        s/#OFFICE2/$EmergInfo[11]/g;
        s/#OPHONE1/$EmergInfo[12]/g;
        s/#OPHONE2/$EmergInfo[13]/g;
        s/#HPHONE1/$EmergInfo[14]/g;
        s/#HPHONE2/$EmergInfo[15]/g;
print $out $_;
        }
        close $in;
        close $out;
        unlink('regexin.txt') or die "error deleting regexin.txt\n";
                }

所有这些正则表达式显然都是非常粗暴的,我已经尝试过使用foreach,每个都使用哈希和使用数组的多种方式,但是没有一个很好的一行。 我的目标是得到这样的东西:

s/$keys/$values/g;

就是这样,它迭代但正则表达式很奇怪。此外,变量$ EmergInfo只保存文本(电话号码和姓名等内容)。我真的在互联网上搜索过(包括perldoc),但绝对不能错过一些东西。感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:5)

如果您使用哈希而不是数组来组织EmergInfo数据,您将能够一次搜索并替换所有字段。

my %EmergInfo = (
  Location => 'New York',
  LastUpdate => 'Feb 17, 2015',
  OPHONE1 => '800-555-1212',
  etc => '...',
);

my $joined_keys = join('|', keys %EmergInfo);
my $regexp = qr/#($joined_keys)/;

while (<DATA>) {
  s/$regexp/$EmergInfo{$1}/g;
  print;
}

__DATA__
#Location
#LastUpdate
#AddInfo
#SpecInst
#OPHONE1

编辑:请注意我在while循环之外创建一个编译的正则表达式,这样就不必为循环中的每次迭代创建它。

答案 1 :(得分:1)

这是一个将引导您完成它的示例。您希望使用键值对哈希进行种子处理,然后遍历每个进行替换的哈希值。您应该能够修改此代码以满足您的需求。

use strict;
use warnings;

my %info;

sub Regexin {
    open (my $in, "<", "regexin.txt") or die "cannot open: $!";
    open (my $out, ">", "regexin1.txt") or die "cannot open: $!";
    while (<$in>)
    {
    for my $k (keys %info) {
        s/#$k/$info{$k}/g;
    }
    print $out $_;
    }
    close $in;
    close $out;
    #unlink('regexin.txt') or die "error deleting regexin.txt\n";
}

my @EmergInfo=('Home', 'Today');

%info=('Location'=>$EmergInfo[0],
      'LastUpdate'=>$EmergInfo[1]);

Regexin();