匹配正则expression式,并在单行代码中分配结果

我想能够在variables上执行正则expression式匹配,并将结果赋给variables本身。 什么是最好的办法呢?

我想在一行代码中将第2行和第3行结合起来:

$variable = "some string"; $variable =~ /(find something).*/; $variable = $1; 

有没有更简单的方法来做到这一点? 我错过了什么吗?

为什么你想要它更短? 真的很重要吗?

 $variable = $1 if $variable =~ /(find something).*/; 

如果您担心variables名称或反复执行此操作,请将其包装在子程序中,然后忘记它:

  some_sub( $variable, qr/pattern/ ); sub some_sub { $_[0] = $1 if eval { $_[0] =~ m/$_[1]/ }; $1 }; 

但是你实现它的时候,子程序的重点就是使它可重用,所以你给一组特定的行设置了一个简短的名字。

 my($variable) = "some string" =~ /(e\s*str)/; 

这是因为

如果没有使用/g选项, m//在列表上下文中将返回一个列表,其中包含模式中括号所匹配的子expression式, $1$2$3 …)。

因为my($variable) = ... (注意标量周围的圆括号)为匹配提供列表上下文。

如果模式不匹配, $variable会得到未定义的值。

你可以做替代为:

 $a = 'stackoverflow'; $a =~ s/(\w+)overflow/$1/; 

$a现在是"stack"

那么,你可以说

 my $variable; ($variable) = ($variable = "find something soon") =~ /(find something).*/; 

要么

 (my $variable = "find something soon") =~ s/^.*?(find something).*/$1/; 

几乎…

您可以组合匹配并将匹配的值与replace值进行检索。

 $variable =~ s/.*(find something).*/$1/; 

AFAIK,你将永远不得不复制价值,除非你不在乎打破原来的。

 $variable2 = "stackoverflow"; (my $variable1) = ($variable2 =~ /stack(\w+)/); 

$variable1现在等于"overflow"

我这样做:

 #!/usr/bin/perl $target = "n: 123"; my ($target) = $target =~ /n:\s*(\d+)/g; print $target; # the var $target now is "123"