2013-02-05 152 views
2

我有以下Perl代碼來提示用戶是/否回答。如果用戶輸入除yes/no以外的任何內容,請繼續提示。沒有其他詞是可以接受的。我不知道爲什麼這個代碼不起作用。我測試回答「noooooo」,我期待它再次提示,但它不會進入while循環。perl確切字符串匹配

任何人都可以在這裏找到我的錯誤嗎?

@files = A, B, C; 

foreach $c (@files) { 
    if (-e $c ) { 
    print " $c already exists. Do you want to overwrite? (yes or no): "; 
    chomp ($file_yes_no = <STDIN>); 

    while ($file_yes_no !~ m/yes{1}|no{1}/i) { 
     print "$c already exists. Do you want to overwrite? (yes or no): "; 
     chomp ($file_yes_no = <STDIN>); 
    } 

    if ($file_yes_no =~ m/yes/i) { 
     if (system ("cp -f /home/old_path/ /home/new_path/ == 0) { 
      print "$c successfully copied; 
     } else { 
      die "Error: Copy failed, Check the message above"; 
     } 
    } 
else { print "No files copied\n; } 
+2

使用'File :: Copy'複製文件。 '使用File :: Copy qw(copy);拷貝($ src,$ dest)或者死掉$ !;' – TLP

+0

'do {print ...; chomp ...}而條件;'。更好的是,http://p3rl.org/IO::Prompt – ysth

+1

你是否在使用'use warnings;嚴格使用;'? – chepner

回答

6

我只是使用字符串相等運算符eq而不是正則表達式。

if($file_yes_no eq 'yes') ... 

如果我想不區分大小寫,我會先用lc轉換爲小寫。

與你的正則表達式的問題是它會愉快地匹配任何字符串包含字母yes順序。如果你願意,你可以像這樣匹配字符串的開始和結束:

if ($file_yes_no =~ m/^yes$/i) ... 

但我個人更喜歡第一個選項。

哦,我錯過了第一部分......嗯。同樣的交易,如果你必須使用正則表達式。

m/^(yes|no)$/i 

再次我會更傾向於避免正則表達式

+0

感謝您的回答。我嘗試了^和$,它的工作。我嘗試了「ne」而不是!〜,但它不起作用 - 當我回答「nooooo」時,它仍然跳過...注意到那裏的OR ...是否正確? while($ file_yes_no ne「yes」|| $ file_yes_no ne「no」){ – NewBie

+3

不,您應該使用'&&'。原因是它總是*不是一件事,或者不是另一件事。 – paddy

+0

啊!傻我!謝謝! – NewBie

3

你應該使用下面的Perl的正則表達式匹配只或yesno(不區分大小寫):

m/^(yes|no)$/i 

對於僅是,使用:

m/^yes$/i 
+0

使用'\ A'和'\ z',而不是'^'和'$',或者您也會與其他字符串匹配(例如'「yes \ n」') – ysth

+2

@ysth, 'STDIN'。多行輸入不會發生。 – 2013-02-05 10:54:53

0

因爲你是使用正則表達式。你可以寫正則表達式匹配字符串的開頭或結尾......像這樣:

while($file_yes_no !~ /^(yes|no)$/) { 

^$是開始和結束的字符串。你也可以省略m

或者你可以只檢查值明確:

while($file_yes_no ne "yes" and $file_yes_no ne "no") { 

而且你在你的系統命令一個錯字,但我假設只是複製在這裏。你真的不應該分支出殼。看看File::Copy它給你一個copy函數

+4

你應該更加小心:'「yesss!」 =〜/^yes | no $ /'是真的。 – mvp

+0

@mvp你是對的......需要括號。我正在更新 – Cfreak