1

我有一个格式如下的文本文件:

# Email File
# List of email addresses
##############################
PRIMARY_EMAIL=abc@123.com
ALTERNATE_EMAIL=123@abc.com
#PRIMARY_EMAIL=def@456.com
#ALTERNATE_EMAIL=456@def.com
PRIMARY_EMAIL=ghi@789.com
ALTERNATE_EMAIL=789@ghi.com

此文件包含员工的主要和备用电子邮件地址。我使用该文件作为我用来向员工发送通知的脚本的输入。如果员工休假并且不需要包含在结果中,则某些电子邮件地址会被注释掉。

我遇到的问题是,当字符串以“PRIMARY_EMAIL”或“ALTERNATE_EMAIL”开头时,我无法匹配“=”符号后的电子邮件地址。

使用以下代码,我可以获得“PRIMARY_EMAIL”,但它没有获取“ALTERNATE_EMAIL”。如果我使用两个变量获取输入并在正则表达式中特别指出“PRIMARY_EMAIL”或“ALTERNATE_EMAIL”,则下面的代码可以工作,但如果可能的话,我想在一行代码中一次获取所有内容。

while (<$in_file>) {
    $line = $1 if (/^PRIMARY_EMAIL=(.*)|^ALTERNATE_EMAIL=(.*)/);
    chomp;
    if (defined $line) {
        push (@recipient, $line);
    }
}

$to = join("\n", @recipient);
print "\$to = \n", $to, "\n";

输出:

$to =
abc@123.com
ghi@789.com

如您所见,输出/正则表达式不包括“ALTERNATE_EMAIL”之后的值。

输出应该是:

$to = 
abc@123.com
123@abc.com
ghi@789.com
789@ghi.com

我已经到处搜索了一种使用交替来匹配行首的两个不同字符串的方法,同时只在“=”符号之后返回药水,但是我发现的每个示例/解释都只处理一个匹配在字符串的开头。

谢谢您的帮助。

4

2 回答 2

0

试试这个:

my @recipient  = (join("", <DATA>) =~ /^(?:PRIMARY_EMAIL|ALTERNATE_EMAIL)=(.*)/mg);
my $to = join("\n", @recipient);
print "\$to = \n", $to, "\n";

__DATA__
# Email File
# List of email addresses
##############################
PRIMARY_EMAIL=abc@123.com
ALTERNATE_EMAIL=123@abc.com
#PRIMARY_EMAIL=def@456.com
#ALTERNATE_EMAIL=456@def.com
PRIMARY_EMAIL=ghi@789.com
ALTERNATE_EMAIL=789@ghi.com

join("", <DATA>)这是阅读所有行并加入其中。然后使用正则表达式,我将电子邮件直接解析到数组中。

于 2014-03-27T16:16:33.470 回答
0

使用分支重置/^(?|PRIMARY_EMAIL=(.*)|ALTERNATE_EMAIL=(.*))/

      ^
      (?|
           PRIMARY_EMAIL=
 br 1      ( .* )                        # (1)
        |  ALTERNATE_EMAIL=
 br 1      ( .* )                        # (1)
      )

或者,就这个/^(?:PRIMARY_EMAIL|ALTERNATE_EMAIL)=(.*)/

 ^ 
 (?: PRIMARY_EMAIL | ALTERNATE_EMAIL )
 =
 ( .* )                             # (1)

测试用例

 while (<DATA>) {
     if (/^(?:PRIMARY_EMAIL|ALTERNATE_EMAIL)=(.*)/)
     {
        push (@recipient, $1);
     }
 }

 $to = join("\n", @recipient);
 print "\$to = \n", $to, "\n";

__DATA__
# Email File
# List of email addresses
##############################
PRIMARY_EMAIL=abc@123.com
ALTERNATE_EMAIL=123@abc.com
#PRIMARY_EMAIL=def@456.com
#ALTERNATE_EMAIL=456@def.com
PRIMARY_EMAIL=ghi@789.com
ALTERNATE_EMAIL=789@ghi.com

输出>>

 $to =
 abc@123.com
 123@abc.com
 ghi@789.com
 789@ghi.com

这是另一种方式

$/ = undef;
print join("\n",(<DATA> =~ /^(?:PRIMARY_EMAIL|ALTERNATE_EMAIL)=(.*)/mg));

__DATA__
# Email File
# List of email addresses
##############################
PRIMARY_EMAIL=abc@123.com
ALTERNATE_EMAIL=123@abc.com
#PRIMARY_EMAIL=def@456.com
#ALTERNATE_EMAIL=456@def.com
PRIMARY_EMAIL=ghi@789.com
ALTERNATE_EMAIL=789@ghi.com

输出>>

abc@123.com
123@abc.com
ghi@789.com
789@ghi.com
于 2014-03-27T15:14:37.603 回答