2011-07-01 38 views
3

我對Perl相當陌生,並且一直在搜索interwebs文檔以查找我正在嘗試執行的操作。我沒有任何運氣。在Perl中使用Expect並將文件傳輸到文件

我有一個程序,通過提示輸出信息到標準輸出。我需要製作一個Perl腳本來將這些信息傳遞給一個文件。

我想我可以使用Expect,但在第一次提示後管道似乎有問題。

這裏是我的代碼的一部分:

# Run program and compare the output to the BASE file 
$cmd = "./program arg1 arg2 arg3 arg4 > $outfile"; 

my $exp = new Expect; 
$exp->spawn($cmd); 
BAIL_OUT("couldn't create expect object") if (! defined $exp); 

$exp->expect(2); 
$exp->send("\n"); 

對於這種情況,只有一個提示用戶按「Enter」鍵。這個程序很小,速度非常快 - 2秒鐘就可以達到第一個提示。

輸出文件只包含前半部分信息。

有沒有人有任何建議,我怎麼能抓住下半場呢?

更新: 我驗證過這個作品與期待通過使用一個簡單的腳本:

spawn ./program arg1 arg2 arg3 arg4 
expect "<Return>" 
send "\r" 
interact 

其中「<返回>」是一個冗長的表達式的Perl腳本可以尋找。

注:我已經嘗試編寫我的Perl腳本以期望「<返回>」...它沒有區別。

$exp->expect(2, '-re', "<Return>") 

有什麼想法?

UPDATE2:

Hazaah!我找到了解決我的問題的辦法......完全是偶然的。

所以,我在一些測試代碼,我做了一個輸入錯誤......

$exp->expect(2); 
$exp->send("\r"); 
$exp->expect(2); 

注意結尾的預期(2)......我不小心留下,在和它的工作!

所以,我試圖理解發生了什麼。 Unix期望看起來不是這樣工作的!看起來Expect在Perl中實現「預計」任何事情......不僅僅是提示?

所以,我提供了期待另外2秒收集標準輸出,我能夠得到的一切。

如果任何人都可以提供一些更詳細的信息,瞭解到底發生了什麼,我很想知道發生了什麼。

+1

您確定您需要使用Expect嗎?這似乎是矯枉過正,尤其是當你剛接觸Perl時。 – TLP

+0

有沒有其他建議?除了這個問題之外,我沒有遇到任何似乎太複雜的事情。 – Rico

回答

4

嘗試發送\r而不是\n - 您試圖模擬回車符,而不是換行符,並且tty設置可能不會轉換它們。

ALSO:

從期望文檔FAQ部分,這很可能給你意外的解決方案一個建議:

我的腳本時沒有時間,沒有任何明顯的原因。它似乎有時會從產生的程序中丟失輸出。

如果沒有足夠的時間完成產生的程序 ,您可能會退出太快。嘗試添加$ exp-> soft_close()以優雅地終止 程序,或對'eof'執行expect()。

另外,嘗試添加一個'睡眠1'後spawn()程序。 可能是因爲您的系統上的pty創建速度很慢(但如果您使用的是最新的IO-Tty,則這是 而不太可能)。

標準unix/tcl expect不會以交互模式退出,這可能會給您的程序足夠的時間來完成運行。

+0

謝謝你的建議,但'\ r'並沒有辦法。當我第一次發佈這個問題時,我想我已經嘗試過,但不能確定。 – Rico

+0

你知道「程序」是如何提示和閱讀輸入嗎?在腳本下執行時是否掛起?您可以通過對程序進行更詳細的分析來了解它是如何讀取按鍵的。 –

+0

我已經寫過那裏的界面。它使用下面的代碼:std :: cin.clear(); std :: cin.ignore(std :: numeric_limits :: max(),'\ n'); – Rico

1

這已經有一段時間,因爲我用期待的,但我敢肯定,你需要提供的東西希望對匹配提示:

$exp->expect(2, 'Press enter'); 

例如。

+0

這場比賽沒有必要,它是可選的。期望等待2秒後再繼續。 – Rico

相關問題