当我在命令行中使用以下命令时,它会给出非集成更改列表的列表。
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脚本中使用此命令?
答案 0 :(得分:7)
这就是启用strict
和warnings
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
将包含每个未整合的更改列表的数组引用。