我希望能够对变量进行正则表达式匹配,并将结果分配给变量本身.最好的方法是什么?
我想基本上将第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)
无论你实现它,子程序的要点是使它可以重复使用,这样你就可以为一组特定的行提供一个代替它们的简短名称.
您可以替换为:
$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;
Run Code Online (Sandbox Code Playgroud)
$a 就是现在 "stack"
好吧,你可以说
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)
我只是假设每个人都是这样做的,很惊讶没有人给出这个答案。