Raz*_*orm 10 regex perl replace
通常,如果您希望使用正则表达式更改变量,请执行以下操作:
$string =~ s/matchCase/changeCase/;
Run Code Online (Sandbox Code Playgroud)
但有没有办法简单地替换内联而不将其设置回变量?
我希望在这样的事情中使用它:
my $name="jason";
print "Your name without spaces is: " $name => (/\s+/''/g);
Run Code Online (Sandbox Code Playgroud)
像这样的东西,有点像PHP中的preg_replace函数.
Axe*_*man 12
针对Perl 5.14进行了修订.
从5.14开始,用/r
标志返回替换,你可以这样做:
print "Your name without spaces is: [", do { $name =~ s/\s+//gr; }
, "]\n";
Run Code Online (Sandbox Code Playgroud)
您可以使用map
和词法变量.
my $name=" jason ";
print "Your name without spaces is: ["
, ( map { my $a = $_; $a =~ s/\s+//g; $a } ( $name ))
, "]\n";
Run Code Online (Sandbox Code Playgroud)
现在,你必须使用词法,因为$ _将别名,从而修改你的变量.
输出是
Your name without spaces is: [jason]
# but: $name still ' jason '
Run Code Online (Sandbox Code Playgroud)
不可否认,同样do
会工作(也许更好)
print "Your name without spaces is: ["
, do { my ( $a = $name ) =~ s/\s+//g; $a }
, "]\n";
Run Code Online (Sandbox Code Playgroud)
但词汇复制仍然存在.in中的赋值my
是一些人喜欢的缩写(不是我).
对于这个成语,我开发了一个我称之为的运算符filter
:
sub filter (&@) {
my $block = shift;
if ( wantarray ) {
return map { &$block; $_ } @_ ? @_ : $_;
}
else {
local $_ = shift || $_;
$block->( $_ );
return $_;
}
}
Run Code Online (Sandbox Code Playgroud)
你这么称呼它:
print "Your name without spaces is: [", ( filter { s/\s+//g } $name )
, "]\n";
Run Code Online (Sandbox Code Playgroud)