Pat*_*rik 4 perl grep substitution
我有这个程序
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";
Run Code Online (Sandbox Code Playgroud)
结果是
2
2
A/X
A
Run Code Online (Sandbox Code Playgroud)
我想要的结果是
A
Run Code Online (Sandbox Code Playgroud)
但只有最后一次尝试才能产生它.
在我的完整程序中,我想用一行来完成这个,因为我必须多次这样做.我想避免这样的事情,$x[0]并且f()是一个更复杂的功能
我该怎么做?
my ($x) = map { s{/X$}{}r } grep { /X$/ } f();
Run Code Online (Sandbox Code Playgroud)
要么
my $x = ( grep { /X$/ } f() )[0] =~ s{/X$}{}r;
Run Code Online (Sandbox Code Playgroud)
要么
use List::Util qw( first );
my $x = ( first { /X$/ } f() ) =~ s{/X$}{}r;
Run Code Online (Sandbox Code Playgroud)
第一个静默设置$x为undefif,f()什么都不返回,而另外两个设置$x为空字符串,并在那种情况下发出警告.第二个避免了不必要的工作.第三个避免更多.
顺便说一句,你要求相当于以下内容
my ($x) = map { s{/X$}{}r } grep { m{X$} } f();
Run Code Online (Sandbox Code Playgroud)
但我认为你想要以下内容:
my ($x) = map { s{/X$}{}r } grep { m{/X$} } f();
Run Code Online (Sandbox Code Playgroud)
让我们避免重复,以避免再犯错误!
my ($x) = map { my $s=$_; $s =~ s{/X$}{} ? $s : () } f();
Run Code Online (Sandbox Code Playgroud)
要么
use File::Basename qw( fileparse );
my ($x) = map { my ($fn, $dir_qn) = fileparse($_); $fn eq 'X' ? $dir_qn : () } f();
Run Code Online (Sandbox Code Playgroud)