3

Perl スクリプトを使用して、Clearcase でチェックインされたファイルのコメントを更新したいと考えています。
コマンドラインから渡すコメントにスペースが含まれていない場合、このスクリプトは正常に機能します。
しかし、スペースを含むコメントを使用すると、エラーが発生します -

エラー: パス名が見つかりません: "C:/Views/view1/some_dir/test.c@@/main/dbg_test/1

以下は、スクリプトへのコマンド ライン入力です。

>>./appendcomments.pl dbg_test "\"scr1234, Test Scr\""  

これが私のコードです。

if ($#ARGV != 1 )
{
    print "usage: addcomments.pl <base branch> <comment>\n";
    print "     For example addcomments.pl rel5.0 \"This is an example\"\n";
    exit;
}

my $base_branch =   $ARGV[0];
my $comment   =     $ARGV[1];

my ($output, @FILE_LIST, $file, $desr);

@FILE_LIST = `cleartool find -avobs -version "version(.../$base_branch/LATEST)" -print`;

FILE: foreach $file (@FILE_LIST) 
{
    $file =~ s/\\/\//g;
    $desr =`cleartool describe -fmt %Nc $file`;

    if ($desr !~ /scr\s*\#*\s*(\d+)/img)
    {
        chomp($file);
        $output = `cleartool chevent -c $comment -replace $file`; 
    }
}
4

2 に答える 2

2

コメントを二重引用符で囲みます (コメントに二重引用符がないことを前提としています)。

$output = `cleartool chevent -c "$comment" -replace $file`; 

コメント テキストにダブル クォーテーション (またはシングル クォーテーション、またはその両方) が表示されることを心配する必要がある場合は、変数コメントに対して何らかの作業を行う必要があります。したがって、一重引用符のコメントについては、次のことを考慮する必要があります。

$comment =~ s/'/'\\''/g;  # Once, outside the loop

$output = `cleartool chevent -c '$comment' -replace $file`; 

シェル スクリプトでは、一重引用符で囲まれている$commentと、シェルが変数を展開するのを防ぐことができますが、これは Perl が展開を行っています。最初の置換は、コメント文字列内のすべての単一引用符をシーケンスに置き換えます'\''。コマンド内の置換は、全体を一重引用符で囲みます。これは、単一引用符で囲まれた文字列があり、各'\''シーケンスが現在の単一引用符で囲まれた文字列を停止し、エスケープされた単一引用符を出力してから、新しい単一引用符で囲まれた文字列を開始し、必要に応じてコメントの最後の単一引用符まで繰り返すことを意味します.

スクリプトは「appendcomments.pl」だとおっしゃいましたが、コマンドの-replace代わりに使用しています。-appendあなたの決定ですが、名前がアクションと一致しません。

于 2012-11-01T22:45:06.940 に答える
1

このスレッドまたはこのスレッドのように、これらの引用符をエスケープしてみてください。

$output = `cleartool chevent -c \"$comment\" -replace \"$file\"`; 

そうは言っても、実際の問題は、「C:/Views/view1/some_dir/test.c@@/main/dbg_test/1"は決して存在しない(cygwinかどうか):ClearCaseは動的でのみ拡張パスにアクセスする」ということです。この例のように動的ビューを使用するM:\...スナップショット()ではなく、ビュー( )。C:\...

より正確には、「pathnames_ccase」から:

動的ビューから、ここで説明するパス名フォームcleartoolを、パス名をとる任意のコマンドへの引数として使用できます。
スナップショットビューから、VOB拡張パス名フォームを、要素とバージョンに関する情報(たとえば、、、、、)を返すコマンドへのcleartool引数describeとして使用できます。このような操作にはMVFSは必要ありません。 ただし、VOB拡張パス名フォームを使用して、ビューにロードされていない要素バージョンをチェックアウトすることはできません。lslshistorydiff

Windowsユーザーへの注意:cleartool大文字と小文字が区別されます。サブコマンドではcleartool、MVFS名前空間内のビュープライベートファイルを含むMVFSオブジェクトへのパス名は大文字と小文字が正しくなければなりません。

したがって、引用符でこれ以上戦う前に:

  • 動的ビューを使用する
  • パスのケースが正しいことを確認してください(cleartool descr M:/path/to/file@/main/aVersioncygwinセッションの単純なもので)
  • 次に、ccperlスクリプトを試してください。
于 2012-11-01T23:02:52.983 に答える