匹配正则表达式并在单行代码中分配结果

38 regex perl

我希望能够对变量进行正则表达式匹配,并将结果分配给变量本身.最好的方法是什么?

我想基本上将第2行和第3行组合在一行代码中:

$variable = "some string";
$variable =~ /(find something).*/;
$variable = $1;
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*con 57

my($variable) = "some string" =~ /(e\s*str)/;
Run Code Online (Sandbox Code Playgroud)

这是因为

如果/g不使用选项,m//在列表上下文返回由以图案括号,匹配的子表达式的列表,即,( ,,$1 ...).$2$3

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

如果模式不匹配,则$variable获取未定义的值.


bri*_*foy 27

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

$variable = $1 if $variable =~ /(find something).*/;
Run Code Online (Sandbox Code Playgroud)

如果您担心变量名称或重复执行此操作,请将该事物包装在子例程中并忘记它:

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

无论你实现它,子程序的要点是使它可以重复使用,这样你就可以为一组特定的行提供一个代替它们的简短名称.


cod*_*ict 7

您可以替换为:

$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;
Run Code Online (Sandbox Code Playgroud)

$a 就是现在 "stack"


Cha*_*ens 6

好吧,你可以说

my $variable;
($variable) = ($variable = "find something soon") =~ /(find something).*/;
Run Code Online (Sandbox Code Playgroud)

要么

(my $variable = "find something soon") =~ s/^.*?(find something).*/$1/;
Run Code Online (Sandbox Code Playgroud)


小智 5

来自 Perl Cookbook 2nd ed 6.1 Copying and Substituting Simultaneously

$dst = $src;
$dst =~ s/this/that/;
Run Code Online (Sandbox Code Playgroud)

变成

($dst = $src) =~ s/this/that/;
Run Code Online (Sandbox Code Playgroud)

我只是假设每个人都是这样做的,很惊讶没有人给出这个答案。