Perl 如果未指定参数,请修改$
我有这个Perl 如果未指定参数,请修改$,perl,Perl,我有这个trim例程: sub trim { for (@_) { s|^\s+||; s|\s+$||; } } 它会“就地”修剪空白,即: 将修剪$x和$y的空白(修改它们) 如何改进trim,让我可以这样称呼它: trim; 这与: trim $_; ?只需检查是否没有提供任何参数: use strict; use warnings; $_=" abc "; sub trim { if(@_) { f
trim
例程:
sub trim {
for (@_) {
s|^\s+||;
s|\s+$||;
}
}
它会“就地”修剪空白,即:
将修剪$x和$y的空白(修改它们)
如何改进trim
,让我可以这样称呼它:
trim;
这与:
trim $_;
?只需检查是否没有提供任何参数:
use strict;
use warnings;
$_=" abc ";
sub trim
{
if(@_)
{
foreach my $i(@_)
{
$i=~s/^\s+//;
$i=~s/\s+$//;
}
}
else
{
s/^\s+//;
s/\s+$//;
}
}
trim;
print "!$_!\n"; #Throwing in exclamation points just to make sure white space is gone.
这将产生输出
!abc!
您只需将
@
替换为@:$_在for
循环的参数中的code>
sub trim {
for (@_ ? @_ : $_) {
s|^\s+||;
s|\s+$||;
}
}
根据ikegami的回答,有一个棘手的问题,那就是如何处理词法$
(用my$
声明)的枯萎病,因为该版本的$
不是全局的,而是绑定到词法pad
($)
原型是解决此问题的一种方法,但它也意味着子例程只接受一个参数,并且该参数具有标量上下文,这使得它与($)
原型一样糟糕(由于标量上下文的意外后果)
无论何时尝试在词汇上施展魔法,该模块都会派上用场。因此,这是一个可以正确处理列表、词法和全局$\uuu
的版本,它不会将标量上下文强加给调用站点:
use PadWalker 'peek_my';
sub trim {
my $it;
unless (@_) {
my $pad = peek_my 1;
$it = $$pad{'$_'} || \$::_
}
for (@_ ? @_ : $$it) {
s/^\s+//;
s/\s+$//;
}
}
{local $_ = " a "; trim; say "[$_]"} # prints "[a]"
{my $_ = " a "; trim; say "[$_]"} # prints "[a]"
{my $x = " a "; trim $x; say "[$x]"} # prints "[a]"
就我个人而言,我只是避免使用词法$\uu
,这样的丑陋问题就会消失。但是如果您需要支持它,这是一种方法。如果您的修剪只需要一个arg,您可以使用\ucode>原型
sub trim(_) {
for ($_[0]) {
s|^\s+||;
s|\s+$||;
}
}
那么所有这些都会起作用:
{ local $_ = " abc "; trim; say; }
{ my $_ = " abc "; trim; say; }
{ my $x = " abc "; trim $x; say $x; }
但是由于您的trim
包含一个参数列表,因此您不能使用
原型。您必须使用@?@:$_代码>
sub trim {
for (@_ ? @_ : $_) {
s|^\s+||;
s|\s+$||;
}
}
{ local $_ = " abc "; trim; say; }
{ my $_ = " abc "; trim; say; } # XXX $::_ changed instead of $_
{ my $x = " abc "; trim $x; say $x; }
但这意味着它不能与词法$\uu
一起使用
sub trim {
for (@_ ? @_ : $_) {
s|^\s+||;
s|\s+$||;
}
}
{ local $_ = " abc "; trim; say; }
{ my $_ = " abc "; trim; say; } # XXX $::_ changed instead of $_
{ my $x = " abc "; trim $x; say $x; }
在re-lexical$\uuu
中:不要这样做。:)@tchrist,所以不要使用给定的
,那么…?@BradGilbert:main::trim:@
@Brad Gilbert的原型格式不正确,我已经尝试了
。我没有试过@因为如果\u@
不起作用,那么它就没有意义了t@ikegami只要它坏了就不会,不,当然不会。改用来表示
。