2010-12-18 15 views
2

私は自分自身でPerlを教えようとしています。私はおそらく非常に単純な問題に答えるためにどこでも探しました。私は単語の文字の数を数えるために呼び出すサブルーチンを定義しました。もし私が次のように書いたら:初心者がPerlサブルーチンを呼び出す

$sentence="This is a short sentence."; 

@words = split(/\s+/, $sentence); 

foreach $element (@words) { 
    $lngths .= length($element) . "\n"; 
} 
print "$lngths\n"; 

それは魅力的です。しかし、それをサブルーチンにまとめると、分割は入力を分割せず、代わりに単一の入力として文全体を数えます。ここでは、私は、サブルーチンを定義しています方法は次のとおりです。

sub countWords { 
    @words = split(/\s+/, @_); 
    foreach $element(@words) { 
     $lngths .= length($element) . "\n"; 
    } 
    return $lngths; 
} 

私が読んだと私はこのことを相談してきたテキストが動作するはずですが、それはないすべてのページから。

ありがとうございます!

+5

あなたはPerlののあなたの学習を促進するためにすぐにできる最善のことは、*必ず* '使用を含めることです:あなたが行うことができ、別々の単語にあなたの文字列を分割することなく、非空白文字をカウントする 厳しい;すべてのファイルの一番上にある警告を使用します。 – Ether

答えて

13

問題は@_の使用です。これは配列ですが、スカラーのようにアクセスしています。

@_には、この機能のすべてのパラメータが含まれています。それが見える方法、あなたはそれに文を渡しています、そしてあなたはそれを分割したいと思います。ここでそれを行うには、いくつかの可能な方法があります。

@words = split(/\s+/, $_[0]); 

「機能への最初のパラメータを取り、それを分割」を意味しています。

または:ほとんど同じですが、読みやすくするための中間変数を使用しています

my $sentence = shift; 
@words = split(/\s+/, $sentence); 


は実際には、何をやっていることは次のとおりです。

@words = split(/\s+/, @_); 

を意味し、どの:

  • @_の要素を(意味スカラーとして@_を解釈します1、この場合)
  • 文字列"1"をwhitespa CE

配列を返します。

@words = ("1"); 
+0

D'oh!それは意味がある、私は本当に明確化を感謝します。 –

3

あなたはネイサンからの回答の主要部分を持っています。残りの観察では、ほとんどの人が句読点や数字を文字としてカウントしませんが、サブルーチンはそれを行います。

sub countLetters 
{ 
    my($sentence) = @_; 
    $sentence =~ s/[^[:alpha:]]//gm; 
    return length($sentence); 
} 

ここでのキーポイントはmy句の変数リストを括弧で囲んである:私はおそらくと行くと思います。一般的には、サブに渡されたいくつかの引数を持っている、そしてあなたは、このようなあなたのサブルーチン内の変数にそれらの(コピー)を割り当てることができます。括弧は「リストコンテキスト」を提供しての最初の要素ことを保証

my($var1, $var2, $var3) = @_; 

@_$var1にコピーされ、2番目は$var2にコピーされます。括弧がなければ、スカラーコンテキストがあり、配列がスカラーコンテキストで評価されるとき、返される値は配列内の要素の数です。したがって:

my $var1, $var2, $var3 = @_; 

可能性(三つの値は、サブルーチンに渡されたため)$var1に3を割り当て、$var1$var2う両方undefあろう。

正規表現は、文字列からアルファベット以外の文字をすべて削除します。文字の数は残っているものの長さです。

0

文字を数えるとき、perlの音訳演算子が便利です。

$lngths = $sentence =~ tr/ \t\f\r\n//c; 
関連する問題