Ruby语言的龌龊之处 - ARGV自动展开
前面关于Ruby/Rails语言的不爽系列有:
Ruby语言的龌龊之处 - “抢床”问题
Ruby 中文、Unicode处理上的问题一例
Rails默认规则 - 单复数的别扭之处
所谓“爱之深,恨之切”,最近又发现一个不爽的地方:ARGV的自动展开:
今天写了一个小程序,用来给文件批量重命名的,结果发现参数个数总是不对。
后来发现ruby会比较“智能”的把文件名称展开,比如我的那个文件叫做exren.rb,接受两个参数,我想把r开头的mp3文件统统改成以t开头的,这么用:
ruby exren.rb r*.mp3 t*.mp3
结果ARGV接受了许多个参数,都是展开的,比如“ruby砍人狂想曲.mp3”等等。
在Google上找了半天,有个哥们提到了这个问题:
John Kaurinwrote:
> ruby Test.rb -> []
> ruby Test.rb *.py -> ["*.py"]
> ruby Test.rb *.rb -> ["Test.rb", "a.rb", "b.rb", "c.rb"]
>
> The first two cases I expected, but for the third
> I expected ["*.rb"] rather than the expanded
> wildcard output.
This is correct because globbing is done by the shell not by Ruby. The
reason you get *.py on the second case is because you don’t have any
.py file so globbing is not done.
下面回答说这种展开(globbing)不是Ruby干的,是系统的Shell干的。
在Win32下面,这说法绝错!
看看这段:
argument中的字符串将变成内部常数ARGV的初始值。在有的环境中(Win32),标准shell不会展开通配符,这时Ruby解释器将自行展开通配符然后赋值给ARGV。此时,可使用的通配符有“*”、“?”、“[]”和“**/”(与Dir.glob不同,这里不能使用“{..}”)。在Win32环境中,若不想展开通配符的话,请使用单引号(’)将参数括起来。
这严重不符合一般Win32编程者的使用习惯! 估计,ruby想把自己在windows下做成脚本语言替代品才这么干的。
小聪明害死人! 现在如果我想要使用exren.rb来批量重命名,使用的时候都得这么用:
ruby exren.rb r’*’.mp3 t’*’.mp3
多么烂的设计!
有许多可以和其他常见的传参方式兼容的替换方案:
1. 如果你想要展开,ok,提供一个库,给个函数接受Dir.pwd把ARGV展开。
2. 在ruby.exe上面加个参数用来关闭这种ARGV展开也好啊。
标签: [tag]ruby[/tag]
共 3 条评论
发表评论
Additional comments powered by BackType



没试过,不知可否这样:
ruby exren.rb ‘r*.mp3′ ‘t*.mp3′
通常我发现传进来的参数不对的时候,就会这样试试。。。呵呵,如果可以的话告诉一声。
反倒觉得 Windows 的那个 cmd.exe 太龌龊了。
Windows那个cmd叫弱智。期待一睹powershell的风采,不过,现在暂时用着cygwin,有点别扭。
尤其是用vi的时候。