Chinaunix

标题: 为什么多输出一行? [打印本页]

作者: pony2001mx    时间: 2014-09-12 16:18
标题: 为什么多输出一行?
本帖最后由 pony2001mx 于 2014-09-12 16:20 编辑

大家好:请教一个简单,但对我很不解的问题。我的脚本为什么输出三行,为什么不是两行?谢谢!!

文件file
  1. first


  2. second
复制代码
perl脚本
  1. #!/usr/bin/perl
  2. open F, 'file';
  3. %list = map {
  4.         /\S+/;
  5.         chomp;
  6.         $_, 1
  7. } <F> ;
  8. close F;

  9. for $i (keys %list){
  10.         print $i, "end\n";
  11. }
复制代码
输出结果是
  1. end
  2. firstend
  3. secondend
复制代码

作者: jason680    时间: 2014-09-12 16:26
回复 1# pony2001mx

字符串 也 是字符串
   
作者: q1208c    时间: 2014-09-12 16:26
/\S+/ 是匹配没有空白就可以吧?

那 "" 算不算 ?
作者: yestreenstars    时间: 2014-09-13 14:14
你脚本的第4行是没有任何意义的
作者: pony2001mx    时间: 2014-09-13 18:26
谢谢大家的回复,我终于明白空字符串也匹配\S+,所以脚本的第4行没有任何意义。但我还有一个问题,我把脚本改成以下内容,为什么还不行?谢谢!
  1. #!/usr/bin/perl
  2. open F, 'file';
  3. %list = map {
  4.         chomp;
  5.         $_ ne '';
  6.         $_, 1
  7. } <F> ;
  8. close F;

  9. for $i (keys %list){
  10.         print $i, "end\n";
  11. }
复制代码

作者: substr函数    时间: 2014-09-13 21:43
亲,
你脚本的第5行是没有任何意义的!

作者: pony2001mx    时间: 2014-09-13 22:21
第五行的目的是不输出空字符串,为什么还不行? 请教请教!
作者: felix0608    时间: 2014-09-14 16:47
  1. #!/usr/bin/perl

  2. open F, $ARGV[0];
  3. %list = map{chomp;/^\S+$/? ($_,1) : ()}<F> ;
  4. close F;
  5. for $i (keys %list){        
  6.         print $i, "end\n";
  7. }
复制代码
回复 7# pony2001mx


   
作者: yeahnoob    时间: 2014-09-14 17:42
本帖最后由 yeahnoob 于 2014-09-14 17:43 编辑

这个地方没必要用map吧??
完成LZ那个功能,下面这小段就可以,
  1. #!/usr/bin/env perl
  2. use Modern::Perl;
  3. use warnings;
  4. use autodie;

  5. open my $file, "<", $ARGV[0];
  6. for(<$file>) {
  7.     chomp;
  8.     say "$_ end" if /\w+/;
  9. }
复制代码

作者: pony2001mx    时间: 2014-09-14 19:19
谢谢felix0608,  yeahnoob的回复!
作者: dav_    时间: 2014-09-20 11:58
LZ你的脚本中是用map, 最后一行不论如何都会将该行加入hash
#8 就是最后加了个 if





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2