perl – 如果没有指定参数,则修改$_
发布时间:2020-12-15 21:39:18 所属栏目:大数据 来源:网络整理
导读:我有这个修剪例程: sub trim { for (@_) { s|^s+||; s|s+$||; }} 它“就地”修剪了空白,即: trim $x,$y; 将修剪$x和$y的空白(修改它们). 我怎样才能改进修剪,以便让我称之为: trim; 这将是: trim $_; ? 解决方法 您需要做的就是用@_替换@_? for循环
我有这个修剪例程:
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]" 就个人而言,我只是避免词汇$_而像这样丑陋的问题就消失了.但如果你需要支持它,这是一种方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |