免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2385 | 回复: 8
打印 上一主题 下一主题

为何map返回的不是相匹配的原内容,而是pattern本身? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-30 13:41 |只看该作者 |倒序浏览
如题,请教各位。新手,不好意思,测试了很久,太耽误时间了。
代码如下:
思路:输入一个要查询的字符串,检查某个目录下所有文件名是否有匹配的。如果有,则返回所有匹配的文件名。

use 5.010;
use Cwd;
chomp( $mydir = cwd);
#@myfiles = glob "$mydir/xiaoyangtuo/*";
@myfiles = glob "$mydir/xiaoyangtuo/*";
#print "\@myfiles are: @myfiles\n";
print "input a pattern as part of file name for earhing: \n";
chomp ($mypattern =<STDIN>);
while ($mypattern) {
       @myfile_search = map /$mypattern/g, @myfiles;
       #@myfile_search = map /$mypattern/g, glob(".* *"); #this line should go with chdir which is not correct right now;
        print "myfile_search is: @myfile_search \n";
        chomp ($mypattern =<STDIN>);
}

论坛徽章:
0
2 [报告]
发表于 2011-03-30 14:30 |只看该作者
改 map 为 grep 结果就是我所要得内容。

但是用map 如何做呢?学习中,希望能有人在我花费大量时间之前,给我指点一下,谢谢。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2011-03-30 23:03 |只看该作者
map 就是一一映射,返回结果肯定和 @myfiles 中的元素个数一样的,你这里用 map 的话会返回匹配的结果,即是否匹配。然后再用下标索引找 @myfiles 中匹配的的元素,总之没有 grep 好用

论坛徽章:
0
4 [报告]
发表于 2011-03-30 23:44 |只看该作者
本帖最后由 iLRainyday 于 2011-03-30 23:55 编辑

grep和map各有用途,前者用于picking,后者用于transforming。你的要求显然是个picking element。
如果非要用map,那就这样子 map /($pattern)/, @elements,在map的表达式部分是list context,加上括号,返回匹配的部分。regex部分加个/g搞毛啊?

论坛徽章:
0
5 [报告]
发表于 2011-03-30 23:56 |只看该作者
本帖最后由 iLRainyday 于 2011-03-30 23:59 编辑
map 就是一一映射,返回结果肯定和 @myfiles 中的元素个数一样的,你这里用 map 的话会返回匹配的结果,即是 ...
zhlong8 发表于 2011-03-30 23:03


map可能返回空列表,也可能小于或大于@myfiles的元素个数

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
6 [报告]
发表于 2011-03-31 00:08 |只看该作者
map可能返回空列表,也可能小于或大于@myfiles的元素个数
iLRainyday 发表于 2011-03-30 23:56



    {:3_186:} 多谢指出,是我疏忽。 map 返回一个列表,对每个元素 map 的结果提供 list context,因为 Perl 的列表和数组在 list context 下会展开,所以返回列表或数组的时候元素个数并不一定严格相等。

论坛徽章:
0
7 [报告]
发表于 2011-03-31 10:14 |只看该作者
多谢指出,是我疏忽。 map 返回一个列表,对每个元素 map 的结果提供 list context,因 ...
zhlong8 发表于 2011-03-31 00:08


谢谢两位。理解上比以前清晰了。还是要多“动手”啊。

论坛徽章:
0
8 [报告]
发表于 2011-03-31 11:03 |只看该作者
grep和map各有用途,前者用于picking,后者用于transforming。你的要求显然是个picking element。
如果非要 ...
iLRainyday 发表于 2011-03-30 23:44



谢谢哦。看来我是滥用了羊驼书中的“Thus, we can always use a map in place of a grep, but not vice versa.”
不过改 map /$mypattern/, $myfiles 为 map /($mypattern)/, $myfiles 之后,还是只能输出个数正确的 $mypattern, 而不是匹配的文件全名称。

论坛徽章:
0
9 [报告]
发表于 2011-03-31 20:09 |只看该作者
回复 8# perlplus33


    我以为你就是要匹配的那一部分。那就用grep得了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP