如何在Perl中使用带有空文件句柄(<>)的getopt?

时间:2013-08-14 19:12:01

标签: perl getopt

我有一个脚本可以使用while(<>)循环执行一些基本的awk过滤。我希望脚本能够显示用法和版本,但是假设所有参数都是文件。如何将getopt与&lt;&gt;结合使用运营商?

3 个答案:

答案 0 :(得分:7)

Getopt与@ARGV很好地配合。实施例

use strict; use warnings;
use feature 'say';
use Getopt::Long;

GetOptions 'foo=s' => \my $foo;

say "foo=$foo";
say "ARGV:";
say for @ARGV;

然后:

$ perl test.pl --foo fooval --bar
Unknown option: bar
foo=fooval
ARGV:
$ perl test.pl --foo fooval bar
foo=fooval
ARGV:
bar
$ perl test.pl --foo fooval -- --bar
foo=fooval
ARGV:
--bar

要点:

  • 切换后的@ARGV中的任何项目都会留在那里。
  • 这对正常文件名(不以连字符开头)起到预期的作用。
  • 您始终可以使用--来中止解析。

答案 1 :(得分:4)

这对我有用。

use warnings;
use strict;
use Getopt::Long qw(GetOptions);

my %opt;
GetOptions(\%opt, qw(help)) or die;

die 'usage' if $opt{help};

while (<>) {
    print;
}

答案 2 :(得分:3)

正如其他人所说,Getopt::Long是首选模块。自Perl 3.x以来它一直存在。

有很多选项,并且可能需要一段时间才能使用语法,但它完全符合您的要求:

use strict;
use warnings;
use Getopt::Long;
use feature qw(say);
use Pod::Usage;

my ( $version, $help );   #Strict, we have to predeclare these:

GetOptions(
   'help'    => \$help,
   'version' => \$version,
) or pod2usage ( -message => "Invalid options" );

这就是它的全部。当Getoptions子例程运行时,它将解析您的命令行(@ARGV数组),以查找以---开头的任何内容。它将处理这些,当它涉及双击本身,或者不是以破折号开头的选项时,它将假设这些是文件并且它已经完成处理。此时,所有选项字符串(及其参数)都已从<{1}}数组移位,并且您将保留文件:

@ARGSV

if ( $help ) { pod2usage; } if ( $version ) { say "Version 1.23.3"; exit; } while ( my $file = <>) { ... } 是标准Perl安装的一部分,因此它始终可供您使用。

我知道很多人都对使用这些模块持谨慎态度,因为他们认为它们不是标准Perl ,但它们与Perl一样,都是Getopts::Long和{{}}之类的命令。 {1}}。 Perl有超过500个,它们是你的。