御风而行的Perl - map心得篇

软件和网站开发以及相关技术探讨
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

御风而行的Perl - map心得篇

#1

帖子 eexpress » 2010-02-19 10:20

昨天,突发奇想了一下,居然搞定了一个历史遗留的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;
● 鸣学
头像
tenzu
论坛版主
帖子: 36924
注册时间: 2008-11-21 20:26

Re: 御风而行的Perl - map心得篇

#2

帖子 tenzu » 2010-02-19 10:24

瞻仰,学习,拜神 :em70
JiangHui
论坛版主
帖子: 21308
注册时间: 2007-08-02 20:29
系统: 窓辺とうこ

Re: 御风而行的Perl - map心得篇

#3

帖子 JiangHui » 2010-02-19 10:26

:em70
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: 御风而行的Perl - map心得篇

#4

帖子 ChenFengyuan » 2010-02-19 10:42

:em70
头像
sevk
帖子: 2060
注册时间: 2007-05-08 16:26
系统: arch
来自: 火星内核某分子内某原子核内
联系:

Re: 御风而行的Perl - map心得篇

#5

帖子 sevk » 2010-02-19 11:04

牙痛简单,坚持每天认真刷牙就行,含氟的确实效果要好.
笔记本 :
F208S : gentoo
A460P i3G D6 : UBUNTU + WIN7
UN43D1 : UBUNTU + WIN7
1000人超级QQ群 LINUX + WIN : 31465544 或 18210387
头像
sweating
帖子: 200
注册时间: 2009-02-07 18:01

Re: 御风而行的Perl - map心得篇

#6

帖子 sweating » 2010-02-19 11:44

:em70
头像
missing
帖子: 1470
注册时间: 2008-03-28 20:52
系统: QNX

Re: 御风而行的Perl - map心得篇

#7

帖子 missing » 2010-02-19 13:01

御风而行的神Y(^_^
missing is i missing you...
头像
xhy
帖子: 3916
注册时间: 2005-12-28 1:16
系统: Ubuntu 12.10 X64
来自: 火星

Re: 御风而行的Perl - map心得篇

#8

帖子 xhy » 2010-02-19 14:29

跟python的map差不多,
可以将一个lambda或者函数作用于可迭代的对象序列中。
通常,脚本语言除了map,还应该有reduce,filter, zip等作用于可迭代序列的操作。
目前负债150多万
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 御风而行的Perl - map心得篇

#9

帖子 eexpress » 2010-02-19 14:56

希望py的,写下点东西,对比下。 :D
map已经通吃了。
● 鸣学
头像
anticlockwise
帖子: 2394
注册时间: 2007-03-01 20:46
来自: 湖南长沙

Re: 御风而行的Perl - map心得篇

#10

帖子 anticlockwise » 2010-02-19 20:06

如果用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 次。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 御风而行的Perl - map心得篇

#11

帖子 eexpress » 2010-02-19 20:11

match(l)。。如果是没perl那种内部变量。倒是肯定长点点点点。弯弯怎么变长沙的了。?
● 鸣学
头像
anticlockwise
帖子: 2394
注册时间: 2007-03-01 20:46
来自: 湖南长沙

Re: 御风而行的Perl - map心得篇

#12

帖子 anticlockwise » 2010-02-19 20:16

eexpress 写了:match(l)。。如果是没perl那种内部变量。倒是肯定长点点点点。弯弯怎么变长沙的了。?
我什么不是长沙人…………
我本来就是湖南长沙人啊~~

生在湖南,高中是广益的~~
上次由 anticlockwise 在 2010-02-19 20:21,总共编辑 1 次。
头像
Sucrose
帖子: 261
注册时间: 2009-08-10 14:34

Re: 御风而行的Perl - map心得篇

#13

帖子 Sucrose » 2010-02-19 20:17

:em70
如果我们过于爽快地承认失败,就可能使自己发觉不了我们非常接近于正确。——卡尔·波普尔
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 御风而行的Perl - map心得篇

#14

帖子 eexpress » 2010-02-19 21:41

发现今天又用了2个。

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

map {s/href=.*?\.html/\L$&\E/g;} @l;
html里面的部分,改小写。
● 鸣学
头像
Kaavield
帖子: 13
注册时间: 2009-06-12 14:57

Re: 御风而行的Perl - map心得篇

#15

帖子 Kaavield » 2010-03-20 16:16

:em70
回复