2016-02-15 75 views
1

我試圖刪除我的程序依賴從文件中讀取信息,然後解釋該信息。我創建了一個Perl命令庫,可以根據需要生成必要的信息。我遇到的一個問題是,Perl有時會調用期望腳本,期望腳本目前設計爲接收文件路徑,打開該文件,讀取信息並使用該信息。如何將Perl數組傳遞給Expect腳本?

相反,我想將Perl數組傳遞給包含所有信息的期望腳本。這裏存在我的問題:我一直在努力弄清楚expect腳本如何處理數組作爲參數並將該參數轉換爲有用的參數。

Perl的例子:

my $expectCmd = "expect.sh 300 $vmIp $vmPort $pass @configInfo"; 
system($expectCmd); 

expect腳本:

set ip [lindex $argv 1] 
set port [lindex $argv 2] 
set pass [lindex $argv 3] 

在這一點上我不知道怎麼@configInfo陣列中的閱讀和使用它。我嘗試了upvar,數組集,for-loops,foreach循環,乞求,懇求和賄賂的各種方法。到目前爲止沒有任何工作。

最終目標是將@configInfo數組一行一行地發送到一個文件。基本上,我想數組的每個索引是文件中的行 - 如果它是Perl的我只想:

foreach my $line (@configInfo) { 
    print FILE $line; 
} 

如果有人在傳球陣列體驗到期待腳本,然後拆包其使用的內容我會非常感謝迴應。非常感謝!

+0

您是否嘗試過打印'$ expectCmd'變量並確認其格式正確。數組中的項目可能沒有間隔地相互追加。 – Joshua

+0

嗨@Joshua - 我確信expect命令被調用,並且我確信所有的變量(ip,port和pass)都被正確傳遞。最後一個變量數組是我的問題:我不知道如何正確地傳遞它,或者一旦將它傳遞給expect腳本,如何在expect腳本本身內正確使用數組參數。 –

回答

2

您應該使用的system多參數版本:

system('expect.sh', 300, $vmIp, $vmPort, $pass, @configInfo); 

而且在期待,你會寫(與最近預計)

set config_info [lassign $argv num ip port pass] 

如果你希望不知道lassign命令,請執行此操作

set num [lindex $argv 0] 
set ip [lindex $argv 1] 
set port [lindex $argv 2] 
set pass [lindex $argv 3] 
set config_info [lrange $argv 4 end] 

爲了實現您的最終目標

set fh [open some.file.name w] 
puts $fh [join $config_info \n] 
close $fh 
+0

有一箇舊的Tcl沒有'lassign'的習慣用法:'foreach {num ip port pass} $ argv break' - 這會將argv列表的前4個元素存儲到命名變量中,並且break會停止循環,因此循環只有一次迭代。 –

+0

非常感謝您的回覆。我能夠使用它的一部分來最終解決我的問題。我真的很感謝你的幫助! –

相關問題