2

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

 #                 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

4 回答 4

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
于 2012-11-29T23:03:44.643 回答
2

另一种选择是在空格上拆分字符串:

my ($time, $addr, $data) = (split / +/, $line)[1, 4, 7];
于 2012-11-29T23:12:01.063 回答
0

在 python 中,适当的正则表达式如下:

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

但我不确切知道如何用 perl 编写它。你可以搜索它。如果您需要对此正则表达式的任何解释,我可以用更精确的描述编辑这篇文章。

于 2012-11-29T23:05:42.270 回答
0

我发现使用\s+. 这样,如果输入字符串中包含任何制表符而不是空格,您将不会遇到任何问题。

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

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

于 2012-11-29T23:30:53.183 回答