質問

問題は私nコマンドライン引数になります。が必ず少なくとも2日しかし当該最大数は無制限.最初の引数が指定モードの操作になるようなファイルにプラグインの実行部になります。第3回通のn番目のものはなのファイル(可能性のある無して、ユーザーがしみやすく心のこもったクリーンにファイルで行われただけの場合で2引数).

私の方法でご利用いてPerlのために働くと配列がお使いいただくことによって、"Perlish"の繰り返し処理から3項は、配列です。

一部のオプションなどの見:

  • ポップからは、配列の終わりまでを見たい要素が始まらない"-"(ファイルパスで始まらない"-"はいえ、な問題があります)。
  • シフトの配列を削除し、最初は、つの要素からなる。なんとかできることに対し繰り返し操作を行う場合、そのサイズは少なくとも1.

私のように二つ目のオプションがわからない場合はPerlish.やって来た私を学習しようとしているPerl、いってみるべきではないだろうかを学ぶとの付き合い方"について考えるいいものPerlです。

役に立ちましたか?

解決

別にシナンが書いたようにGetoptモジュールを使用してから、私はおそらくとなるだろう。

my ( $operation, $file, @things ) = @ARGV;

そして、あなたことができます:

for my $thing_to_do ( @things ) {
...
}

他のヒント

IMHO、あなたはのいずれかを使用することです必要なものを達成するためのPerl的な方法CPAN の上のgetoptモジュールます。

:あなたはまだ手でそれをしたい場合は、

、私は2番目のオプション(これは、我々はメソッド呼び出しの最初の引数を処理する方法に似ている)のために行くだろう

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

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

if ( @ARGV ) {
    # handle the other arguments;
}

の使用をお勧めし Getopt::長 解析にはコマンドライン引数になります。この標準モジュールを動作させることができね、どうなります。

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) {
    ...
}

ことができます長い名前のオプション、自動的に充填の情報変数を用い、できるとしていたことが分かりました。でもきに追加のコマンドの後で、どうしていくべきなのかについて追加する構文解析の議論などを追加する'バージョン'または'help'オプション:

# 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 } );

それを呼び出すことができ、コマンドラインを使用 -, --, 最初の文字の全体オプション GetOptions の数値です。このプログラムを強化する図ってで"guessable"されています。のはいいの変更コードプロセス @ARGV, ので、 GetOptions かを設定します。

Perlで物事の最も標準的な方法は、CPAN経由でます。

だから私の最初の選択肢は、 Getoptのだろう::ロングに。 DevShedのチュートリアルもあります:処理Perlのを持つコマンドラインオプション

ご利用でき スライス 抽出の第2弾が登場します。●への最後の項目には、例えば:

[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:~]$ 

ただし、その利用 shift (もっと良い GetOpt::Long)

deepesz答えは行くには一つの良い方法です。

あなたの目のオプションは何も問題もありません。

my $op     = shift; # implicit shift from @ARGV
my $file   = shift; 
my @things = @ARGV;

# iterate over @things;

また@ARGVにコピー@thingsをスキップして、その上で直接動作することができます。スクリプトは、非常に短い非常に単純な、そして時間をかけてより複雑に成長しそうでなければ、しかし、私はあまりにも多くの近道を取って避けるだろう。

あなたはdeepesz」アプローチを選択するか、この1つは、主に好みの問題であるかどうか。

優れているかを決めることは、本当に哲学の問題です。問題の核心は、あなたが@ARGVのようなグローバルを修正する必要があるかどうかです。いくつかは、それは限り、それは非常に目に見える形で行われているように大したことではないと言うだろう。その他はそのまま残し@ARGVの賛成で主張するだろう。

により、速度やメモリの問題への1つのオプションまたは他の賛成で主張誰に何の注意を払っていません。 @ARGVアレイは、非常に小さなサイズのため、有意な最適化にほとんどのシェルによって制限されている他の上で1つの方法を使用して使用可能です。

::ロングには、言及されたとしても、優れた選択肢でありますます。

それはあなたを研ぐことがあるので、

は、 MooseX :: Getoptののを見てくださいさらに、物事 Moosey!の食欲ます。

MooseX :: Getoptの例:

# getopt.pl

{
    package MyOptions;
    use Moose;
    with 'MooseX::Getopt';

    has oper   => ( is => 'rw', isa => 'Int', documentation => 'op doc stuff' );
    has file   => ( is => 'rw', isa => 'Str', documentation => 'about file' );
    has things => ( is => 'rw', isa => 'ArrayRef', default => sub {[]} );

    no Moose;
}

my $app = MyOptions->new_with_options;

for my $thing (@{ $app->things }) {
    print $app->file, " : ", $thing, "\n";
}

# => file.txt : item1
# => file.txt : item2
# => file.txt : item3

そのように実行時には、上記を演出します。

  

のPerl getopt.pl --oper 1 --file file.txtを--things ITEM1 --things ITEM2 --things ITEM3


これらのムースタイプがチェックされます... ./getopt --oper "not a number"が生成します:

Value "not a number" invalid for option oper (number expected)

と自由のために、あなたは常に、使用のリストを取得; - )

usage: getopt.pl [long options...]
         --file         bit about file
         --oper         op doc stuff
         --things    

/ I3az /

任意の配列を有するより一般的なケースの場合:

for(my $i=2; $i<@array; $i++) {
    print "$array[$i]\n";
}

第三の要素(インデックス2)から出発し、配列をループします。もちろん、あなたはspecifiy具体的な例としては、depeszの答えが最も簡単で最高です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top