Bir Perl programına komut satırı bağımsız değişkenlerini nasıl iletebilirim?


137

Perl betiği üzerinde çalışıyorum. Komut satırı parametrelerini nasıl iletebilirim?

Misal:

script.pl "string1" "string2"

3
İlk önce, olması gerekecek ./script.plya da bir sürü zaman olmayacak.
Parthian Shot

Yanıtlar:


189

Ne yapmak istediğine bağlı. İki bağımsız değişkeni girdi dosyası olarak kullanmak istiyorsanız, bunları aktarabilir ve ardından <>içeriğini okumak için kullanabilirsiniz .

Farklı bir anlamı varsa, bunları kolayca kullanabilir GetOpt::Stdve GetOpt::Longişleyebilirsiniz. GetOpt::Stdyalnızca tek karakterli anahtarları destekler ve GetOpt::Longçok daha esnektir. Gönderen GetOpt::Long:

use Getopt::Long;
my $data   = "file.dat";
my $length = 24;
my $verbose;
$result = GetOptions ("length=i" => \$length,    # numeric
                    "file=s"   => \$data,      # string
                    "verbose"  => \$verbose);  # flag

Alternatif olarak, @ARGVtüm komut satırı bağımsız değişkenlerini içeren özel bir değişkendir. $ARGV[0]birinci (yani "string1"sizin durumunuzda) ve $ARGV[1]ikinci argüman. Erişmek için özel bir modüle ihtiyacınız yok @ARGV.


29
$ ARGV [0] ilk argüman; perl 0'dan sayılır ve program adı @ARGV değil 0 $ 'dır.
derobert

4
$ ARGV [0] karışıklığına rağmen .. Bu, SO aradığımda bulmayı umduğum türden bir cevap, teşekkürler ve benden +1.
lexu


60

Onları tıpkı düşündüğünüz gibi geçirirsiniz ve senaryonuzda diziden alırsınız @ARGV. Şöyle ki:

my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";

foreach my $argnum (0 .. $#ARGV) {

   print "$ARGV[$argnum]\n";

}

Gönderen burada .


8
Ayrıca, bazı programlama dillerinde ilk (0) argümanın komut veya komut dosyasının kendisi olduğunu belirtmek gerekir.
danieltalsky

10
Bunun yerine şunu $#ARGV + 1da söyleyebilirdiniz@ARGV
Leon Timmermans

1
sadece ARGV[0]veya $argv[1]belirli bir argüman arıyorsanız kullanın .
Manoj

29
foreach my $arg (@ARGV) {
    print $arg, "\n";
}

her argümanı yazdırır.


Getopts kullanmıyorsanız, bu şekilde tahribatsız bir argüman listesi geçmesini tavsiye ederim. Perlmeme.org/howtos/syntax/foreach.html dosyasına dayanarak sözdiziminin doğru olduğu anlaşılıyor; bir uyarı için, Yan etkiler: Kontrol değişkeni liste öğesine bir takma
addır

24

Alternatif olarak, daha seksi bir yol .....

my ($src, $dest) = @ARGV;

"Varsayım" iki değer iletilir. Ek kod, varsayımın güvenli olduğunu doğrulayabilir.


6
Bunun nasıl yeni bir bilgi olduğundan emin değilim, ama yeni olduğunuz için bir aşağıya karşı karar verdim.
Joel Berger

Daha seksi değil. Tüm argümanlar@ARGV C / C ++ 'nın argv / argc aracılığıyla sağlaması gibi herhangi bir işlem yapmadan kullanılabilir
Eugen Konkov

21

Yine başka bir seçenek perl -s kullanmaktır, örneğin:

#!/usr/bin/perl -s

print "value of -x: $x\n";
print "value of -name: $name\n";

Sonra şöyle deyin:

% ./myprog -x -name=Jeff
value of -x: 1
value of -name: Jeff

Veya daha fazla ayrıntı için orijinal makaleye bakın:


13

Değişkenler @ARGVlistesine özel değişkeni atayarak bunlara doğrudan erişebilirsiniz . Yani mesela:

( $st, $prod, $ar, $file, $chart, $e, $max, $flag ,$id) = @ARGV;

perl tmp.pl 1 2 3 4 5

resim açıklamasını buraya girin


7

Bağımsız değişkenler okunacak dosya adlarıysa, içeriklerine erişmek için elmas (<>) operatörünü kullanın:

while (my $line = <>) {
  process_line($line);
}

Bağımsız değişkenler seçenekler / anahtarlarsa, slavy13.myopenid.com tarafından gösterildiği gibi GetOpt :: Std veya GetOpt :: Long kullanın.

Başka bir şey olma ihtimaline karşı, @ARGV'den açıkça yürüyerek veya komutla onlara erişebilirsiniz shift:

while (my $arg = shift) {
  print "Found argument $arg\n";
}

(Bunu yapmanın shiftyalnızca tüm subs dışındaysanız çalışacağını unutmayın . A içinde , programa iletilenler yerine subiletilen bağımsız değişkenlerin listesini alır sub.)


5
my $output_file;

if((scalar (@ARGV) == 2) && ($ARGV[0] eq "-i"))

{

$output_file= chomp($ARGV[1]) ;


}

2

Sadece bazı değerler istiyorsanız, @ARGV dizisini kullanabilirsiniz. Ancak bazı komut satırı seçenekleri işlemek için daha güçlü bir şey arıyorsanız, Getopt :: Long kullanmalısınız .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.