2013-05-27 21 views
1

如何使用Perl函數返回布爾值和字符串?如何在Perl中用字符串返回false?

例如,我使用正則表達式來查找字符串中的某些內容。如果找到,則返回true並將值賦給$ msg,否則返回false並將另一個值賦給$ msg。

現在我想通過「return($ result,$ msg);」返回$ result(boolean)和$ msg(String),並且它的驗證工作。我想知道這樣做是好事還是有更好的辦法?我不想讓其他人在查看我的代碼時感到困惑。

use constant { true => 1, false => 0 }; 
my $output = "hello world"; 
my $msg; 
my $result; 

sub is_string_found 
{ 
    if ($output =~ /hello/;) 
    { 
     $msg = "string is found"; 
     $result = true; 
    } 
    else 
    { 
     $msg = "string is not found"; 
     $result = false; 
    } 

    return ($result, $msg); 
} 
+1

如果有一個一一對應的消息和結果,然後最好只返回布爾值,並在別處處理消息 - 一個輔助函數,如果它被使用了很多。 – muhmuhten

+1

這樣說,'true'和'false'實際上並不存在於perl中。 – muhmuhten

+0

我可能不會有找到字符串的功能,如果它找到或不是,它會決定什麼顯示的實體。通常情況下,你只需要返回true/false(或1/0或其他),然後讓調用者向上遊處理用戶決定顯示字符串的內容。 – lurker

回答

2

你在返回一個列表方面做的很好。但是,使用哈希可能值得商榷更好:

sub is_string_found { 
    my %h; 
    if ($output =~ /hello/) 
    { 
     %h = (msg=>"string is found", retval=>1); 
    } 
    else 
    { 
     %h = (msg=>"string is not found", retval=>0); 
    } 
    return %h; 
} 

%d = is_string_found(); 
print $d{msg}, "\n" if not $d{retval}; 
3

有使用常量truefalse與代碼的一些問題,除了:

  • 您聲明$msg$result以外的功能。將這些變量的可見性僅僅減少到函數將會更好。其實,你甚至不需要它們。

  • 您通過外部作用域中的變量將參數傳遞給子對象,並以相同的方式返回值。改用子例程參數和返回值。

  • 您的if條件中有錯誤的;條件。

你的個子可縮短至

sub is_string_found { 
    my ($str) = @_; 
    return 1, "string is found" if $str =~ /hello/; 
    return 0, "string is not found"; 
} 

然後,它可用於像

my ($ok, $message) = is_string_found("hello world"); 

這是最好的,最明顯的解決方案(一個Perl程序員)。


你也可以使用一個不折不扣的說法,這樣你只返回成功值:

sub is_string_found ($\$) { 
    my ($str, $out_ref) = @_; 
    if ($str =~ /hello/) { 
    $$out_ref = "string is found"; 
    return 1; 
    } else { 
    $$out_ref = "string is not found"; 
    return; 
    } 
} 

return沒有值返回undef在標量上下文,在列表上下文空列表。然後,它可以調用像

my $ok = is_string_found "hello world", my $message; 

my $message; 
is_string_found "hello world", $message 
    or log_warning $message; 

注意:您必須聲明子之前,您第一次使用它,或者通過使用前定義它,或者把語句sub is_string_found ($\$);上方附近的腳本。

您不必使用原型(而是可以使用@_走樣行爲),但我不是特別喜歡這種解決方案的

相關問題