为什么这个Perl程序不能像广告中那样工作

为什么这个Perl程序不能像广告中那样工作,perl,Perl,我必须包含一个命令行开关(-r),以对通过命令行上的@ARGV数组输入的字符串列表进行反向排序。我想找一个好地方来阅读命令行开关。我在网上找不到任何能清楚解释这些话题的好资料 问题1:有人知道清楚解释这个主题的好的在线资源吗 我在网上找到了这个例子,但我无法让它发挥作用。它将在命令行上运行,并输出“hello,world” 但是如果我键入$perl-g filename.pl,它将输出:unrecogned switch:-g(-h将显示有效选项) 问题2为什么这不起作用?它不应该和-g说“再见

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

问题1:有人知道清楚解释这个主题的好的在线资源吗

我在网上找到了这个例子,但我无法让它发挥作用。它将在命令行上运行,并输出“hello,world” 但是如果我键入
$perl-g filename.pl
,它将输出:unrecogned switch:-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";

严格把好使用关;您还应该
使用警告

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
从来没有什么好的理由,但也不应该手工解析参数:use。

这段代码是来自perlmonks.org的命令行开关的一个示例:开关不应该转到解释器,而应该转到脚本:“perl filename.pl-g”我在命令行上键入$perl filename.pl-g,这一次我得到的是“你好,世界”,而不是我认为应该的“再见,世界”。没有“无法识别的开关:g!您的输入“perl-g filename.pl”是错误的。“perl filename.pl-g”可以用。@Fumu7:你试过了吗?没有。