sub f { return ("A/X","B/X"); } $x = grep( /X$/,f() ) =~ s/\/X$//r; print "$x\n"; ($x) = grep( /X$/,f() ) =~ s/\/X$//r; print "$x\n"; ( ($x) = grep( /X$/,f() ) ) =~ s/\/X$//; print "$x\n"; ($x) = grep( /X$/,f() ); $x =~ s/\/X//; print "$x\n";
结果是
22A/XA
我想要的结果是
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();总结
以上是内存溢出为你收集整理的perl – 将替换应用于grep返回的第一个项目全部内容,希望文章能够帮你解决perl – 将替换应用于grep返回的第一个项目所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)