gpt4 book ai didi

Perl 映射函数

转载 作者:行者123 更新时间:2023-12-02 07:13:41 26 4
gpt4 key购买 nike

我是 map 和 grep 函数的新手,我正在尝试使现有脚本更简洁。

我可以成功地“grep”@tracknames,但我在使用“ map ”时遇到了问题。如果在一行中找到两个连续的“--”并取 $1 的值,我希望@trackartist 返回 true,否则返回 false,但如果不满足上面的条件,它会返回整行。我做错了什么?

my @tracknames = grep /^\d\d\..*?(\.(?:flac|wv))$/, <*.*>;
my @trackartist = map { s/^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/$1/; $_; } <*.*>;

Sample of files
01. some track artist 1 -- some track name 1.(flac or wv)
02. some track artist 2 -- some track name 2.(flac or wv)
03. some track artist 3 -- some track name 3.(flac or wv)
etc.

最佳答案

记住 grep用于过滤列表和map用于转换列表。现在,你的 map语句返回 $_对于列表中的每个项目。如果$_匹配您替换中的模式,它将被修改并替换为第一个匹配项。否则,它不会被修改,原始的 $_被退回。

听起来您想过滤掉与模式不匹配的项目。一种方法是结合 map 和 grep:

my @trackartist = map { s/^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/$1/; $_; }
grep { /^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/ } <*.*>;

当然,这意味着您要对相同的模式进行两次匹配。另一种方法是使用 map 进行转换,但将与模式不匹配的任何内容转换为空列表。

my @trackartist = map { /^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/ ? $1 : ( ) } <*.*>

这使用三元条件运算符 (?:) 来检查正则表达式是否匹配(返回真值)。如果是,$1map 返回 block ,如果不是,一个空列表 ( )返回,这不会向 map 产生的列表中添加任何内容.

作为旁注,您可能需要研究使用 glob函数而不是 <> ,这有一些缺点。

关于Perl 映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3125170/

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