2

私はpng画像のピクセル強度値を生成するプログラムを持っていますが、元の結果のテキストファイルで何らかの障害が発生したため、これらの画像を同じ名前の新しいファイルで上書きする必要があります。私が持っている質問は、そのファイルの新しいバージョンをコピーするときに、宛先ディレクトリを最初に同じ名前の宛先ファイルを削除する必要がありますか、それとも宛先ファイルが上書きされますか?

system ("rm -rf /home/alos/Y2H_images/all$intensity");
system ("cp $intensity /home/alos/Y2H_images/all");

または、perlスクリプトでcopyコマンドを実行すると、ファイルが自動的に上書きされますか?ありがとう

4

4 に答える 4

4

コマンドを実行するのはPerlではなく、指定された文字列を引数としてPerlによって呼び出されるシェルです。

そして、はい、それは通常のコピーのようです-それはあなたがそれを自分でシェルに入力したかのように同じ名前の既存のファイルを壊し、あなたがそれを入力したのと同じように許可エラーなどで失敗します自分でシェル。

さらに、ワイルドカード拡張と文字列エスケープはシェル固有であり、移植性とセキュリティ上の理由から考慮する必要があります。

于 2011-07-28T13:55:20.083 に答える
3

新しいファイルをコピーするだけで、古いファイルが置き換えられます。

cpiおよびnフラグを使用して上書き動作を制御できます。デフォルトでは、とにかく、ファイルは上書きされます。

特定のエラー状態、つまり宛先ファイルを開くことができない場合に安全を確保したい場合は、-fフラグを指定できます。

 system ("cp -f $intensity /home/alos/Y2H_images/all");
于 2011-07-28T13:55:19.437 に答える
2

あなたがそれを呼んでいるならsystem、それは「現実の生活」のように振る舞います。はい。

于 2011-07-28T13:56:11.807 に答える
2

コメントで述べたように、File::Copyを使用するのが本当に良い解決策です。宛先ファイルを上書きします(少なくとも私のシステムでは)。

use File::Copy;
copy $intensity, "/home/alos/Y2H_images/all" or die $!;

宛先ファイルがすでに存在するかどうかを確認したい場合は、次の方法で実行できます。

print "File exists: $intensity\n" if -e $intensity;

それでもファイルをコピーする前にファイルを削除したい場合:

unlink "/home/alos/Y2H_images/all$intensity" or die $!;
于 2011-07-28T14:55:31.203 に答える