Dış programlarla etkileşim, 1987 yılında dilin yaratılmasından bu yana sistem yönetimi ve shell rutinlerinin otomasyonu için kritik bir özellik olan Perl'in önemli bir parçasıdır. Perl, dış bir komutu çalıştırmanın birkaç yolunu sunar: system operatörü, ters tırnaklar (``) veya qx//, bir pipe ile open fonksiyonu ve IPC::Open3 gibi modüler sarıcılar.
Dış süreçleri çalıştırmanın temel sorunu, doğru bir şekilde çıktının (stdout ve stderr) alınması, çalıştırma hatalarının işlenmesi, parametrelerin güvenliği (enjeksiyonların önlenmesi) ve senkron ve asenkron yürütme arasındaki farktır.
Çözüm, belirli bir görev için uygun yöntemi seçmektir. Basit komutlar için system veya ters tırnaklar kullanılırken, karmaşık durumlar için IPC::* modülleri:
Kod örneği (komut çıktısını okuma ve hata işleme):
my $command = 'ls -l /tmp'; my $output = qx{$command}; if ($? == -1) { die "Başlatma hatası: $!"; } elsif ($? & 127) { warn sprintf "Komut sinyal %d ile sona erdi", ($? & 127); } else { print "Çıktı: $output"; }
Anahtar özellikler:
Perl'de system ile exec arasındaki fark nedir?
Cevap: system, bir komutu dış bir süreçte başlatır ve tamamlandıktan sonra Perl kontrolünü geri dönerken, exec mevcut Perl sürecini yürütme programıyla tamamen değiştirir, Perl kodu sonrasında çalışmaz.
Örnek:
system('echo Merhaba'); exec('ls', '-l'); # Artık, Perl betiği ls ile değiştirildi, Perl daha çalışmaz
Kullanıcı değişkenlerini shell komutlarına güvenli bir şekilde geçirebilir miyiz?
Cevap: Yalnızca argüman listesi (string değil) kullanıldığında ve shell interpolasyonundan kaçınıldığında mümkündür. Aksi takdirde komut enjeksiyonu mümkündür.
# Güvenli: system("ls", "-l", $user_supplied_dir); # Tehlikeli: system("ls -l $user_supplied_dir");
Dış bir komuttan hem stdout hem de stderr nasıl alınabilir?
Cevap: Güvenilir yöntem — IPC::Open3 kullanmak veya stderr'yi shell düzeyinde stdout'a yönlendirmektir:
my $out = qx{ls /notexists 2>&1};
veya IPC::Open3 ile (daha evrensel ve hassas bir yöntem).
Admin, system("rm -rf $dir") aracılığıyla kullanıcının girdiği değeri geçirir.
Artılar:
Eksiler:
system('rm', '-rf', $dir) kullanılır, $dir doğrulanır, kayıt tutulur.
Artılar:
Eksiler: