Komut satırı argümanları, betik çalıştırıldığında (betik adının kendisi hariç) geçilen tüm parametreleri içeren yerleşik @ARGV dizisi aracılığıyla işlenir. Bu, CLI Perl uygulamaları için temel bir yöntemdir, ancak veri tipleri, kodlama, parametre ayrımı ve dosyaların otomatik olarak okunması gibi pek çok incelik içermektedir.
Perl'in ilk sürümlerinden itibaren @ARGV dizisi, C'deki argv[]'ye benzer şekilde, başlatma argümanlarının standart "giriş noktası"nı temsil etmiştir. Ancak Perl, genel amaçlı bir dil ve metin görevleri sunduğundan, birçok ek hile eklemiştir — örneğin, <> ifadesi, içerik olarak @ARGV ile "ilişkilidir", böylece argümanlar olarak listelenen dosyaları hemen okuma olanağı sağlar.
Basit @ARGV okuması yalnızca basit durumlar için uygundur. Karmaşık CLI programlarında, seçeneklerin (örn. --help, -o file) işlenmesi gerekliliği ortaya çıkar. Bu durumda, indekslerle veri okuma güvenli olmaktan uzaklaşır ve kullanışsız hale gelir. Ayrıca, boşluklar, standart olmayan karakterler veya farklı kodlamalar içeren argümanların işlenmesi daha da karmaşık hale gelir. Ek olarak, <> operatörü aracılığıyla dosyaların otomatik açılması ve @ARGV öğeleri "-" (stdin) gibi olduğunda beklenmedik davranışlar ortaya çıkabilir.
Basit argümanları okuma:
foreach my $arg (@ARGV) { print "Arg: $arg "; }
Seçenekler için genellikle özel Getopt::Long modülü uygulanır:
use Getopt::Long; my $help; GetOptions('help' => \$help);
Tüm dosyaları @ARGV'den okumak için dosya içeriklerini bir döngü aracılığıyla hemen okuyabilirsiniz:
while (<>) { print; }
<> operatörü, @ARGV'yi okunacak dosya listesi olarak yorumlarEğer komut satırı argümanlarından biri sadece tire (-) içeriyorsa ne olur?
Bu durumda <> operatörü kullanıldığında Perl, '-' karakterini bir dosya adı olarak değil, standart girdi (stdin) olarak algılar.
perl script.pl - file.txt # Önce stdin'den, sonra file.txt'den okuma
Script içinde @ARGV'yi güvenli bir şekilde değiştirmek mümkün mü?
Evet, bu, işlenmiş argümanları kaldırmak için standart bir uygulamadır. Genellikle seçenekler işlendiğinde @ARGV'de yalnızca "çıplak" dosya isimleri veya tanınmamış parametreler bırakılır.
@ARGV'deki UTF-8 argümanları ile çalışırken encode/decode yapmak gerekli mi?
Bu, yerel ayar ve ortamdan bağımsızdır. Perl, varsayılan olarak @ARGV'nin kodlamalarını dönüştürmez ve "olduğu gibi" kabul eder. Bu nedenle, dosya isimleri (veya parametreler) ASCII dışı karakterler içeriyorsa, Perl'de onlarla çalışmak için açıkça Encode ile dizeyi dekode etmek önerilir.
<> aracılığıyla ikili dosya okumaya çalışmak verilerin bozulmasına yol açarBir günlük ayrıştırma aracı dosya listesini alır. Kullanıcı tesadüfen '-':
perl parse.pl - access.log
Sonuç olarak — birdenbire program takılır ve klavyeden giriş bekler.
Artılar:
Eksiler:
CLI programı, argümanları Getopt::Long aracılığıyla okur, tüm negatif seçenekleri açıkça işler ve @ARGV'de yalnızca dosya isimlerini bırakır:
perl report.pl --input access.log --output report.txt
Artılar:
Eksiler: