2017-06-19 29 views
-1

Perl noob。Perl:從子程序返回一個數組.pm

我無法理解從.pm文件中的子程序返回數組值。

特等文件有以下幾點:

print "Enter your first and last name.\n"; 
    chomp(my $fullname = <STDIN>); #input is 'testing this' all lower case 

Jhusbands::Loginpass->check_name($fullname); 

print "$fullname\n"; 

的.pm包括以下子程序:

sub check_name { 
    my $class = shift; 
    if ($_[0] =~ /^\w+\s+\w+$/) { 
     @_ = split(/ /, $_[0]); 

      foreach $_ (@_) { 
       $_ = ucfirst lc for @_; 
       @_ = join(" ", @_); 
       print Dumper(@_) . "\n"; 
       return @_; 
      } 
     } 
} 

我取的名字,檢查它只有第一和最後一個(我會得到到後來的其他語句),拆分它,糾正情況,並再次加入.Dumper顯示最終陣列爲:

    $VAR1 = 'Testing This'; 

所以它似乎正在工作那麼遠。然而,在特等文件返回山谷爲$全稱顯示全部小寫:

    testing this 

爲什麼不採取修正大寫的變量,自卸車顯示爲最後一個數組迭代?

+0

您放棄.pl中的返回值。你需要分配一些東西。 – toolic

+0

你是從你的小組返回一個,但沒有存儲在任何地方。 –

+0

另外,'foreach $ _(@_){...}'應該替換爲'...'。 – ikegami

回答

3

你不分配返回任何東西。此外,子操縱@_它不應該這樣做,除非有偉大的和直接的advangates。它也可以簡化

sub check_name { 
    my ($class, $name) = @_; 

    if ($name =~ /^\w+\s+\w+$/) { 
     return join ' ', map { ucfirst lc } split ' ', $name; 
    } 

    return; 
} 

呼叫者

my $fullname = Jhusbands::Loginpass->check_name($name); 

print "$fullname\n" if $fullname; 

一分的回報應始終檢查,但在這種情況下更是這樣,因爲它有條件地處理輸入。

請注意,爲清楚起見,我將輸入重命名爲sub(至$name)。如果您希望保留相同的名稱,則應刪除返回值的聲明。

如果在子代碼是指通過直接寫入@_改變$fullname(和你沒有回報,這個原因),失敗,因爲具體的操作後$_[0]是沒有任何更多化名爲論據通過了。

無論如何,這樣做是非常棘手和不必要的。要直接更改參數,請將其作爲參考傳遞給它並寫入。但是,它可能會更清晰並且更不容易返回結果。


應當注意的是,上面的名字「處理」運行到與名稱的處理,標準的問題,是由於他們的各種令人困惑。如果這需要全面,那麼應該將名稱解析分派到可以處理可能的方向性的四捨五入庫(或程序)。

感謝ikegami徵求意見提出這個問題舉例,還有一個更直接的方式:

/r在V5中引入
$name =~ s/(\w+)/\u\L$1/g; 
return $name; 

。14可被寫爲

return $name =~ s/(\w+)/\u\L$1/gr; 

如果$name沒有字字符(\w)和不存在匹配該返回相同的字符串。

+0

你擊敗了我*精確*相同的解決方案一秒(除了如果'if'不匹配,我返回'$ name')++ – stevieb

+0

無論哪種方式,他們都會打破'Foo LeBlanc','Bar von Braun','Baz Hansen-Sinfield'等 – ikegami

+0

@ikegami謝謝,已添加到答案 – zdim