2010-02-26 13 views
6

Aşağıdaki aptal Perl programını göz önünde bulundurun:Perl'de <> için komut satırı argümanlarını ve dosya isimlerini nasıl karıştırırım?

$firstarg = $ARGV[0]; 

print $firstarg; 

$input = <>; 

print $input; 

Aşağıdaki gibi bir terminalden çalıştırıyorum:

perl myprog.pl sample_argument 

Ve şu hatayı al:

Can't open sample_argument: No such file or directory at myprog.pl line 5. 

Neden olduğu hakkında bir fikriniz var mı? Xzx26'ya geldiğinde, (var olmayan) dosyadan "sample_argument" ya da bir şeyden okumaya mı çalışıyor? Ve neden?

cevap

12

<> ile bunları kendiniz tüketmek gerektiği "@ARGV belirtilen dosyalardan okumak veya @ARGV boşsa, o zaman STDIN okunan" için kısaltmadır. Programınızda, @ARGV, ("sample_argument") değerini içerir ve böylece Perl, <> işlecini kullandığınızda bu dosyadan okumaya çalışır.

$firstarg = shift @ARGV; 
print $firstarg; 
$input = <>;  # now @ARGV is empty, so read from STDIN 
print $input; 
+2

Aha! olarak değiştirildi, iyi çalıştı :) – Jimmeh

1

Varsayılan olarak, perl, komut satırı argümanlarını <> için girdi dosyaları olarak tüketir. Bunları kullandım sonra, shift;

+0

Geriye doğru var. Perl, varsayılan olarak @ ARGV ile hiçbir şey yapmaz. Bu '<'' özel davranışı. –

+0

Ben de öyle söylüyordum. Kendinizi vardiya ile tüketmediğiniz sürece bu <> kullanır @ARGV. –

8

perlio man sayfasına bakınız, kısmen okur:

The null filehandle <> is special: it can be used to emulate the behavior of sed and awk. Input from <> comes either from standard input, or from each file listed on the command line. Here’s how it works: the first time <> is evaluated, the @ARGV array is checked, and if it is empty, $ARGV[0] is set to "-", which when opened gives you standard input. The @ARGV array is then processed as a list of filenames.

Eğer STDIN istiyorsanız, kullanımınız <> hattına ulaşmadan

Sen @ARGV temizleyerek çözebilirsiniz STDIN, <> değil.

İlgili konular