2011-09-18 98 views
1

現在我有以下Perl代碼Perl的IF語句問題

my $tmpl1="download1_video.html" 
if $file->{file_name}=~/\.(avi|divx|mkv|flv|mp4|wmv)$/i; 
$tmpl1||="download1.html"; 

所以它的檢查,看是否該文件是視頻,如果是這樣它,它引導到某一頁。雖然我只是想知道我怎麼能在裏面的if語句添加其他檢查,如果擴展名是.MP3,如果是其射向download1_audio.html

謝謝! :)

+3

順便說一句,我的'...如果...;'是不確定的行爲。 – ikegami

回答

4
if ($file->{file_name} =~ /\.(avi|divx|mkv|flv|mp4|mp3|wmv)$/i) 
{ 
    if ($1 eq "mp3") 
    { 
     # mp3 stuff 
    } 
    elsif ($1 eq "mp4") 
    { 
     # mp4 stuff 
    } 
    else 
    { 
     # all other file types 
    } 
} 
else 
{ 
    # It didn't match 
} 

一個更奇特的方式是創建一個由您的文件類型提前鍵入您的下一頁所需的信息的散列;我猜的文件名?

my %pageHash = ("mp3" => "mp3Page.html", "divx" => "divxPage.html", ...); 
... 
$file->{file_name} =~ /\.(.*)$/i; 
if (exists $pageHash{$1}) 
{ 
    $page = $pageHash{$1}; 
} 
else 
{ 
    # unknown file extension 
} 
+0

但wheres視頻的東西發生在這種情況下 –

+0

您的「mp3」測試總是錯誤的。 – mange

+0

Doh!是的,這將有助於在模式中使用mp3。編輯 –

5
if ($file->{file_name} =~ m/\.(avi|divx|mkv|flv|mp4|wmv)$/i){ 
    ## Download video 
} 
elsif($file->{file_name} =~ m/\.(mp3)$/i){ 
    ## Download Audio 
} 

這是你需要什麼?

+0

是elsif'確實比較好,然後查詢擴展兩次,但'.'應該用'\ .' – Itamar

+0

@Itamar代替:對,沒錯。我認爲,雖然複製粘貼正則表達式的問題,逃生經營者錯過了:P – Arunmu

1

已經剛剛被燒燬此,我必須告訴你反對聲明變量,有條件的改性劑。如果條件不成立,它會運行的其他子句的一部分,這意味着你是而不是聲明$tmpl1,但由於它已經通過嚴格,所以它允許你分配一個未定義的位置在內存中。

有做你的前身是在這裏做一個更安全的方式,可又說明了一個解決方案。

my $tmpl1 
    = $file->{file_name} =~ /\.(avi|divx|mkv|flv|mp4|wmv)$/i 
     ? 'download1_video.html' 
     : $file->{file_name} =~ m/\.mp3$/i 
      ? 'download1_audio.html' 
      : 'download1.html' 
    ; 

因此,

  1. $tmpl1總是宣稱
  2. $tmpl1總是被分配一個值
+0

我會建議在格式化三元時遵循此建議。 http://books.google.com/books?id=gJf9tI2mytIC&lpg=PP1&dq=perl%20best%20practices%20ternary&pg=PT55#v=onepage&q&f=false測試/動作表結構,使他們更容易比傳統的級聯閱讀選擇。 – Schwern

+0

@Schwern,我通常使用表格結構,但條件如此之長時不會。 – Axeman

+0

縮短條件。 https://gist.github.com/1237023長期條件是可讀性紅旗。 – Schwern