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