如何迭代多个正则表达式?
How to iterate multiple regex's?
所以一开始我在使我的代码更简洁方面遇到了麻烦,我知道从逻辑上讲这是一团糟,但我相对较新。不管怎样,这是我们正在处理的事情:
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 只包含文本(诸如 phone 数字和名称之类的东西)。我真的在互联网上搜索过(包括 perldoc),但肯定会错过一些东西。感谢任何帮助,谢谢。
如果您将 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{}/g;
print;
}
__DATA__
#Location
#LastUpdate
#AddInfo
#SpecInst
#OPHONE1
编辑:请注意,我是在 while 循环之外创建编译后的正则表达式,这样就不必为循环内的每次迭代都创建它。
下面是一个示例,将引导您完成它。您想要使用键值作为散列的种子,然后遍历每个进行替换。您应该能够修改此代码以满足您的需要。
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();
所以一开始我在使我的代码更简洁方面遇到了麻烦,我知道从逻辑上讲这是一团糟,但我相对较新。不管怎样,这是我们正在处理的事情:
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 只包含文本(诸如 phone 数字和名称之类的东西)。我真的在互联网上搜索过(包括 perldoc),但肯定会错过一些东西。感谢任何帮助,谢谢。
如果您将 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{}/g;
print;
}
__DATA__
#Location
#LastUpdate
#AddInfo
#SpecInst
#OPHONE1
编辑:请注意,我是在 while 循环之外创建编译后的正则表达式,这样就不必为循环内的每次迭代都创建它。
下面是一个示例,将引导您完成它。您想要使用键值作为散列的种子,然后遍历每个进行替换。您应该能够修改此代码以满足您的需要。
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();