2016-03-21 28 views
14

Perl'de system() çağrılarını yaptığımda, genellikle dönüş kodunu perldocs'a göre incelerim. Eh, öyle düşündüm. Çoğu zaman $rc!=0 benim için yeterli. Son zamanlarda apache altında .cgi komut dosyalarını çalıştırırken system() çağrıları ile ilgili sorun vardı iki kişi burada yardımcı oldu. Ben $rc

my $rc = system(...); 

arasında incelemek için talimat ve system() docs onları bağladı. Sonra daha yakından baktı ve belgeler gerçekten $rc ancak bunun yerine yaklaşık $? bahsetmiyoruz fark edilmesini ve biraz mahcup hissettim ve şu soru ortaya çıktı:

system(...); 
if ($? == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($? & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($? & 127), ($? & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $? >> 8; 
} 

ve:

arasında bir fark var mı

my $rc = system(...); 
if ($rc == -1) { 
    print "failed to execute: $!\n"; 
} 
elsif ($rc & 127) { 
    printf "child died with signal %d, %s coredump\n", 
     ($rc & 127), ($rc & 128) ? 'with' : 'without'; 
} 
else { 
    printf "child exited with value %d\n", $rc >> 8; 
} 

Veya, kısaca, system() için $? eşit $rc mı?

system, wait ve $? belgelerine baktım ama bana göre çok açık değil. Son 15 yılda $rc kullanarak yanlış mı yaptım?

+1

için '$' şansı yoktur rc' 'sen etrafında almak önce sana değişen $? bu değeri kullanarak. – tadman

+0

Teşekkürler @tadman. Yorumunuz için de geçerli olan kabul edilen cevaba bir yorum ekledim. '$ Rc' kullanmak bana daha temiz bir yol gibi görünüyor. – PerlDuck

cevap

10

Evet, systemdönüş değeri$? olmalıdır. $? Ancak

değil sadecesystem aramalar için geçerli yapar ve $? global değişkendir, bu gerçekleştiğini başka eylemler tarafından üzerine yazılabilir. perldoc -v '$?' itibaren bu şunlardır:

$ CHILD_ERROR

$?

Son boru tarafından döndürülen durum kapanır, backtick ("` `)) komutu," wait() "veya" waitpid() "işlevine yapılan başarılı çağrı veya" system() "operatöründen.

karşılaştırma ardından hemen değerini depolamak için çok daha güvenlidir: Eğer sonuç yakalamak ise

my $rc = system('ls myfile.txt'); 
if ($rc >> 8 != 0) { 
    # do something because ls exited with an error 
} 
+0

Harika! Bunu duymak ve emin olmak istedim. Teşekkür ederim. $ ''Nin volatilitesinin (C'deki errno gibi) farkındayım ve sadece açık bir rc alıcısı varsa (backtick'lerde olduğu gibi) kullanın. Ben zaten açık vars tercih ve hatta mümkün olduğunda '$ _' kaçınmak. IMHO okunabilirliği ve sürdürülebilirliği çok fazla _magic_ vars kullanmaktan muzdariptir. Böylece $ rc ile yapışacağım. :-) – PerlDuck

+2

'$?' Hemen hemen aynı problemlere sahip olduğu anlamına gelen C'nin ihtiyatlı 'errno' ile aynıdır. Büyülü küresel değişkenler, bir kez harika bir fikir gibi gözüküyordu, ama şükürler olsun ki, devam ettik. – tadman

+3

@tadman Aslında, "$!" Hemen hemen "errno" ile aynıdır (sadece "errno" nun geçerli değerini alır). '$?'biraz farklıdır, çünkü her bekle veya boru kapanmasıyla ayarlanır, hatta başarılı olsalar bile (' $! 'sadece bir hatadan hemen sonra geçerlidir). Ama küresel değişkenler konusunda haklısınız. – ThisSuitIsBlackNot

İlgili konular