【问题标题】:Perl, set variable to entire command line 'string' rather than argumentsPerl,将变量设置为整个命令行“字符串”而不是参数
【发布时间】:2012-11-29 07:45:26
【问题描述】:

我需要允许用户在运行我的 perl 脚本时输入任何内容,因为我的脚本正在以不同的增量将所有数据发送到另一个非自定义脚本。

理论上,我希望这会发生:

perlscript "this is" -t stuff\n4^./q%

然后,在 perlscript 中,有:

print "Full: $full_command";

导致:

Full: "this is" -t stuff\n4^./q%

这有意义吗?我尝试过的任何事情都没有完全符合我正在寻找的 argv 或类似的东西。

感谢您的帮助, 蒂姆

【问题讨论】:

  • Shell 解析命令行,然后运行解析后的 perl 脚本。无法从 perl 脚本中获知原始命令行。

标签: perl command-line-arguments argv


【解决方案1】:

不幸的是,您的 shell 可能会在参数到达 Perl 脚本之前对其进行操作。在您的具体示例中,像 bash 这样的 shell 将删除引号,将\n 视为n,并在到达& 时停止处理该行。在 Unixy 系统中,最好的办法可能是将所有参数用单引号括起来

perlscript '"this is" -t stuff\n4&^./q%'

【讨论】:

    【解决方案2】:

    假设您为您的操作系统正确引用,如上所述,也许以下内容对您有用:

    print join(" ", map { / / ? "\"$_\"" : $_ } @ARGV);
    

    请注意,当您运行 perl 时,您需要使用“--”标记将用于 perl 本身的参数与用于您的程序的参数分开。例如:

    perl -- -t 'stuff...'
    

    这将防止参数被 perl 本身错误地使用。

    【讨论】:

    • 您的print 不会为给定示例生成请求的输出。而你答案的后半部分与问题无关。
    • 第二部分怎么不相关? OP 指定他希望用户“输入几乎任何内容”。他不需要阻止 perl 将用户输入解释为 perl 参数吗?
    • @schtever 指定脚本名称的参数将阻止 perl 将任何进一步的参数解释为 perl 解释器的选项。
    • @qqx 我明白了。当我写那个时,我正在考虑一个班轮,例如perl -e'join(...)' "$@".因此,我担心将用户输入混合到参数列表中。如您所说,如果脚本在其自己的文件中,则没关系。谢谢你的解释。
    【解决方案3】:

    shell 的作用相当于

    exec('perlscript', 'this is', '-t', 'stuff'.chr(0x0A).'4&^./q%');
    

    perl 无法从中生成原始的 shell 命令。如果你想让 Perl 接收

    "this is" -t stuff\n4^./q%
    

    你需要告诉 shell 使用类似的东西

    perlscript '"this is" -t stuff\n4^./q%'
    

    (嗯,至少对于 Borne 壳或衍生物而言。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2018-11-22
      • 2011-04-03
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多