0

我有一个脚本,它执行一些基本的 awk,例如使用while(<>)循环进行过滤。我希望脚本能够显示用法和版本,否则假设所有参数都是文件。如何将 getopt 与 <> 运算符结合使用?

4

3 回答 3

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开关后的任何物品都简单地留在那里。
  • 这对于普通文件名(不以连字符减号开头)按预期工作。
  • 您始终可以使用 a--中止对开关的解析。
于 2013-08-14T19:33:01.203 回答
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;
}
于 2013-08-14T19:31:07.103 回答
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子例程运行时,它将解析您的命令行(数组)以查找以 a或@ARGV开头的任何内容。它将处理这些,当涉及到双破折号本身或不以破折号开头的选项时,它将假定这些是文件并且已完成处理。此时,所有选项字符串(及其参数)都已移出数组,剩下的文件是:---@ARGSV

if ( $help ) {
    pod2usage;
}
if ( $version ) {
    say "Version 1.23.3";
    exit;
}

while ( my $file = <>) {
    ...
}

Getopts::Long是标准 Perl 安装的一部分,因此您应该始终可以使用它。

我知道很多人对使用这些模块持谨慎态度,因为他们认为它们不是标准的 Perlprint ,但它们与and之类的命令一样是 Perl 的一部分chomp。Perl 附带了超过 500 个,它们供您使用。

于 2013-08-14T22:09:27.963 回答