2016-04-05 3 views
0

Bunun için bir arama deyimi formüle edemedim, bu zaten sorulmuşsa özür dilerim. (Olası oldu.)GetOptions() dizeleri seçimini zorlamak için GetOptions()

Yeni bir Perl yardımcı programımın seçenekleri arasında yazdığım bir --sortby seçeneği var.

  • --sortby TID
  • SID
  • --sortby

Şimdi gerçekten GetOptions diyoruz sonra bana bu uygulamaya çok kolay var: Ben kullanıcıyı veriyorum kullanılabilir seçeneklerdir Sadece ($ opt_sortby eq "SID" || $ opt_sortby eq "SID") olup olmadığını kontrol ederek. (Aslında bu biraz daha zarif kodlu ettik ama bu başka bir sorun.) Ama

GetOptions('sortby=s' => {"SID" | "TID"}); 

gibi, ben getOptions yürürlüğe konulacak bu seçimi zorlayabilir eğer bilgimi itmek ve görmek için bir şey çalışıyorum Lütfen, zorunlu olarak "bunlardan biri" seçimini temsil etmek için dokümantasyonda yaygın olarak kullanılan notasyon kullandığımı unutmayın. GetOptions'daki bu sözdizimini gerçekten beklemiyorum.

Fikirler kimse?

Teşekkürler mucho. Jacob S.

+1

ama don Verdiğin basit örnek için neden bir şeyleri karmaşıklaştırdığını görüyorum. Calling, $ opt_sortby eq 'SID' || $ opt_sortby eq 'TID'; '' GetOptions' sonrası mükemmel bir şekilde. – ThisSuitIsBlackNot

cevap

1

GetOptions döndükten sonra kontrol edilmesi oldukça basit - (Szépen köszönöm, durumunda G.S. :-)

cevaplar.

my %valid_sort_by = map { $_ => 1 } qw(SID TID); 

GetOptions('sortby=s' => \$opt_sort_by) 
    or usage(); 

if (defined($valid_sort_by)) { 
    $valid_sort_by{$opt_sort_by} 
     or usage("Invalid value for --sortby\n"); 
} 

Daha karmaşık bir yöntemdir, ancak bir geri arama kullanarak istediğiniz şeyi gerçekleştirebilirsiniz.

my %valid_sort_by = map { $_ => 1 } qw(SID TID); 

GetOptions(
    'sortby=s' => sub { 
     my ($opt_name, $opt_value) = @_; 
     $valid_sort_by{$opt_value} 
     or die("Invalid value for --$opt_name\n"); 
     $opt_sort_by = $opt_value; 
    }, 
) 
    or usage(); 

sonuncunun avantajı, Alternatif

command --sortby=bad --sortby=SID 
+0

Ikegami, Geçerli çözümlere sahip olan hash ile ilk çözümünüz SO SOĞUTMA! Bunu kullanmıştım: my @choices = qw (SID TID USER); GetOptions (...) "Yanlış sıralama seçimi" ("inlist ($ opt_sortby, \ @choices); # inlist() kitaplık işlevidir. –

1

hatayı tespit edecektir Eğer Getopt::Declare kullanabilirsiniz olmasıdır. Sonra

use strict; 
use warnings; 

use Getopt::Declare; 

my $args = Getopt::Declare->new(
    join("\n", 
     "--sort-by <s:/SID|TID/>\t field to sort by, valid options are TID, SID [required]" 
    ) 
) or exit(1); 

ve komut satırından kullanmak: Bu değerlerin sayımı için desteği vardır

$ perl test.pl --sort-by TID 
$ perl test.pl --sort-by SID 
$ perl test.pl --sort-by FID 
Error: incorrect specification of '--sort-by' parameter 
Error: required parameter --sort-by not found. 

(try 'test.pl -help' for more information) 

Getopt :: Declare sahip dahili bir --help seçenek olarak şartname göstereceğine iyi:

$ perl test.pl --help 

Usage: test.pl [options] --sort-by <s> 
     test.pl -help 
     test.pl -version 

Options: 
--sort-by <s>   field to sort by, valid options are TID, SID 
bir [özel Değişmeze] ile seçenekleri (https://metacpan.org/pod/Getopt::Long#User-defined-subroutines-to-handle-options) işleyebilir
+0

Hunter, bana iki hizmet yaptınız: –

+0

Bana iki hizmet yaptınız: Beni Getopt'a tanıttığım: GetOptions çağrısından sonra $ opt_sortby'yi kontrol etmek için mevcut yöntemimle uğraşmam için beni bilgilendirin ve inandırın. "Kullanımı son derece kolay olacak şekilde tasarlandı" Ancak daha karmaşık durumlar için akılda tutulması gereken bir şeydir; İhtiyacın ne zaman olacağını asla bilemezsiniz. Sağol Hunter! –