Как я могу использовать аргументы типа переключателя для подпрограмм в Perl - PullRequest
1 голос
/ 23 марта 2012

Я хочу вызывать подпрограммы в Perl как:

sub temp {
  ---- some code -----
}
temp(-switchName, value1, --switchName2, value2)

Как я знаю, Getopt :: Long существует для аргументов типа переключателей командной строки.Поэтому я хочу знать для аргументов типа подпрограммы.

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Есть ряд причин, по которым кто-то может захотеть это сделать, но вы не сказали, поэтому мне придется предположить некоторые из них.

Переключения в командной строке полезны, потому что программы командной строкиперепутайте варианты со списком аргументов и нуждайтесь в некотором способе узнать разницу.Таким образом, соглашение «вещи, которые начинаются с - не обычные аргументы».

command --key value --key2 value2 file1 file2 file3
command file1 --key value file2 --key2 value2 file3

Вы, безусловно, можете сделать что-то подобное с подпрограммой, где она просматривает список аргументов, ища вещи, которые начинаются с * 1006.* и подразумевает, что следующим в списке является ассоциированное значение ... но у подпрограмм есть лучшие и более простые способы сделать это.

temp( ["file1", "file2", "file3"], { something => 1 } );

В этом случае основной список аргументов передается первым как массивссылка, и опции передаются в секунду в ссылке на хеш.В этом нет никакой двусмысленности.

sub temp {
    my($files, $options) = @_;

    print "Something!\n" if $options->{something};

    for my $file (@$files) {
        ...do something with $file...
    }
}

Вы можете даже сделать этот шаг еще дальше и передать все как опцию.

temp( files => ["file1", "file2", "file3"], something => 1 );

sub temp {
    my %args = @_;

    print "Something!\n" if $args{something};

    for my $file (@{$args{files}}) {
        ...do something with $file...
    }
}

Это полезно, если не очень ясно, что является вариантом, а чтоАргумент.Возможно, излишний пример «списка файлов с опциями» здесь.

2 голосов
/ 23 марта 2012

Если я правильно понимаю, вы можете передать свои аргументы в хеш и использовать их для доступа к ним. Вот так:

sub temp {
  my %opts = @_;

  if ($opts{'-switch1'}) {
    # ... do something ...
  }

  ...
}

temp(-switch1 => 1);
# or
temp(-switch1, 1);
...