perl – 如果没有指定参数,则修改$_

我有这个修剪例程:
sub trim {
    for (@_) {
        s|^\s+||;
        s|\s+$||;
    }
}

它“就地”修剪了空白,即:

trim $x,$y;

将修剪$x和$y的空白(修改它们).

我怎样才能改进修剪,以便让我称之为:

trim;

这将是:

trim $_;

解决方法

您需要做的就是用@_替换@_? for循环的参数中的@_:$_.
sub trim {
    for (@_ ? @_ : $_) {
        s|^\s+||;
        s|\s+$||;
    }
}

根据ikegami的回答,关于如何处理因为版本$_(用我的$_;声明)的枯萎病有一个令人烦恼的问题,因为$_的版本不是全局的,而是绑定到词法填充.

(_)原型是解决这个问题的一种方法,但它也意味着子程序只接受一个参数,并且参数具有标量上下文,这使得它与(​​$)原型一样糟糕(由于意外后果)标量上下文).

每当试图在词汇上做魔术时,模块PadWalker就派上用场了.所以这是一个在列表上正常工作的版本,适用于词法和全局$_,并且它不会在调用站点上强制使用标量上下文:

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]"

就个人而言,我只是避免词汇$_而像这样丑陋的问题就消失了.但如果你需要支持它,这是一种方式.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...