Ruby 想到一段很好玩的代码. 很短... 小小测验一下!

zw963 · 2012年05月15日 · 最后由 zw963 回复于 2012年05月18日 · 3424 次阅读

假设有个文本文件:1.txt , 其内容如下:

111111
222222
333333
444444
555555

在 shell 下运行以下命令:

ruby -pe 'gets' 1.txt

不要看其他人回复,不要自己搞测试,写出的你的答案。我反正是刚开始没搞明白,琢磨半天才明白过来。

啥都没有发生?

哦,明白了,开始的时候把每一行都当成是 gets 的输入了

111111 333333 555555 ?

#1 楼 @vkill 我做了测试,输出了偶数行,没搞明白啥意思,求赐教啊

#3 楼 @hooopo 我跟你相反,是 2222 4444 诶。

-p参数是亮点

#5 楼 @pepsin 最后还输出了一行 nil

-n assume 'while gets(); ... end' loop around your script -p assume loop like -n but print line also like sed

#7 楼 @chinacheng

很细心啊~ 不过 print nil 是不显示任何字符的。

#9 楼 @zw963 -p 读了一次 gets,-e 又读了一次,所以输出的时候会隔行?

匿名 #11 2012年05月16日

#10 楼 @cantin 应该是-p 读了一行文件,然后-e 执行,所以输出的偶数行,最后读完了,偶数行是 nil 了

#11 楼 @jjym 我也是这个意思

#3 楼 @hooopo #4 楼 @chinacheng
#11 楼 @jjym #12 楼 @cantin

公布标准答案,以上代码等价于:

while gets    # =>  第一次读
  gets          # =>  第二次读
  print $_      # => 输出第二次读取的结果. 外围循环以及这个print就是-p干的事情.
end 

#14 楼 @hooopo

汗~ 可惜你公布的是错误的答案,我觉得你一定是被我这段代码给误导了. 具体问题你自己找。给你个提示: 找 Ruby 的男人,问他有关-p 的事情

#15 楼 @zw963 @hooopo 说得没问题吧,你没仔细看他的解释!

#13 楼 @zw963 你这个解释是不完全正确的,不需要显示的指定 (print) $_

参看 https://github.com/ruby/ruby/blob/trunk/io.c#L6525

#17 楼 @googya

我的解释没有问题你的。没有 print 怎么输出偶数行的内容啊?

你再想想吧,我真的觉得可能是我的代码把你们搞晕了...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号