匹配正则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"