首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl Map函数

Perl Map函数
EN

Stack Overflow用户
提问于 2010-06-27 03:03:34
回答 2查看 1.2K关注 0票数 2

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

我可以成功地"grep“@trackname,但是"map”有问题。如果在一行中发现两个连续的"--“,我希望@trackartist返回true,值为$1,否则返回false,但如果不满足上面的条件,则返回整个行。我做错了什么?

代码语言:javascript
复制
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.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-27 03:25:17

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

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

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

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

代码语言:javascript
复制
my @trackartist = map { /^\d\d\.\s(.*?)\s--.*?\.(?:flac|wv)$/ ? $1 : ( ) } <*.*>

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

顺便说一句,您可能希望使用glob函数而不是<>,这有一些缺点。

票数 6
EN

Stack Overflow用户

发布于 2010-06-27 07:56:59

我和其他人一样喜欢mapgrep,但您的任务似乎更适合分而治之的解析方法。我之所以这样说,是因为您的评论表明,您对map的兴趣正在引导您走上一条道路,最终得到一个由并行数组组成的数据模型-- @tracks@artists等--从长远来看,这通常很难维护。以下是我的意思的草图:

代码语言:javascript
复制
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.txt
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3125170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档