【问题标题】:Why does this Perl program not work as advertised为什么这个 Perl 程序不能像宣传的那样工作
【发布时间】:2014-09-09 06:23:50
【问题描述】:

我必须包含一个命令行开关 (-r) 来对通过命令行上的 @ARGV 数组输入的字符串列表进行反向排序。我正在尝试找到一个阅读有关命令行开关的好地方。我在网上找不到任何可以清楚地解释这些主题的好资源。

问题 1: 有没有人知道任何可以清楚解释这个主题的优秀在线资源?

我在网上找到了这个例子,但我无法让它工作。它将在命令行运行,并输出 'hello, world' 但如果我输入$perl -g filename.pl,它将输出:无法识别的开关:-g(-h 将显示有效选项)。

问题 2 为什么这不起作用?它不应该用-g说'再见世界'吗?

  #! /usr/local/bin/perl -s
  use strict;
  my( $switch, $thing );
  $switch = shift;
  if( $switch and $switch eq "-g" ) {
      $thing = shift || 'world';
  } else {
      $thing = $switch || shift || 'world';
      $switch = undef if $switch;
  }
  print $switch ? 'Goodbye' : 'Hello', ", $thing\n";

【问题讨论】:

  • 此代码是来自 perlmonks.org 的命令行开关示例:perlmonks.org/?node_id=88222
  • 切换不应转到解释器,而应转到脚本:'perl filename.pl -g'
  • 我在命令行中将其键入为 $perl filename.pl -g,这次我得到的是“你好,世界”而不是“再见,世界”,我认为应该是这样。没有 'unrecognized switch:g 不过!
  • 您的输入“perl -g filename.pl”是错误的。 "perl filename.pl -g" 会起作用。
  • @Fumu7:你试过了吗?它没有。

标签: perl


【解决方案1】:

使用严格的干得好;你也应该use warnings;

Perl 的语法是:

   perl [ -sTtuUWX ]      [ -hv ] [ -V[:configvar] ]
        [ -cw ] [ -d[t][:debugger] ] [ -D[number/list] ]
        [ -pna ] [ -Fpattern ] [ -l[octal] ] [ -0[octal/hexadecimal] ]
        [ -Idir ] [ -m[-]module ] [ -M[-]'module...' ] [ -f ]
        [ -C [number/list] ]      [ -S ]      [ -x[dir] ]
        [ -i[extension] ]
        [ [-e|-E] 'command' ] [ -- ] [ programfile ] [ argument ]

程序文件(或可选的 --)之前的任何内容都是命令行开关,它告诉 perl 解释器做一些特殊的事情;用于您的 perl 程序 的开关需要放在程序文件名之后,因此:perl filename.pl -g,而不是 perl -g filename.pl

在你的shebang线上,你有-s;不要使用这个开关。它是那些没有经受住时间考验并且不能很好地与现代 perl 配合使用的特性之一。在这种情况下,它甚至在您的代码开始之前就对您隐藏了 -g 参数;删除它,您应该会看到预期的结果。

虽然从不有任何充分的理由使用-s,但您也不应该手动解析参数:使用Getopt::Long

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-03-05
    • 1970-01-01
    相关资源
    最近更新 更多