加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 将替换应用于grep返回的第一个项目

发布时间:2020-12-16 06:21:32 所属栏目:大数据 来源:网络整理
导读:我有这个程序 sub f { return ("A/X","B/X"); } $x = grep( /X$/,f() ) =~ s//X$//r; print "$xn"; ($x) = grep( /X$/,f() ) =~ s//X$//r; print "$xn"; ( ($x) = grep( /X$/,f() ) ) =~ s//X$//; print "$xn"; ($x) = grep( /X$/,f() ); $x =~ s//X/
我有这个程序

sub f {                                                                                                                                                                                                                       
    return ("A/X","B/X");                                                                                                   
}                                                                                                                            

$x = grep( /X$/,f() ) =~ s//X$//r;                                                                                           
print "$xn";                                                                                                                

($x) = grep( /X$/,f() ) =~ s//X$//r;                                                                                         
print "$xn";                                                                                                                

( ($x) = grep( /X$/,f() ) ) =~ s//X$//;                                                                                        
print "$xn";                                                                                                                

($x) = grep( /X$/,f() );                                                                                                      
$x =~ s//X//;                                                                                                               
print "$xn";

结果是

2
2
A/X
A

我想要的结果是

A

但只有最后一次尝试才能产生它.

在我的完整程序中,我想用一行来完成这个,因为我必须多次这样做.我想避免像$x [0]这样的事情,f()是一个更复杂的函数

我该怎么做?

解决方法

my ($x) = map { s{/X$}{}r } grep { /X$/ } f();

要么

my $x = ( grep { /X$/ } f() )[0] =~ s{/X$}{}r;

要么

use List::Util qw( first );

my $x = ( first { /X$/ } f() ) =~ s{/X$}{}r;

如果f()没有返回任何内容,第一个静默地将$x设置为undef,而另外两个将$x设置为空字符串,并在该情况下发出警告.第二个避免了不必要的工作.第三个避免更多.

顺便说一句,你要求相当于以下内容

my ($x) = map { s{/X$}{}r } grep { m{X$} } f();

但我认为你想要以下内容:

my ($x) = map { s{/X$}{}r } grep { m{/X$} } f();

让我们避免重复,以避免再犯错误!

my ($x) = map { my $s=$_; $s =~ s{/X$}{} ? $s : () } f();

要么

use File::Basename qw( fileparse );

my ($x) = map { my ($fn,$dir_qn) = fileparse($_); $fn eq 'X' ? $dir_qn : () }  f();

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读