2011-04-10 145 views
1

我正在編寫一個Perl程序,它將採用幾個命令行參數(它們實際上將由另一個程序提供)並將pdf打開到特定頁面。我基於here(請參閱第5頁)。我已經從命令行直接測試了命令,並且它完全符合我希望的命令。現在我試圖從Perl中完成它,但它似乎沒有工作。我得到的錯誤是:Perl命令行問題

The process tried to write to a nonexistent pipe 

下面的代碼......誰能告訴我什麼,我做錯了什麼?

#!C:/perl/bin/perl 
use strict; 
use warnings; 
use diagnostics; 

my $c = `cmd \c "`.$ARGV[0].`" /A "page=`.$ARGV[1].`=OpenActions" "`.$ARGV[2].``; 
print $c; 
system "Pause"; 

所有我得到後,這是一個空格在CMD。一旦我按Ctrl + C,它會返回到提示,如果我在那裏輸入,它會給我上面的錯誤。

+0

您是否在彙編命令字符串時使用反引號(')而不是單引號(')? – 2011-04-10 01:07:47

+0

是的,我正在使用反引號。 backtick是tab鍵上面的那個,對嗎? – MrMonday 2011-04-10 01:12:32

+1

順便說一句,cmd \ c應該是什麼?如果它不讀cmd/c – Ingo 2011-04-10 01:50:08

回答

4

當Perl中看到

my $c = `cmd \c "`.$ARGV[0].`" /A "page=`.$ARGV[1].`=OpenActions" "`.$ARGV[2].``; 

它把它弄成這個樣子:

my $c = qx{cmd \c "}.$ARGV[0].qx{" /A "page=}. 
     $ARGV[1].qx{=OpenActions" "}.$ARGV[2].qx{}; 

每個那些qx{...}部分,由命令shell執行在遇到他們,他們大多是可能是語法錯誤。您的完整命令永遠不會運行。

什麼你可能想要的是:

my $c = qx{cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]"}; 

它構造的字符串,然後把它傳遞給外殼。

+0

謝謝,這清除了反向事物。但是,我討厭這麼說,情況並沒有改變。它仍然和以前一樣... – MrMonday 2011-04-10 02:28:47

+0

最後,即使Ingo的回答中,我的原始程序的命令沒有工作,所以我訴諸於此。這就是爲什麼答案是這樣的。 – MrMonday 2011-04-10 03:40:25

3

我覺得你對於反引號的工作方式有些困惑。事情是這樣的:

my $c = `/where_is/pancake_house` 

將運行/where_is/pancake_house命令,並把一切可能打印在標準輸出到$c。反引號也像雙引號字符串一樣插值。你還必須避開反斜槓。

所以,你不需要多組反引號的命令,你不需要像這樣粘貼東西。事情是這樣的:

my $c = `cmd \\c "$ARGV[0]" /A "page=$ARGV[1]=OpenActions" "$ARGV[2]`; 

應該沒問題。當然,如果ARGV值有空格或引號或其他有趣的東西,你仍然會遇到問題。爲了更安全起見,您可能需要使用IPC::Open2IPC::Open3

+0

我試着添加你所說的,但它仍然返回相同的錯誤。儘管如此,感謝您的嘗試。 (是的,它被複制並粘貼) – MrMonday 2011-04-10 01:55:09

3

反襯不像你似乎想的那樣工作。

$var = "foo"; 
`cmd \c `.$foo 

這不執行命令cmd \c foo。它執行命令cmd \c並獲取輸出,並將$foo的值連接到該輸出。您需要構建完整的命令,然後纔將其反饋給反引號操作符。

+0

這也教我更多關於Perl ......謝謝。我不知道(顯然)。 – MrMonday 2011-04-10 03:33:47