什么是从项目n迭代到数组末尾的Perlish方法?

Tho*_*ens 6 arrays perl command-line-arguments

问题是我有n个命令行参数.总有至少2个,但最大数量是无限的.第一个参数指定操作模式,第二个参数是要处理的文件.第3到第n个是要对文件做的事情(可能没有,因为用户可能只想清理文件,如果你只传递2个参数就可以完成).

我正在研究Perl中可用于处理数组的方法,但我不确定从项目3到数组末尾迭代的"Perlish"方法是什么.

我见过的一些选项:

  • 从数组的末尾弹出,直到我找到一个不以" - "开头的元素(因为文件路径不以" - "开头,虽然我认为它可以,这可能会导致问题).
  • 移动数组两次以删除前两个元素.无论我留下什么,我可以迭代,如果它的大小至少为1.

我喜欢第二个选项,但我不知道它是否是Perlish.因为我正在努力学习Perl,所以我不妨学习在Perl中做事的正确方法.

小智 17

除了像Sinan写的那样使用Getopt模块,我可能会选择:

my ( $operation, $file, @things ) = @ARGV;
Run Code Online (Sandbox Code Playgroud)

然后你可以:

for my $thing_to_do ( @things ) {
...
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这在技术上是一个解决方案,但Getopt :: Long是一个标准的perl模块,它提供了一种处理命令行参数的快速,干净和健壮的方法.我非常强烈,强烈建议看一下(我的例子,下面.) (6认同)
  • 好的,如果这就是你想要的.但是对于其他任何人来说,当谈到像Getopt :: Long这样的核心模块时,没有什么理由可以毫不犹豫地使用它们 - 模块重用就像你能得到的那样完美.多年来,核心模块已经过全面测试,优化和审核,并且可以使常见任务(如@ARGV解析)尽可能简单且无问题. (3认同)

Sin*_*nür 12

恕我直言,完成所需内容的Perlish方法是在CPAN上使用其中一个Getopt模块.

如果您仍想手动完成,我会选择第二个选项(这类似于我们处理方法调用的第一个参数):

die "Must provide filename and operation\n" unless @ARGV >= 2;

my $op = shift @ARGV;
my $file = shift @ARGV;

if ( @ARGV ) {
    # handle the other arguments;
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*t P 9

强烈建议使用Getopt :: Long来解析命令行参数.它是一个标准模块,它工作得很棒,并且正是你想要轻而易举地做到的.

use strict;
use warnings;
use Getopt::Long;

my $first_option = undef;
my $second_option = undef;

GetOptions ('first-option=s' => \$first_option, 
            'second-option=s' => \$second_option);

die "Didn't pass in first-option, must be xxxyyyzzz."
    if ! defined $first_option;
die "Didn't pass in second-option, must be aaabbbccc."
    if ! defined $second_option;

foreach my $arg (@ARGV) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这使您可以拥有一个长选项名称,并自动将信息填入变量中,并允许您对其进行测试.它甚至可以让您以后添加额外的命令,而无需对参数进行任何额外的解析,例如添加"版本"或"帮助"选项:

# adding these to the above example...
my $VERSION = '1.000';
sub print_help { ... }

# ...and replacing the previous GetOptions with this...
GetOptions ('first-option=s' => \$first_option, 
            'second-option=s' => \$second_option)
            'version' => sub { print "Running version $VERSION"; exit 1 },
            'help' => sub { print_help(); exit 2 } );
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用-,--第一个字母或整个选项在命令行上调用它,并GetOptions为您计算所有内容.它使您的程序更健壮,更容易弄清楚; 你可以说更"可猜测".最好的部分是您永远不必更改处理的代码@ARGV,因为GetOptions它将为您处理所有设置.


小智 7

在Perl中最标准的做事方式是通过CPAN.

所以我的第一选择是Getopt :: Long.还有一个关于DevShed的教程:使用Perl处理命令行选项

  • Getopt :: Long一直是核心模块(尽管在任何给定时间CPAN上都可能有更新的版本). (5认同)

dsm*_*dsm 6

您可以使用切片来提取第二个切片.最后的项目,例如:

[dsm@localhost:~]$ perl -le 'print join ", ", @ARGV[2..$#ARGV];' 1 2 3 4 5 6 7 8 9 10 00
3, 4, 5, 6, 7, 8, 9, 10, 00
[dsm@localhost:~]$ 
Run Code Online (Sandbox Code Playgroud)

但是,您可能应该使用shift(甚至更好GetOpt::Long)