gpt4 book ai didi

Perl Map block 局部变量的使用

转载 作者:行者123 更新时间:2023-12-01 18:11:41 25 4
gpt4 key购买 nike

此代码通过一组路径中唯一基本名称 stub 的哈希键来编译一组路径。

%stubs = map { $f=basename $_; $f =~ /^([A-Za-z]+[0-9]+)\./ ; $1=>() } @pathlist;

为什么我需要这里的$f引用?我想我可以接受:

%stubs = map { basename; /^([A-Za-z]+[0-9]+)\./; $1=>() } @pathlist;

但我没有匹配到。我是否不允许修改 map block 中的$_?



对于那些想知道代码在做什么的人:

对于每个 $path (@pathlist),它获取基本名称,匹配第一个字母数字序列,然后返回第一个括号匹配作为空列表值上的键。示例:

/some/dir/foo123.adfjijoijb
/some/dir/foo123.oibhobihe
/some/dir/bar789.popjpoj

返回

foo123 => ()
bar789 => ()

之后,我使用映射的键作为值集进行处理。

最佳答案

basename 并不默认作用于 $_。但您可以匹配它的返回值,而不是使用 $f:

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./; $1 => undef } @pathlist;

请注意,列表中的 () 不会产生元素,它只是扁平化为空;你必须提供一个值,即使只是undef。使用 $1 => (),映射迭代将交替为 %stubs 生成键和值。

在使用 $1 之前,最好始终检查您的正则表达式是否成功:

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)\./ ? ($1 => undef) : () } @pathlist;

不过,如果您不介意哈希值是空字符串而不是 undef,您可以让正则表达式匹配返回所需的列表:

%stubs = map { basename($_) =~ /^([A-Za-z]+[0-9]+)()\./ } @pathlist;

关于Perl Map block 局部变量的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6055128/

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