1

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

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

我想将 $result 设置在与正则表达式相同的行中,并且从不使用 $1。谢谢!

4

3 回答 3

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

如评论中所述,my($result)需要括号为匹配结果提供数组上下文。在数组上下文中,您将$1etc 分配给数组。你可以使用@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
$
于 2013-05-28T18:21:54.257 回答
2

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

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

$result当模式不匹配时,您可以使用条件来分配有用的东西

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

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

my ($result) = $data =~ /(my_query)/;
于 2013-05-28T18:31:25.717 回答
0
$data="abcde";
$data =~ s/(cde)/$result=$1/e;
于 2013-05-28T23:26:02.600 回答