【发布时间】:2012-05-29 08:42:36
【问题描述】:
我知道这是不正确的。我只是想知道 perl 是如何解析这个的。
所以,我在玩 perl,我想要的是 perl -ne 我输入的是 perl -ie 行为有点有趣,我想知道发生了什么。
$ echo 1 | perl -ie'next unless /g/i'
所以 perl Aborted (core dumped) 。阅读perl --help 我看到-i 需要扩展备份。
-i[extension] edit <> files in place (makes backup if extension supplied)
对于那些不知道-e 只是评估的人。所以我在想三件事中的一件可能会发生,要么它被解析为
-
perl -i -e'next unless /g/i'i 得到 undef,其余的作为参数传递给 e -
perl -ie 'next unless /g/i'i 得到参数 e,其余的像文件名一样挂起 -
perl -i"-e'next unless /g/i'"作为 i 的参数
当我跑步时
$ echo 1 | perl -i -e'next unless /g/i'
程序没有中止。这让我相信'next unless /g/i' 没有被解析为-e 的文字参数。毫无疑问,上面的内容会以这种方式解析,并且会产生不同的结果。
那是什么?好吧,再玩一点,我得到了
$ echo 1 | perl -ie'foo bar'
Unrecognized switch: -bar (-h will show valid options).
$ echo 1 | perl -ie'foo w w w'
... works fine guess it reads it as `perl -ie'foo' -w -w -w`
玩弄上面的,我试试这个...
$ echo 1 | perl -ie'foo e eval q[warn "bar"]'
bar at (eval 1) line 1.
现在我真的很困惑.. 那么 Perl 是如何解析这个的呢?最后,看起来你实际上可以从-i 中获得一个 Perl eval 命令。这有安全隐患吗?
$ perl -i'foo e eval "warn q[bar]" '
【问题讨论】:
-
看起来 Perl 正在吞噬
-i开关作为其参数之后的所有内容。 -
@JRFerguson 对我来说不是,看起来 perl 只是假设 -i 将所有字符占用到第一个空格,然后它似乎在其余部分运行自己的命令行解析形式输入。
-
确实是我要说的。
-
顺便说一句,没有安全隐患。
perl -e'...'不能做任何你不能用perl somefile.pl做的事情。 -
但是,能够将参数设置为
perl -i不应为您提供与将参数设置为perl -e或perl $file相同的能力。
标签: perl command-line-arguments