两个分支之间的非集成变更列表

时间:2010-08-30 13:07:30

标签: perl perforce

当我在命令行中使用以下命令时,它会给出非集成更改列表的列表。

p4 interchanges -t $branch1 @$date1, @$date2 $branch2 > changes.txt

但是当我在Perl脚本中使用这个命令时,它没有给出输出:

$cmd = system ("p4 interchanges -t $branch1 @$date1, @$date2 $branch2 > changes.txt");

命令行中的输出消息是一些错误,如下所示:

branch1, - all revision(s) already integrated.

问题是因为date1和date2之间使用了逗号?如何在Perl脚本中使用此命令?

2 个答案:

答案 0 :(得分:7)

这就是启用strictwarnings pragma非常重要的原因。字符串“@ $ date1”并不代表您的想法。它试图将$data1取消引用为数组。由于strict未启用,因此将$date1的内容视为符号引用。如果您已启用strict,则会看到如下错误消息:

Can't use string ("2010-08-30") as an ARRAY ref while "strict refs" in use at script.pl line 10.

你应该这样说:

system "p4 interchanges -t $branch1\@$date1,\@$date2 $branch2 > changes.txt";
if ($?) {
    die "saw exit code: ", $? >> 8;
}

如果您希望$branch1$date1等是shell变量而不是Perl变量,那么您可能会遇到问题。在这种情况下,你应该说:

system "p4 interchanges -t $ENV{branch1}\@$ENV{date1},\@$ENV{date2} $ENV{branch2} > changes.txt";
if ($?) {
    die "saw exit code: ", $? >> 8;
}

答案 1 :(得分:0)

如果您要使用Perl执行大量Perforce,请尝试使用Perl-native API包装Perforce的P4Perl

从文档中抄袭,您的system()电话可以实现为:

use P4;
my $p4 = new P4;
$p4->SetClient( $clientname );
$p4->SetPort ( $p4port );
$p4->SetPassword( $p4password );
$p4->Connect() or die( "Failed to connect to Perforce Server" );

my $c = $p4->Run( "interchanges", "-t", $branch1, "@".$date1, "@".$date2, $branch2 );

$c将包含每个未整合的更改列表的数组引用。