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