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