Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如果未指定参数,请修改$_Perl - Fatal编程技术网

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只要它坏了就不会,不,当然不会。改用
来表示