2010-08-30 122 views
0

當我在命令行中使用以下命令時,它給出了非集成更改列表的列表。兩個分支之間的非集成更改列表

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

c'wiki由於害怕被低估? – Zaid 2010-08-30 13:24:53

+0

@Zaid:自我實現的預言。 – Ether 2010-08-30 16:23:19

回答

7

這就是爲什麼打開strictwarnings編譯指示非常重要。字符串「@ $ 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; 
} 
0

如果你打算做了很多的Perforce的用Perl,嘗試P4Perl,它包裝Perforce公司在Perl的原生API。

從文檔惡癖,您的通話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將包含與每個未整合的變更列表的數組引用。

相關問題