所以这就是场景:
当我尝试使用两个单独的变量时,它可以工作,但我想尽量减少我的变量声明。目前的工作原理:
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
答案 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