2014-09-04 26 views
0

我有一個C#可執行文件,我會叫這樣的:調用帶有輸出參數一個C#可執行的方法在Perl

UpdateData.exe -getid projectName testName idValue 

內部這就要求在我的方法...

GetId(string projectName, string testName, out string idValue); 

我的問題我需要從Perl腳本調用這個可執行文件。我是Perl的新手,我無法弄清楚如何調用這個函數。這是我試過的。

my $idValue = 0; 
my ($cmd) = "UpdateData.exe -getid $projectName $testName idValue"; 
my $out = `$cmd`; 
chomp $out; 
print $idValue 

而上面的行仍然打印0.我在這裏做錯了什麼?

+2

你從來沒有設置$ idvalue。輸出參數在cli上不起作用 – MrTux 2014-09-04 23:03:19

+0

Mr.Tux:UpdateData.exe實際返回成功/錯誤的int返回碼。我沒有看到$ out中的任何內容。 – user3606175 2014-09-04 23:05:22

+1

讓這個工作起作用的唯一方法是將生成的id寫入stdout,並從per $中獲取$ out。 – MrTux 2014-09-04 23:06:48

回答

1

根據您的需要,有幾種方法。在上面的示例中,您捕獲程序的輸出(即STDOUT)並將其放入變量中。根據寫入STDOUT的內容,您必須解析結果以確定成功或失敗。但是這取決於產生指示成敗的程序是否成爲先決條件。

如果您知道UpdateDate.exe在成功失敗時返回0,並且失敗時返回其他值(前提條件:如果它不管返回相同的值,它可能都不值得捕獲任何信息),並且您對輸出不感興趣,你可以使用功能系統。使用從你上面的例子,它看起來是這樣的:

my $idValue = 0; 
my ($cmd) = "UpdateData.exe -getid $projectName $testName idValue"; 
# Save the returned value from the program execution 
$idValue = system($cmd); 
# Print out the returned value. 
print $idValue; 
# shift value by 8 to get the exit code. 
if (0 != ($idValue >> 8)) 
{ 
    # Issue and take action if required 
} 

下面是它給出了系統和反勾差異的優秀解釋的鏈接:

What's the difference between Perl's backticks, system, and exec?

+0

過了一段時間,但是您不必爲了獲得真實的返回狀態而將系統()輸出移位(位移?)嗎?另外,爲什麼比較像'if(0!= $ idValue)'而不是'if($ idValue!= 0)'?我知道在Perl TIMTOWTDI中的一切,但想知道你的語法是否有優勢。 – jimtut 2014-09-05 05:07:47

+0

是的,根據你的文件是正確的。我將編輯並進行更正。 – Glenn 2014-09-05 05:30:33

+0

至於語法,在這種情況下,可能不是。這是一個使用C/C++的同事習慣。我將常量放在左邊。考慮一下if($ idvalue == 0)的情況,但是你會忽略掉一個=偶然{if($ idValue = 0)}。它成爲一項任務。零值分配,然後評估爲0,這是錯誤的循環將失敗。如果你有if(0 = $ idValue),你會得到一個語法錯誤,因爲你不能將$ idValue的值賦給一個常量。我曾見過一個這種情況發生的案例。我只是覺得這是一個好主意。 – Glenn 2014-09-05 05:33:05

相關問題