为什么这个Perl程序不像宣传的那样工作

时间:2014-09-09 06:23:51

标签: perl

我必须包含一个命令行开关(-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";

1 个答案:

答案 0 :(得分:5)

使用严格的好工作;你还应该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