perl map,grep正则语句
@words=map{($v)=/(\w+)/;$v}grep{/$key/}<DATA>;请问map这句怎么理解?先运行的map还是先grep?可以互换么?...
@words = map { ($v) = /(\w+)/; $v }
grep { /$key/ } <DATA>;
请问map这句怎么理解? 先运行的map还是先grep?可以互换么? 展开
grep { /$key/ } <DATA>;
请问map这句怎么理解? 先运行的map还是先grep?可以互换么? 展开
4个回答
展开全部
先运行grep从DATA文件句柄中读取内容,再传给map,那就是个匹配,最后才存到@words中
追问
问题1,为什么那个匹配要重新赋值给V??
问题2,为什么grep和map的顺序调换就不对??
追答
1、你没有搞懂grep和map在perl中的用法,grep是对列表进行筛选,map是对列表进行转换,一个是挑选作用,只保留了需要的。而map,是对列表中的元素进行了修改。
2、你的这个程序,grep操作从文件列表中筛选出能匹配上$key的行。
然后传给map,先存到$v中,再进行对$v进行正则匹配,提出这一行的中的单词,当然这个单词是[A-Za-z0-9_],而不单纯是我们所说的英文单词
提出的的单词再传回到$v中,这里相当于再进行了一次赋值。(\w+)进行了变量捕获,也是就捕获了一行(一个长字串)中的单词,再赋值给了$v,这里$v的值就改变了,不再是原来的行了。这个单词再存进了@words中。
3、你把它反过来当然不行,你先提出了单词,再过行$key匹配,怎么会通过呢,两个操作的顺序都反了。
展开全部
这个语句就是找到含有$key的所有行,然后把没一行的第一个单词放到@words数组。map这一行其实是这样写map {($v)= $_ =~ /(\w+)/;$v},$_省略了,不能互换map和grep
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不管是grep和map还是再加个sort,perl都是从最右边开始执行的。
也就是说这句的意思是
1.对于文件句柄<DATA>里面的每一行进行处理(最右也就是)
2.处理什么呢?找到匹配$key的进行进一步处理
3.进一步处理什么呢?
3.1声明一个$v,在找到的一行里面匹配一个字符以上的东西,并负值给$v。如果不负值给$v直接用$_应该也是可以的。
3.2把$v放到@words的最后面
整个这个过程也可以用while循环来写N行,这么写就简单多啦 ̄へ ̄
也就是说这句的意思是
1.对于文件句柄<DATA>里面的每一行进行处理(最右也就是)
2.处理什么呢?找到匹配$key的进行进一步处理
3.进一步处理什么呢?
3.1声明一个$v,在找到的一行里面匹配一个字符以上的东西,并负值给$v。如果不负值给$v直接用$_应该也是可以的。
3.2把$v放到@words的最后面
整个这个过程也可以用while循环来写N行,这么写就简单多啦 ̄へ ̄
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
呃,map用法看了没,
map EXPR,LIST
map BLOCK LIST
map返回是个LIST ,
你对照看看,你的语句属于哪种用法呢,
map 的处理 需要一个LIST 来提供数据,你的LIST 是不是grep部分,
map EXPR,LIST
map BLOCK LIST
map返回是个LIST ,
你对照看看,你的语句属于哪种用法呢,
map 的处理 需要一个LIST 来提供数据,你的LIST 是不是grep部分,
追问
看了。我感觉是grep提供的list,然后$v是那个list的每一行。
但是困惑的是为什么要 ($v) = /(\w+)/; $v(我的理解是,选择这行中的第一个单词,不明白的是为什么需要重新赋值给V)。
还有就是,grep和map这2句如果互换,就运行不出来。。不知道为什么
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询