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

在 shell 脚本中,单引号$comment会阻止 shell 扩展变量,但这是 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,、、lslshistorydiff。此类操作不需要 MVFS。
但是,您不能使用 VOB 扩展路径名称表单来检出未加载到视图中的元素版本。

Windows 用户注意事项:cleartool区分大小写。在cleartool子命令中,MVFS 对象的路径名(包括 MVFS 命名空间中的私有视图文件)必须区分大小写。

因此,在与引号打架之前:

  • 使用动态视图
  • 确保路径 bis 的大小写正确(cleartool descr M:/path/to/file@/main/aVersion在 cygwin 会话中使用简单)
  • 然后试试你的 ccperl 脚本。
于 2012-11-01T23:02:52.983 回答