2012-10-03 62 views
3

我是新的Perl和學習它。我寫了一個腳本,按bash提供的方式提供按字母自動完成的腳本。如果輸入不在定義的數組中,它將輸出預定義的消息,並且如果輸入在數組中,則它將同樣運行系統命令。與正則表達式得到奇怪的錯誤'[

它運行良好,根據我的假設,但如果我只輸入[字符,它給出錯誤,我找不到它爲什麼發生。

還有一件事,假設我只鍵入沒有任何字符的tab,它不會在array中顯示預定義的命令,它只會提示。

請引導我,如果我錯了,請糾正我。

在我使用bash shell腳本之前,我們有-x選項可以在運行時進行調試,Perl有沒有這樣的選項?

我的腳本:

#!/usr/bin/perl 

use Term::Complete; 
use List::Util 'first'; 

@cmd = qw/ls uptime clear/; 
while (defined @cmd) { 

    $in = Complete('prompt', @cmd); 
    if (first { /$in/ } @cmd) { 

     system($in); 
    } 
    elsif ($in eq 'exit') { 

     `kill -9 $$`; 
    } 
    else { 

     print "Use these commands: ls uptime clear"; 
    } 
} 

錯誤,如果我輸入[:

perl tab1.pl 
prompt uptime 
12:02:31 up 3:29, 2 users, load average: 0.00, 0.00, 0.00 
prompt [ 
Unmatched [ in regex; marked by <-- HERE in m/[ <-- HERE/at tab1.pl line 8. 

BR 本

回答

10

[是正則表達式中的一個特殊字符,你必須逃避它。

如果讀取用戶的輸入,並希望爲的就是搜索,您可以使用\Q\E

/\Q$in\E/ 
+0

是的,現在解決了。但有一點是剩餘的「還有一件事,假設我只鍵入沒有任何字符的選項卡,它不顯示數組中的預定義命令,它只會提示。」 – Ben

+0

@Ben這是一個單獨的問題'Term :: Complete' –

+0

好的,我應該提出一個相同的新問題還是? – Ben

1

,如果你想插入[爲文字,你應該用反斜槓轉義( \

否則它有特殊含義regular expressions

+0

是它現在解決了。但有一點是剩餘的「還有一件事,假設我只鍵入沒有任何字符的選項卡,它不顯示數組中的預定義命令,它只會提示。」 – Ben

+0

@Ben對不起,我沒有得到你 – Serge

+0

我是說,假設我添加正常運行時間,重新啓動,在數組中清除,當我鍵入和標籤,標籤自動完成正在發生。但如果我只按沒有任何字符的選項卡,只有空白提示符來,所以而不是它,我想顯示預定義的數組內容 – Ben