gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:49:07 27 4
gpt4 key购买 nike

我有这个程序

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

结果是

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;

第一个默默设置 $xundef如果 f()不返回任何内容,而其他两个设置 $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 返回的第一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48266754/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com