-2

以下のコードはスクリプトの一部で、異なるディレクトリのファイルをマージしています。マージ後、残りのファイルを最終ディレクトリにコピーしています。マージは正常に機能していますが、ファイルのコピー中に取得しています

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`;
     }
 }

誰でもこれを解決するのを手伝ってもらえますか...

4

2 に答える 2

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 $!; 
}

ファイル テストのドキュメントは次の場所にあります-eperldoc -f "-X"

より適切な変数名を使用する必要があります。これにより、コードが読みやすくなり、保守とデバッグがはるかに簡単になります。

また...

他のことを行う前に、次の 2 行をスクリプトに追加し、間違いなく表示されるエラーを修正する必要があります。

use strict;
use warnings;

strictは、すべての変数を (通常は で) 宣言することを強制しますmy $foo。これにより、変数名のタイプミスによる検出が困難なバグが取り除かれます。エラー メッセージには、「グローバル シンボル $foo には明示的なパッケージ名が必要です ...」と表示されます。

warningsあなたが間違っていることについての情報を提供します。これは良いことです。

于 2013-01-03T12:35:48.763 に答える
1

cpの引数はの形式cp from toですが、がありますcp from,to

$UERRC1/$k,$DATA_DIRこれが、引数の数について不平を言う理由かもしれません-単一の引数です。cp $UERRC1/$k $DATA_DIR印刷ステートメントのように、である必要があります。

于 2013-01-03T11:23:18.323 に答える