gabungkan perl GetoptLong dengan case ARGV tunggal khusus?

Saya menerjemahkan skrip shell ke skrip Perl yang menggunakan Getopt::Long, dan saya ingin menjaga kompatibilitas dengan kasus di bawah ini di mana, jika satu-satunya argumen pada skrip adalah satu file, file tersebut digunakan sebagai file konfigurasi, sedangkan yang biasa adalah memasukkan parameter ke GetoptLong.

if [[ $# -eq 1 && -f $1 ]];
then 
    echo "Using config file $1"
    [...]
else 
    if [ $# -lt 2 ]; then usage "INCORRECT NUMBER OF PARAMETERS"; fi
    while getopts ":a:b:c:d:ef" opt;
    do
    [...]

Salah satu pilihannya adalah mempertahankan if/else dalam skrip Perl seperti:

if (1 == @ARGV && -f $ARGV[0]) {
  # use this config file
  config_file_method($ARGV[0]);
} else {
  # use GetOptions
  GetOptions(
         'a|foo:s' => \$foo,
         'b|bar:s' => \bar,
         [...]
        );
}

Tapi saya ingin tahu apakah kasus khusus ini dapat dimasukkan dalam fungsi GetOptions dengan keajaiban:

  GetOptions(
         'if only one element in @ARGV' => 'call config_file_method($ARGV[0])',
         'a|foo:s' => \$foo,
         'b|bar:s' => \bar,
         [...]
        );

Ada ide?


person 719016    schedule 26.09.2013    source sumber
comment
== membandingkan angka. Angka adalah skalar, jadi == yang diterapkan adalah konteks skalar pada argumennya. Setiap contoh scalar yang Anda miliki tidak ada gunanya.   -  person ikegami    schedule 26.09.2013
comment
@ikegami, catat, saya sudah mengubahnya.   -  person 719016    schedule 26.09.2013


Jawaban (3)


Saya tidak melihat apa pun di dokumentasi Getopt::Long yang mendukung apa yang Anda cari untuk.

Pendekatan yang akan saya ambil adalah membiarkan GetOptions memproses @ARGV. Jika ada yang masih di @ARGV, Anda dapat berasumsi itu adalah file konfigurasi. Maka tidak perlu dilakukan pengecekan -f karena sub config_file_method akan tetap melakukan pengecekan open/die.

GetOptions(
    'a|foo:s' => \$foo,
    'b|bar:s' => \$bar,
);

config_file_method($ARGV[0]) if @ARGV;
person toolic    schedule 26.09.2013

Saya cukup yakin itu tidak mungkin. Jika Anda meneruskan config_file sebagai opsi alih-alih argumen, Anda dapat melakukan hal seperti itu:

GetOptions(
    'c|config_file' => sub { config_file_method($ARGV[0]) if 1 == scalar @ARGV } ,
    'a|foo:s' => \$foo,
    'b|bar:s' => \bar,
    [...]
);
person psxls    schedule 26.09.2013

Tidak ada opsi seperti itu di Getopt::Long.

Dan seperti yang telah Anda tunjukkan, hal itu sama sekali tidak diperlukan. (Ini tidak menghemat pekerjaan Anda, namun menambah kerumitan dengan menciptakan subbahasa baru.)

person ikegami    schedule 26.09.2013