使用perl从一行中提取元素的更好方法是什么?

时间:2012-11-29 22:54:25

标签: perl

我想从文件的每一行中提取一些元素。 以下是该行:

 #                 1150 Reading location  09ef38 data = 00b5eda4

我想从此行提取地址 09ef38 和数据 00b5eda4

我使用的方式很简单,如下所示:

while($line = < INFILE >) {

    if ($line =~ /\#\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*(\S+)\s*=\s*(\S+)/) {
       $time = $1;
       $address = $4;
       $data = $6;
       printf(OUTFILE "%s,%s,%s \n",$time,$address,$data);
      }
}

我想知道有更好的想法吗?更简单,更清洁?

非常感谢!

TCGG

4 个答案:

答案 0 :(得分:2)

您可以在LHS上使用匹配和列表,如下所示:

echo '# 1150 Reading location 09ef38 data = 00b5eda4' | 
  perl -ne '
    $,="\n";
    ($time, $addr, $data) = /#\s+(\w+).*?location\s+(\w+).*?data\s*=\s*(\w+)/;
    print $time, $addr, $data'

输出:

1150
09ef38
00b5eda4

答案 1 :(得分:2)

另一个选择是split空格上的字符串:

my ($time, $addr, $data) = (split / +/, $line)[1, 4, 7];

答案 2 :(得分:0)

在python中,适当的正则表达式将是:

'[0-9]+[a-zA-Z ]*([0-9]+[a-z]+[0-9]+)[a-zA-Z ]*= ([0-9a-zA-Z]+)'

但我不确切知道如何在perl中编写它。你可以搜索它。如果您需要对此正则表达式进行任何解释,我可以使用更精确的描述编辑此帖子。

答案 3 :(得分:0)

我发现使用\s+分割一个或多个任何类型的空格很方便。这样,如果输入字符串中包含任何制表符而不是空格,则不会有任何问题。

while($line = <INFILE>)
{
    my ($time, $addr, $data) = (split /\s+/, $line)[1, 4, 7];
}

当按任何类型的空格分割时,重要的是要注意它也会在最后用换行符分割,所以你会在返回结束时得到一个空元素。但在大多数情况下,除非您关心返回的元素总量,否则无需关心。