2013-01-03 23 views
-2

下面的代碼是腳本的一部分,我在其中合併不同目錄的文件。合併後,我將剩餘的文件複製到最終目錄中。 合併是工作正常,但複製文件時我正在在linux上:cp:源文件後缺少目標文件操作數

cp: missing destination file operand after `/users/abc/perl_scripts/temp_dir/b.cc' 
Try `cp --help' for more information. 
sh: line 1: /users/abc/perl_scripts/temp: is a directory 

for $k(dir1) { 
    $flag=0; 
    for $j(@dir2) { 
      if("$k" eq "$j") { 
       &merge_gcov("$UERRC1/$k","$UERRC2/$k","$DATA_DIR/$k"); 
       $flag=1; 
       last;        
      } 
    } 
    if($flag == 0) { 
      #print ">>>>>>>>>>>>> cp $UERRC1/$k $DATA_DIR/$k \n"; 
      'cp $UERRC1/$k,$DATA_DIR`; 
    } 
} 

任何人可以幫助我解決這個...

+6

您的縮進是可怕的。它看起來像你在任何地方使用全局變量。你使用'警告'和'嚴格'?不要用'&調用subs。你的'cp'行是一個語法錯誤(顯示你的真實代碼)。不要在無效的情況下使用反引號。發佈一個完整的程序來演示問題。 – melpomene

+0

它只是腳本的一部分...完整的代碼太大了...問題是與cp命令不與子..我更正'cp $ UERRC1/$ k $ DATA_DIR'; – Nethra

+2

在for循環參數中有'dir1'(裸句)是否是一個錯字?如果您沒有使用'use warnings',這將成爲循環運行一次的靜默錯誤,並且'$ k'是字符串'「dir1」'。 – TLP

回答

5

每當你使用系統調用時,你很可能會做一些冗餘的事情,在這種情況下它肯定是多餘的。 Perl非常有能力複製文件。我建議File::Copy模塊,它是在Perl 5核心模塊使用它很簡單:

use File::Copy qw(copy); 
copy $from, $to or die $!; # it is a good idea to check if the copy failed 

此外,而不是在@dir2遍歷所有的文件名,看看名字匹配$k之一,爲什麼不檢查文件是否存在於其他目錄中?例如。

if (-e "$UERRC1/$k") { # check if file exists 
    merge_gcov("$UERRC1/$k", "$UERRC2/$k", "$DATA_DIR/$k"); 
} else { 
    copy "$UERRC1/$k", $DATA_DIR or die $!; 
} 

的文件測試-e文檔中perldoc -f "-X"

你真的應該使用的變量名是比較合適的發現。它會使你的代碼更易讀,更容易維護和調試。

也...

之前,你做任何事情,你應該添加以下兩行到你的腳本,並修復出現無疑錯誤:

use strict; 
use warnings; 

strict將迫使你申報所有變量(通常爲my $foo),這些變量將很難檢測由於變量名稱中的拼寫錯誤而導致的錯誤。錯誤消息將顯示爲「全局符號$ foo需要顯式包名稱...」。

warnings會爲您提供有關您做錯事情的信息。這是一件好事。

+0

謝謝...它的工作.... – Nethra

+0

@Nethra當然它確實。別客氣。 – TLP

1

參數以CP的形式爲cp from to的,但你有cp from,to

這可能是爲什麼它會抱怨參數的數量 - $UERRC1/$k,$DATA_DIR單個的說法。它應該是cp $UERRC1/$k $DATA_DIR,就像在你的打印聲明中一樣。

+0

是的,我糾正了...但是得到同樣的錯誤... – Nethra

+0

因此,更新您的問題,以顯示真實的代碼(特別是cp行),並取消註釋打印語句以確認所有變量都是您所期望的。 – Useless