免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: mouse.rice
打印 上一主题 下一主题

比较两段CODE,请您帮修改!谢谢~ [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-01-18 10:13 |只看该作者
原帖由 perljoker 于 2008-1-18 09:50 发表

Lonki代码确实漂亮……,不过
my %id_all = map { /(\d+)\s+(.*)\s*/ } ;
这句话我确实没看懂,map左边是hash,map里面是个正则
这样做会得到什么结果呢?还是竟然能得到$1和$2?

to LZ,我那个 ...

----------------------------------------------------
同样期待Lonki的解答!

论坛徽章:
0
22 [报告]
发表于 2008-01-18 10:32 |只看该作者

回复 #21 mouse.rice 的帖子


确实如此
map会自动返回后面正则表达式得到的$1和$2作为对值返回
他第二个表达式要容易看懂

论坛徽章:
0
23 [报告]
发表于 2008-01-18 10:48 |只看该作者
原帖由 perljoker 于 2008-1-18 10:32 发表

确实如此
map会自动返回后面正则表达式得到的$1和$2作为对值返回
他第二个表达式要容易看懂

-------------------------------------------
第一个map语句看不懂,我找不到依据!《大骆驼》中关于map一节也没有提及这种写法,依据何在?

论坛徽章:
0
24 [报告]
发表于 2008-01-18 11:09 |只看该作者
perljoker:我找到这种写法的依据了,详细请看仙子的”简简单单map":

(仙子注:上文是说遍历每个LIST元素时产生一个结果列表,而不是说总的map结果是个列表,不要搞混了哦。)
2. 转换数组到hash:找到某个数组值的索引

代替重复的搜索数组,我们可以用map来转换数组到hash,并通过hash关键字来进行直接查找。如下的map用法相对于重复的数组搜索,更简单高效。

@teams = qw(Miami Oregon Florida Tennessee Texas
            Oklahoma Nebraska LSU Colorado Maryland);
%rank = map { $teams[$_], $_ + 1 } 0 .. $#teams;
print "Colorado: $rank{Colorado}\n";
print "Texas: $rank{Texas} (hook 'em, Horns!)\n";

打印结果是:
Colorado: 9
Texas: 5 (hook 'em, Horns!)

上述code容易理解哦,0 ..$#teams 是个列表,$#teams代表@teams最后一个元素的下标值(这里是9),所以这个列表就是0-9这几个数了。map遍历上述列表,将每个列表元素临时设置为$_,并对$_在中间的{}里进行计算;{ $teams[$_], $_ + 1 },这里每次计算后返回一个2元素的列表,列表结果是某个数组值和对应的数组下标加1,明白了呀?

由于对每个LIST元素进行计算时,都产生一个2元素的列表,所以总的map结果就可看作一个hash了。hash关键字就是数组元素,hash值是对应的数组下标加1。

呵呵,学了一个终极招~正是我所需要的东东!

[ 本帖最后由 mouse.rice 于 2008-1-18 11:13 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2008-01-18 12:37 |只看该作者
考虑到hash典型的2种初始化:
my %hash = ('a' => 1, 'b' => 2)

my %hash = ('a', 1, 'b', 2)
效果一致

于是有了:
my %hash = map { $_, $_ } (0..9)

my %hash = map { $_ => $_ } (0..9)
效果一致

在map { /.../ }中有2组(), 即每次返回$1和$2.
就是这样了.

论坛徽章:
0
26 [报告]
发表于 2008-01-18 23:07 |只看该作者

简单办法


  1. perl -e "while(<>){print $ARGV if bof;print;}" file1 file2 ...
复制代码

原帖由 ly5066113 于 2008-1-18 10:11 发表

$ perl -ne 'print "$ARGV[0] $ARGV[1] $ARGV[2] $. $_"' file1 file2
file2   1 123
   2 456
$
file1的内容是123,file2的内容是456。好象不行呢。
而且如果要用ARGV来判断,我必须先知道文件名才行, ...

论坛徽章:
0
27 [报告]
发表于 2008-01-19 00:33 |只看该作者
原帖由 ly5066113 于 2008-1-18 09:54 发表
路过问一下,如果我用
perl -e '........' file1 file2 ....filen
的方式处理n个文件,我有什么办法能判断我现在处理的是哪个文件?

----------------------------------------------------------------------
file1内容为123
file2内容为456
perl -e "while(<>){print $ARGV if bof;print;}" file1 file2
Result:
123
123
456
456

这结果如何看出现在正处理哪个文件?
我也想知道如何解决,大家赐教!谢谢!

[ 本帖最后由 mouse.rice 于 2008-1-19 00:37 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-01-19 02:50 |只看该作者
没啥问题



  1. C:\>echo 123>f1

  2. C:\>echo 456>f2

  3. C:\>perl -e "while(<>){print $ARGV if bof;print;}" f1 f2
  4. f1123
  5. f2456
复制代码

论坛徽章:
0
29 [报告]
发表于 2008-01-19 08:57 |只看该作者
#echo 123 > f1
#echo 456 > f2
#perl -e "while(<>){print $ARGV if bof;print;}" f1 f2
123
123
456
456

上面是我在LINUX环境下的测试结果,楼上的兄弟,这...?

论坛徽章:
0
30 [报告]
发表于 2008-01-20 00:07 |只看该作者
原帖由 mouse.rice 于 2008-1-19 08:57 发表

上面是我在LINUX环境下的测试结果,楼上的兄弟,这...?


if you are using uni*

$ perl -e 'while(<>{print $ARGV if bof;print;}' f1 f2

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP