加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl映射块本地变量用法

发布时间:2020-12-15 23:35:26 所属栏目:大数据 来源:网络整理
导读:此代码通过一组路径中唯一的基本名称存根的哈希键来编译集合. %stubs = map { $f=basename $_; $f =~ /^([A-Za-z]+[0-9]+)./ ; $1=() } @pathlist; 为什么我在这里需要$f引用?我以为我会好的: %stubs = map { basename; /^([A-Za-z]+[0-9]+)./; $1=() }
此代码通过一组路径中唯一的基本名称存根的哈希键来编译集合.

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

为什么我在这里需要$f引用?我以为我会好的:

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

但我得不到匹配.我不允许在地图块中修改$_吗?

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

对于每个$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 => (),map迭代将交替产生一个键和%stubs的值.

在使用$1之前总是检查你的正则表达式是否成功是很好的:

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读