搜索两个perl正则表达式并存储在一个声明的变量中

时间:2014-09-23 23:19:52

标签: regex perl variables

所以这就是场景:

  1. 我对字符串执行perl正则表达式搜索并将其存储在变量
  2. 然后我想从该变量中检索一个子串并将其保存在同一个变量
  3. 当我尝试使用两个单独的变量时,它可以工作,但我想尽量减少我的变量声明。目前的工作原理:

    my ($temp1)         = ($buildLog =~ /(build\_version.*\d*)/);
    my ($buildVersion)  = ($temp1 =~ /(\d.*)/);
    
    print "$temp1\n"; #$temp1 contains: build_version = 1411450178
    
    print "$buildVersion\n"; #$buildVersion contains: 1411450178
    

    但是当我尝试用一​​个变量做它时,它只会输出1,即它找到匹配,但我想要实际值。见下文:

    my ($temp2)     = ($buildLog =~ /(build\_version.*\d*)/);
    $temp2          = ($temp2 =~ /(\d.*)/);
    
    print "$temp2\n"; #$temp1 just prints out 1
    

    请问有人可以快速浏览行为,是否确实只能使用一个变量来获取搜索内容?

    谢谢, CJ

3 个答案:

答案 0 :(得分:2)

只需要一个正则表达式:

use strict;
use warnings;

my $buildLog = 'foobar build_version = 1411450178 bazbiz';

my ($buildVersion) = $buildLog =~ /build_version\D*(\d+)/;

print "$buildVersion\n";

输出:

1411450178

答案 1 :(得分:2)

This answer为您要做的事情提供了正确的解决方案。我只是想快速解释为什么你的代码没有按预期工作。

您会混淆标量和列表模式。你的代码

$temp2          = ($temp2 =~ /(\d.*)/);

获取匹配的结果(在列表上下文中)并将其分配给标量。这会将列表中的元素数分配给标量。

您也可以使用

$temp2          = ($temp2 =~ /(\d.*)/)[0];

获取第一个匹配结果。

@ jm666的答案有效,因为它将匹配结果列表分配给变量列表。

答案 2 :(得分:0)

以下

my ($temp2)     = ($buildLog =~ /(build\_version.*\d*)/);
($temp2)        = ($temp2 =~ /(\d.*)/);

将打印

 1411450178