如何将匹配的正则表达式的值保存到一行perl中的变量?

时间:2013-05-28 18:20:41

标签: regex perl

我确信有一种非常简单的方法可以做到这一点,但每当我搜索示例时,我都会得到两步法。这是我通常做的事情:

$data =~ m/(my_query)/;
$result = $1;

我想将$ result设置为与正则表达式相同的行,并且永远不要使用$ 1。谢谢!

3 个答案:

答案 0 :(得分:4)

my($result) = ($data =~ m/(my_query)/);

如评论中所述,my($result)需要括号为匹配结果提供数组上下文。在数组上下文中,您将获得分配给该数组的$1等。你可以使用@result = ($data =~ m/(my_query)/);;你可以省略my,但你需要保留括号;您可以使用$result = ($data =~ m/(my_query)/)[0];下标数组(感谢ysth)。这里的关键词是'数组上下文'。

示例:

$ perl -e '$data="abcdef";my($result)=($data =~ m/(cde)/); print "$result\n"'
cde
$ perl -e '$data="abcdef";  ($result)=($data =~ m/(cde)/); print "$result\n"'
cde
$ perl -e '$data="abcdef";   @result =($data =~ m/(cde)/); print "$result[0]\n"'
cde
$ perl -e '$data="abcdef";   $result =($data =~ m/(cde)/)[0]; print "$result\n"'
cde
$

答案 1 :(得分:2)

您没有指定要避免的问题,但肯定有一个要避免的问题。当模式不匹配时,以下代码会为$result指定未知的内容:

$data =~ /(my_query)/;
my $result = $1;

当模式不匹配时,您可以使用条件为$result分配有用的内容

my $result = $data =~ /(my_query)/ ? $1 : undef;

或者你可以利用列表上下文中的m//返回它捕获的内容这一事实。

my ($result) = $data =~ /(my_query)/;

答案 2 :(得分:0)

$data="abcde";
$data =~ s/(cde)/$result=$1/e;