2016-12-23 22 views
7

Çalışma arkadaşlarımın çoğu BEGIN bloklarında aşağıdaki komutları kullanır. Etrafa baktım ve yardımcı olamaz amaBir dizine geçmek ve sonra getcwd()

$scriptDir = dirname($0); 
chdir($scriptDir); 
$scriptDir = getcwd(); 

Üçüncü satır yani $scriptDir = getcwd(); gereksiz olduğunu düşünüyorum. Zaten $scriptDir = dirname($0);'dan komut dosyası sahibiyiz. Burada bir şey eksik miyim?

+0

Aşağıda gösterildiği gibi, 'FindBin qw ($ RealBin);' kullanın ve dizini değiştirmeyin. '@ ARGV' içinde listelenen dosyalar' $ RealBin' değil 'pwd'ye göredir. – shawnhcorey

cevap

7

dirname($0)Chankey Pathak ve Matthias göstermek gibi tam yolunu dönmez: ancak scrip.pl yolunda bulunursa hiçbir fark yoktur.

Başka yollar olduğunu eklemek isterim. Örneğin,

use FindBin qw($RealBin); 

BEGIN: { 
    my ($scriptDir) = $RealBin; 
    chdir $scriptDir    or die "Can't change to $scriptDir: $!"; 
}; 

$RealBin

çözüldükten bağlantıları ile tam yolu olması dışında, sen ne gösterecek aynı verir FindBin (aynı zamanda çekirdek) kullanabilir.

chdir, yorum için ikegami sayesinde başarısız olabilir. Bu durumda yanlış iade edilir ve yukarıdaki kodlar uygun şekilde ayarlanır. Sorgulanan üçüncü satırın bununla hiçbir ilgisi olmadığını unutmayın.

Bu modül aynı zamanda yaygın olarak belki de her ikisi için kullanmak daha kolay bir karar için kılan örnek

use lib "$RealBin/../lib"; 

için, lib pragma ile kütüphanelere göreli yolu için kullanılır. Bu fonksiyon, UNIX kabuk komut dirname(1) ile uyumluluk için sağlanır ve daha kültürlerinden bazı miras kalan

( maden olmayan vurgu ) File::Basename den dirname açıklamada verilen


Daha.Adına rağmen NOT her zaman dizin adını beklediğiniz gibi döndürür. Güvende olmak için, bir yolun dizin adını kullanmak istiyorsanız fileparse()'u kullanın.

Doğrusu bile abs_path tam yolunu sağlamayabilir kendi başına __FILE__ beri kullanılmaktadır

use Cwd qw(abs_path); 

BEGIN: { 
    my ($scriptDir) = abs_path(__FILE__) =~ m|(.*)/|; 
    chdir $scriptDir    
     or die "Can't change to $scriptDir: $!"; 
}; 

ile gider. Regex açgözlülükle her şeyi en son /'a, yani betiğin dizinine giden tam yola kadar atar.

4
  • getcwd - Geçerli çalışma dizini
  • chdir İade - örneğin Aşağıda

iyi açıklıyor expre için çalışma dizinini değiştirir.

#!/usr/bin/perl 
use strict; 
use warnings; 
use File::Basename; 
use Cwd; 

my $scriptDir = dirname($0); 
chdir($scriptDir); 
print "First: $scriptDir\n"; 
$scriptDir = getcwd(); 
print "Second: $scriptDir\n"; 

Çıktı:

[email protected]:~/Desktop$ perl test.pl 
First: . 
Second: /home/chankeypathak/Desktop 
0

sonraki perl tüccarı değilim, ama biraz komut dosyası ile verdiği kodu çalıştırmak için çalıştık:

#!/usr/bin/perl 
# 

use strict; 
use File::Basename; 
use Cwd; 

BEGIN { 
    my $scriptDir = dirname($0); 
    print "scriptDir = $scriptDir\r\n"; 
    chdir($scriptDir); 
    $scriptDir = getcwd(); 
    print "scriptDir = $scriptDir\r\n"; 
} 

Ve bu ne olduğunu çıktı:

[email protected]:~/perltest> ./script.pl 
scriptDir = . 
scriptDir = /home/map/perltest 
[email protected]:~/perltest> 

It lo Bu durumda dirname ve getcwd gibi bir fark yaratır.

[email protected]:~> cp script.pl ~/bin 
[email protected]:~> cd 
[email protected]:~> script.pl 
scriptDir = /home/map/bin 
scriptDir = /home/map/bin 
[email protected]:~> rm ~/bin