免费注册 查看新帖 |

Chinaunix

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

[已解决][map][循环]一个莫明错误:Use of uninitialized value [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-03 13:16 |只看该作者 |倒序浏览
先说一下情况:
我的目的是下载两个包含很多下载链接的页面:patches.html、packages.html,用一个perl脚本get_list.pl提取页面中的下载链接,形成一个链接表lnks_uclibc.txt。
之后用wget下载:wget -N -i lnks_uclibc.txt。


相关代码如下:
1. 先是运行脚本:

  1. wget http://www.linuxfromscratch.org/hlfs/view/unstable/uclibc/chapter04/patches.html
  2. wget http://www.linuxfromscratch.org/hlfs/view/unstable/uclibc/chapter04/packages.html

  3. cat patches.html packages.html > uclibc.htm

  4. perl get_list.pl

  5. rm -v patches.html packages.html
复制代码


2. 以下是get_list.pl的代码,注释中是之前的版本。最后那个Solution 6是出现warn的版本:

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;


  4. open (FILE, "uclibc.htm") or die "the chapter of packages and patches ready?";
  5. open (FILE2, ">lnks_uclibc.txt") or die "the output file ready?";

  6. # Solution 5:
  7. # while (<FILE>) {
  8. #     if ($_ =~ /"((http|ftp):.*(bz2|gz|patch))".*(\n)/) {
  9. #         print FILE2 $1."\n";
  10. #     }
  11. # }


  12. # Solution 6:
  13. print FILE2 map { /"((http|ftp):.*(bz2|gz|patch))".*(\n)/; $1.$4 } <FILE>;

  14. close FILE;
  15. close FILE2;
复制代码


另外,如果不加

  1. use strict;
  2. use warnings;
复制代码

就不会有错误提示,但我觉得因为加上。

难道是说我$1和$4没有初始化?可是Solution 5不是没warn吗?郁闷中……

[ 本帖最后由 ehu4ever 于 2006-2-3 19:18 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2006-02-03 14:56 |只看该作者
print FILE2 map { /"((http|ftp):.*(bz2|gz|patch))".*(\n)/; $1.$4 } <FILE>;
>>
print FILE2 map { /"((http|ftp):.*(bz2|gz|patch))".*(\n)/ && $1.$4 } <FILE>;

论坛徽章:
0
3 [报告]
发表于 2006-02-03 17:44 |只看该作者

知道哪错了。循环和map是不同的

[code]
# Solution 5:
# while (<FILE>) {
#     if ($_ =~ /"((http|ftp):.*(bz2|gz|patch))".*(\n)/) {
#         print FILE2 $1."\n";
#     }
# }
[/code]
这里$_是if过滤之后的。



[code]
# Solution 6:
print FILE2 map { /"((http|ftp):.*(bz2|gz|patch))".*(\n)/; $1.$4 } <FILE>;
[/code]
而map里的各个语句对<FILE>每一项都有效,而<FILE>里不是每一项都被正则表达式匹配的,所以有时候$_是空的。



我修改后的版本是:
[code]
# Solution 6:
print FILE2 map { /"((http|ftp):.*(bz2|gz|patch))".*(\n)/; $1?$1.$4:"" } <FILE>;
[/code]


道理是和flw提供的版本是一样的,flw用的是&&,我用?。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP