我正在从文件中读取行:
CUSTEVSUMMROW_GPRS_SIMPLE GPRS - Intl Roaming - Mexico - Simple All In Plan (Monthly)|12920|MB|7750|1000|(243)
我使用以下逻辑
$line=~m/^(CUSTEVSUMMROW_GPRS).*?\s(.*?)\|.*\|(.*?)\s
我可以单独提取数据,如下所示
print"
Tag:CUSTEVSUMMROW_GPRS,
amt:1000,
lineTxt:GPRS - Intl Roaming - Mexico - Simple All In Plan (Monthly)\n";
如何提取另一个名为$usage = 12920
的项目?
答案 0 :(得分:0)
如果您只想调整正则表达式,可以在里面添加另一个捕获组。我建议更具体一点,并使用\d
代替.
来匹配数字。
/^(CUSTEVSUMMROW_GPRS).*?\s(.*?)\|(\d+)\|.*\|(.*?)\s/
12920
将以$3
结束,而(243)
现在将为$4
。
请注意,您实际上并未从示例数据中捕获CUSTEVSUMMROW_GPRS_SIMPLE
。 _SIMPLE
丢失了。您也没有在括号(243)
中输出数字。将代码复制到问题中时是否犯了错误?
然而,使用split
可能更好。如果数据在每一行中具有相同的格式,则可能如下所示。当然,我必须在这里做一些猜测,因为这个问题相当有点。
use strict;
use warnings;
use feature 'say';
while (my $line = <DATA>) {
chomp $line;
my ($first_part, @details) = split /\|/, $line;
my ($tag, $line_txt) = split /\s/, $first_part, 2;
say "Tag: $tag";
say "amt: $details[3]";
say "lineTxt: $line_txt";
say "usage: $details[0]";
}
__DATA__
CUSTEVSUMMROW_GPRS_SIMPLE GPRS - Intl Roaming - Mexico - Simple All In Plan (Monthly)|12920|MB|7750|1000|(243)