我确信有一种非常简单的方法可以做到这一点,但是每当我搜索示例时,我都会得到两步法。这是我通常做的事情:
$data =~ m/(my_query)/;
$result = $1;
我想将 $result 设置在与正则表达式相同的行中,并且从不使用 $1。谢谢!
my($result) = ($data =~ m/(my_query)/);
如评论中所述,my($result)
需要括号为匹配结果提供数组上下文。在数组上下文中,您将$1
etc 分配给数组。你可以使用@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
$
您没有指定要避免的问题,但肯定有一个要避免的问题。以下代码$result
在模式不匹配时分配未知内容:
$data =~ /(my_query)/;
my $result = $1;
$result
当模式不匹配时,您可以使用条件来分配有用的东西
my $result = $data =~ /(my_query)/ ? $1 : undef;
或者您可以利用m//
在列表上下文中返回它捕获的内容这一事实。
my ($result) = $data =~ /(my_query)/;
$data="abcde";
$data =~ s/(cde)/$result=$1/e;