我是map和grep函数的新手,我正在努力使现有的脚本更简洁。
我可以成功地"grep“@trackname,但是"map”有问题。如果在一行中发现两个连续的"--“,我希望@trackartist返回true,值为$1,否则返回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.发布于 2010-06-27 03:25:17
记住,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 : ( ) } <*.*>它使用三元条件运算符(?:)检查正则表达式是否匹配(返回真值)。如果是,则从map块返回$1;如果不是,则返回一个空的列表( ),这不会向map产生的列表添加任何内容。
顺便说一句,您可能希望使用glob函数而不是<>,这有一些缺点。
发布于 2010-06-27 07:56:59
我和其他人一样喜欢map和grep,但您的任务似乎更适合分而治之的解析方法。我之所以这样说,是因为您的评论表明,您对map的兴趣正在引导您走上一条道路,最终得到一个由并行数组组成的数据模型-- @tracks、@artists等--从长远来看,这通常很难维护。以下是我的意思的草图:
my @tracks;
while (my $file_name = <DATA>){ # You'll use glob() or <*.*>
# Filter out unwanted files.
my ($num, $artist_title, $ext) = $file_name =~ /
^ (\d\d) \. \s*
(.*)
\. (flac|wv) $
/x;
next unless $ext;
# Try to parse the artist and title. Adjust as needed.
my ($artist, $title) = split /\s+--\s+/, $artist_title, 2;
($artist, $title) = ('UNKNOWN', $artist) unless $title;
# Store all info as a hash ref. No need for parallel arrays.
push @tracks, {
file_name => $file_name,
ext => $ext,
artist => $artist,
title => $title,
};
}
__DATA__
01. Perl Jam -- Open or die.wv
02. Perl Jam -- Map to nowhere.flac
03. Perl Jam -- What the #$@!?.wv
04. Perl Jam -- Regex blues.wv
05. Perl Jam -- Use my package, baby.wv
06. Perl Jam -- No warnings.wv
07. Perl Jam -- Laziness ISA virtue.wv
08. Guido and the Pythons -- Home on the xrange.flac
09. Guido and the Pythons -- You gotta keep em generated.flac
10. StackOverflow medley.wv
foo.txthttps://stackoverflow.com/questions/3125170
复制相似问题