Konu Tarihi:
Perl'in en eski sürümlerinden bu yana @ARGV değişkeni komut satırı argümanlarının listesini sağlamaktadır. Ancak manuel ayrıştırma hatalara yol açabiliyordu. Okunabilirlik ve esneklik sağlamak amacıyla Getopt::Std modülü ortaya çıktı, daha sonra Getopt::Long ve dış CPAN modülleri (örneğin, MooX::Options, Getopt::Euclid) geliştirildi.
Sorun:
“Manuel” ayrıştırma genellikle negatif sayıları, zorunlu ve çoklu bayrakları, boşluklu parametreleri göz önüne almaz. Farklı sözdizimi formatları (--flag=value, -abc, karışık pozisyonlar) betiği dostça olmaktan çıkarabilir ve argümanların sırasının değiştirilmesiyle kolayca bozulmasına neden olabilir.
Çözüm:
Seçeneklerin ve bayrakların gelişmiş ayrıştırması için Getopt::Long'u kullanın. Uzun/kısa seçenekleri, otomatik varyant tespiti, diziler, hash'ler ve çeşitli bayrak formatlarını destekler. Çok karmaşık CLI arayüzleri için, parametrelerin deklaratif tanımı olan CPAN modülleri (MooX::Options, MooseX::Getopt) kullanılmaktadır.
Kod örneği:
use Getopt::Long; my $verbose = 0; my $count = 0; my @files; GetOptions( "verbose" => \$verbose, "count=i" => \$count, "file=s" => \@files, ); print "Verbose is $verbose Count is $count Files: @files ";
Ana özellikler:
Getopt::Std yalnızca kullanılıyorsa pozisyonel argümanları opsiyonel olanlardan nasıl ayırt edersiniz?
Getopt::Std uzun isimli opsiyonlarla çalışamaz veya otomatik olarak pozisyonel argümanları ayıramaz. Kısa bayrakların ayrıştırılmasından sonra pozisyoneller @ARGV içerisinde mevcuttur, ancak karmaşık sözdizimi desteği manuel çalışma gerektirir.
Getopt::Long ile Getopt::Std arasındaki temel fark nedir?
Getopt::Std yalnızca kısa (tek karakterli) seçeneklerle çalışırken, Getopt::Long uzun bayrakları, değer türlerini, dizileri/hash'leri ayrıştırabilir ve harf olmayan anahtarları destekler.
Sadece @ARGV üzerinden değil, STDIN üzerinden parametre alabilir miyiz?
Evet, ancak bu Getopt::Long için standart değildir. Karmaşık CLI ve STDIN girişleri için STDIN'i manuel olarak okuyup bu girişi ayrıştırma mantığınıza entegre etmeniz gerekir.
Bir betik manuel olarak her argümanı @ARGV'den bir döngü ile ayrıştırıyor, --arg sonrası değerleri unutarak, -- ile çalışma yapmadan ve negatif sayıların hatalı işlenmesiyle (örneğin, -5 bir bayrak haline geliyor).
Artılar:
Eksiler:
Tüm değişkenlerin başlangıçta kısa bir tanımlaması ile Getopt::Long kullanımı. Diziler, zorunluluk, format kontrolü, yardım çıktısı desteklenmektedir.
Artılar:
Eksiler: