0

このコマンドを perl スクリプトの一部として実行しようとしています。

`mv $n1 ../out`

$n1 は、以前のサブルーチンから取得したファイル名です。以下のようなエラーが表示されます。

mv: missing destination file operand after `test.pl'
Try `mv --help' for more information.
sh: line 1: ../out: is a directory

誰でも助けてください。コマンドを個別に実行すると、正常に実行されます。

4

2 に答える 2

3

表示されているエラー メッセージに非常によく似たものを再現するスクリプトを次に示します。

#!/usr/bin/perl

use strict;
use warnings;

my $n1 = "test.pl\n";

`mv $n1 ../out`;

問題は$n、改行で終わることです (おそらく、ファイルから読み取ったのではないchompでしょうか?)、シェルによって実行されるコマンドは次のとおりです。

mv test.pl
../out

これが実際に問題である場合は、次の値を出力することで追跡できた可能性があります$n1

print "DEBUG: \$n1 = \"$n1\"\n";

注意してください

`...`

構文は、シェル コマンドの出力を取得することを目的としています。ファイルの名前を変更しているだけなので、次を使用する方が理にかなっていますsystem

system 'mv', $n1, '../out';

または、Quentinがコメントで提案したように、ファイルシステムの境界を越えてファイルを移動していないことが確実な場合はFile::Copy::move、または組み込み関数を使用します。rename

于 2012-01-19T11:04:50.300 に答える
0

コネラックが上で言ったこと。

コマンドを呼び出す前にチェックを実行する必要があります。また、コマンドの出力をバックティックではなくuse system()で保存する必要がない場合は、コードがはるかに読みやすくなります。

if ($n1 ) {
    system("mv $n1 ../out");
}
else{
   die "No value assigned to \$n1 from previous routine routine_name()\n";
}

編集
移動しようとしている結果が存在し、通常のファイルであることを確認するためにチェックを変更できます。

if ( -f $n1 ){
....
于 2012-01-19T10:13:34.580 に答える