我确信有一种非常简单的方法可以做到这一点,但每当我搜索示例时,我都会得到两步法。这是我通常做的事情:
$data =~ m/(my_query)/;
$result = $1;
我想将$ result设置为与正则表达式相同的行,并且永远不要使用$ 1。谢谢!
答案 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;