当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 17 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 10:20 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
昨天,突发奇想了一下,居然搞定了一个历史遗留的map写法。赞叹于Perl的随心所欲,特写下此篇以留念。

map 就是针对列表的foreach操作,可带块和正则之一。列表的项目当成临时的$_,块的最后一个返回值,会push到目标列表/散列(array/hash)。其中,使用到的$_和push的目标,都是临时的,不影响外部变量。 <- 这是我理解的。希望别人纠正。map的中文说明,太少了。英文的说明,搜索到的,都看不懂。

代码:
● g map cairo2png.pl
@bg=map /=>\s*background\s+(.*)/,@line;
print "\n===> find background lines\n"; print map "$_\n",@bg;
@bg=map {split /\s+/} @bg;              # 拆分多文件的行
@bg=map {-d $_?glob "$_/*.png":$_} @bg; # 扩展目录成可用图片文件
                        @append=map /^(.{1,60})/s,@append;


解释
代码:
@bg=map /=>\s*background\s+(.*)/,@line;

@line是一个文本文件的输入。用map带正则,判断是不是特定的行,此map居然返回了模式匹配的$1。这样,一句话,就取得了设置背景的配置文件的全部结果。反正,这用法,我没搜索到。我瞎写的。

代码:
print map "$_\n",@bg;

这个简单,某书里面看到有,打印列表,带上换行。反正怎么组合都成。

代码:
@bg=map {split /\s+/} @bg;

@bg是上面的背景文件的列表,其中,有些行,是空格分割的多文件作为的一行。这句,以空白拆分此类行,做成每个文件一行的结果。赋值给@bg多好,省得了使用其他的列表名字。

代码:
@bg=map {-d $_?glob "$_/*.png":$_} @bg;

这句,就是昨天搞定的行。@bg已经是每行一个文件了。判断如果是目录,就扩展此目录下的png文件。以前是写成 @bg1=map {-d && glob "$_/*.png"} @bg;。反正不能返回不是目录的行(返回空白行)。搞得只好后面再合并@bg1 @bg,再处理。多了3行语句。

代码:
@append=map /^(.{1,60})/s,@append;

这是文本列表,每行取60个字符,同时去掉空行。这写法,对中文截断是不好的。谁给个好的方法。

附带说下grep。额,带了注释的。如果懂了一半的map。下面的应该不需要说了。符合条件的才返回嘛。
代码:
● g grep cairo2png.pl
@line=grep !m"^//",@line;               # 去掉注释的行
@bg=grep {-f && /\.png$/} @bg;          # 选择有效的png文件
@line=grep !/background/,@line;         # 去掉背景设置的行
                        {@append=grep !/^\s*$/,`cat $s`;


忍不住,再贴一个让我认识到map好处的,第一个瞎写的map。有moc的,跑一下就知道了。
代码:
@info=`mocp -i`;
%hinfo=map{split /: /} @info;
print $hinfo{Title};


发现Perl的瞎写,很好。随心所欲。御风而行的哲学?
:em02
昨天,还发现,痛了几天的上火牙齿,用人工牛黄甲硝唑胶囊和复方牙痛酊,居然搞定了。
:em05

代码:
g grep bin/cairo-weather.pl
8:open RC,"<$rc"; @rc=grep ! /^\s*#/ && ! /^\s*$/,<RC>; close RC;
47:@alllunar=grep {! /\d{4}/ || /2011/} `/usr/bin/calendar -A $max`;
86:@lunar=grep /$m月.*$d \t/,@alllunar;


_________________
● 鸣学


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 10:24 
头像

注册: 2008-11-21 20:26
帖子: 36913
送出感谢: 1
接收感谢: 36
瞻仰,学习,拜神 :em70


_________________
讨厌我的人可以试着点一下
浏览全部ubuntu技巧


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 10:26 

注册: 2007-08-02 20:29
帖子: 21303
系统: 窓辺とうこ
送出感谢: 0 次
接收感谢: 22
:em70


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 10:42 
头像

注册: 2008-03-23 0:39
帖子: 770
送出感谢: 0 次
接收感谢: 4
:em70


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 11:04 
头像

注册: 2007-05-08 16:26
帖子: 2058
地址: 火星内核某分子内某原子核内
系统: arch
送出感谢: 20
接收感谢: 6
牙痛简单,坚持每天认真刷牙就行,含氟的确实效果要好.


_________________
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 11:44 
头像

注册: 2009-02-07 18:01
帖子: 200
送出感谢: 0 次
接收感谢: 0 次
:em70


页首
 用户资料  
 
7 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 13:01 
头像

注册: 2008-03-28 20:52
帖子: 1470
系统: QNX
送出感谢: 12
接收感谢: 2
御风而行的神Y(^_^


_________________
missing is i missing you...


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 14:29 
头像

注册: 2005-12-28 1:16
帖子: 3916
地址: 火星
系统: Ubuntu 12.10 X64
送出感谢: 1
接收感谢: 0 次
跟python的map差不多,
可以将一个lambda或者函数作用于可迭代的对象序列中。
通常,脚本语言除了map,还应该有reduce,filter, zip等作用于可迭代序列的操作。


_________________
目前负债150多万


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 14:56 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
希望py的,写下点东西,对比下。 :D
map已经通吃了。


_________________
● 鸣学


页首
 用户资料  
 
10 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 20:06 
头像

注册: 2007-03-01 20:46
帖子: 2393
地址: 湖南长沙
送出感谢: 0 次
接收感谢: 0 次
如果用py来写神的那段就会稍微长一点:

代码:
import re
import os
from glob import glob

regex_bg = re.compile("=>\s*background\s+(.*)")
bg = [regex_bg.match(l).group() for l in line]
print "===> find background lines %s" % (join("\n", bg),)
bg = map(lambda x : re.split("\s+", x), bg)
bg = [n for x in bg for n in x]
bg = map(lambda x : x if not os.path.isdir(x) else glob(x + "/*.png"), bg)


随手写的,没有测试数据可以用~
总的来说,python和perl的差别在于正则表达式、文件操作、内建函数以及lambda表达方式,python的closure和高阶函数有点麻烦了


最后由 anticlockwise 编辑于 2010-02-19 20:15,总共编辑了 1 次

页首
 用户资料  
 
11 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 20:11 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
match(l)。。如果是没perl那种内部变量。倒是肯定长点点点点。弯弯怎么变长沙的了。?


_________________
● 鸣学


页首
 用户资料  
 
12 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 20:16 
头像

注册: 2007-03-01 20:46
帖子: 2393
地址: 湖南长沙
送出感谢: 0 次
接收感谢: 0 次
eexpress 写道:
match(l)。。如果是没perl那种内部变量。倒是肯定长点点点点。弯弯怎么变长沙的了。?


我什么不是长沙人…………
我本来就是湖南长沙人啊~~

生在湖南,高中是广益的~~


最后由 anticlockwise 编辑于 2010-02-19 20:21,总共编辑了 1 次

页首
 用户资料  
 
13 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 20:17 
头像

注册: 2009-08-10 14:34
帖子: 261
送出感谢: 0 次
接收感谢: 0 次
:em70


_________________
如果我们过于爽快地承认失败,就可能使自己发觉不了我们非常接近于正确。——卡尔·波普尔


页首
 用户资料  
 
14 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-02-19 21:41 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 274
发现今天又用了2个。

@append=map {/^(.{1,80})/;$1=~/(^.*[ .,。,\n])/;chomp $1;$1."...\n"} @append;
截断文本,取到不乱码,加...

map {s/href=.*?\.html/\L$&\E/g;} @l;
html里面的部分,改小写。


_________________
● 鸣学


页首
 用户资料  
 
15 楼 
 文章标题 : Re: 御风而行的Perl - map心得篇
帖子发表于 : 2010-03-20 16:16 
头像

注册: 2009-06-12 14:57
帖子: 13
送出感谢: 0 次
接收感谢: 0 次
:em70


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 17 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译