2017-02-16 44 views
1

我在Perl中創建了一個小腳本,我對此很感興趣。我應該有一個腳本來查看給定的參數並在給定的參數中創建一個目錄樹。腳本的這部分工作。第二部分(它是嵌套的if語句)不會在您不提供參數時要求您輸入您選擇的目錄。我相信嵌套的if語句由於$ file輸入而搞亂了,但我不完全確定最新的錯誤。這可能很簡單,但我一直無法找到解決方案。預先感謝您的幫助和提示。運行一個Perl腳本IF語句的小問題。

#! /usr/bin/perl 

if ($#ARGV == -1) 
{ 
    print "Please enter default directory:"; 
    my $file=<STDIN>; 

    if (-d $file) 
    { 
     chdir $file; 
     system("mkdir Data"); 
     system("mkdir Data/Image"); 
     system("mkdir Data/Cache"); 
     print "Structure Created"; 
    } 
    else 
    { 
     print "Directory does not exsist"; 
    } 
} 
else 
{ 
    chdir $ARGV[0]; 
    system("mkdir Data"); 
    system("mkdir Data/Image"); 
    system("mkdir Data/Cache"); 
    print ("Structure Created"); 
} 
print ("\n"); 
+2

需要用'格格($文件)的$dir名'你讀它之後,什麼是通過'STDIN'自帶的換行鍵入和'-d $ file'沒有按」 t找到'filename \ n'(因爲它真的是'filename')。此外,爲什麼要爲'@ ARGV'的最後一個元素(這是'$#ARGV')的索引測試'-1'?如果你正在測試'@ ARGV'數組是否爲空,你可以說'if(not @ARGV)' – zdim

+0

使用'$ file'變量來保存一個目錄名稱可能會讓你感到困惑,而不是混淆我們。在腳本頂部附近先取出arg:'if(!@ARGV){die「no args supplied ... \ n」; }; $ my dir = $ ARGV [0];'。 ''將在程序運行時接受你在命令行上發送的任何內容,這與命令行參數('ARGV')不同。 (@zdim在評論中顯示如何去除換行符)。還有幾種優化方法,但還沒有足夠的信息來制定完整的答案。 – stevieb

+0

@stevieb我認爲他們的意思是如果在命令行上沒有提交任何內容,就會提供'STDIN'輸入。如果是這種情況,那麼當@ ARGV'爲空時,他們不能'死亡'。我同意這有點不清楚。 – zdim

回答

3

測試-d $file失敗,因爲通過STDIN輸入什麼也有換行,指定的目錄名稱後的字符串。您需要chomp($file);


但是,還有幾點我想提出來。

最重要的是,兩個分支都有重複的代碼。你真的不想那樣做。它可以並且確實會在以後引起麻煩。相反,決定目錄名稱,然後製作它。

其次,沒有理由爲了製作一個目錄而去系統。在Perl中完成它要好得多,並且有很好的模塊。

use strict; 
use warnings; 
use File::Path qw(make_path); 

my $dir;  
if (not @ARGV) { 
    print "Please enter default directory: "; 
    $dir = <STDIN>; 
    chomp $dir; 
} 
else { 
    $dir = $ARGV[0]; 
} 
die "No directory $dir" if not -d $dir; 

my $orig_cwd = chdir $dir or die "Can't chdir to $dir: $!"; 

my @dirs = map { "Data/$_" } qw(Image Cache); 

my @dirs_made = make_path(@dirs, { verbose => 1 }); 

print "Created directories:\n"; 
print "$_\n" for @dirs_made; 

我建立使用map因此,爲了避免重複的字符串與Data/...目錄列表,和更高的靈活性。你當然可以輸入名字,但這往往會招致愚蠢的錯誤。

我用File::Path來製作目錄。它構建了整個路徑,如mkdir -p,還有其他一些有用的選項,您可以在{ }中傳遞,包括錯誤處理。還有其他模塊,例如Path::Tiny及其mkpath(以及許多其他好東西)。

請注意,使用chdir時,您可能需要記錄當前工作目錄,它返回並且要檢查錯誤。但是,如果沒有其他原因,您不必chdir。只是包括在map

# No chdir needed here 
my @dirs = map { "$dir/Data/$_" } qw(Image Cache);