2011-01-13 5 views
3

良い一日、サブ書き込みや文字列の連結

私は突然、Perlを知るために必要な、と私は数年前に、これらの分野で手を出しているのに、私は完全に失われているように見えます。 Haskell/Javaプログラマにとって、これらのすべての非構造化型は、神経に乗ることができます。

しかし、私はこれを書いています。これは、単一行の文字列を取り、それらを単一の複数行の文字列に連結することになっています。sub私はそうのようにそれを持っていた:

sub unlines { 
    my (@lines) = @_; 
    my $str = ""; 
    foreach $line (@lines) { 
     $str = join $str, chomp($line), "\n"; 
    } 
    return $str; 
} 

そして私は、もちろん、それをテストしたかった:

print unlines(("GET/http1.1", "Host: localhost", "")); 

そして事の結果

000 

改行がたくさんあります。私はそれがなぜなのか全く分かりません。誰でも私を助けて、おそらく、これらの議論がどのようにしてPerlで動作するかを説明することができますか? @_shiftのようなもので作業するのは非常に面白いと思われますが、タイピングは悪夢です。

お寄せいただきありがとうございます。

+1

は、我々は仕事を切り替えることができます見ることができますか?私は、Perlだけのことを学んだ後、C++で多くの作業をしなければならなかったので、constの正確さやその他の種類の厳しいP-I-T-A問題に苦しんでいます。 – DVK

+0

私はちょうどタイプを得るために 'ref'を発見しましたが...ああ、これはひどいことになるでしょう。私はこれ以上C++を好むだろう。 Heck、さらにはC – Lanbo

答えて

7

あなたの問題はchompの仕組みにあります。 chompされた変数を返さず、削除された文字数を返し、変数をインプレースで変更します。

だから、最初にムシャムシャ食べると後で参加、次のように...

C:\temp>cat test.pl 
my @lines = ('abc','def'); 
chomp @lines; 
print join "\n",@lines; 

C:\temp>test.pl 
abc 
def 
C:\temp> 

万全を期すために、ここに)どのようにあなたのunlines(だが

sub unlines { 
    my @lines = @_; 
    chomp @lines;  
    return join "\n", @lines; 
} 
+0

'chomp @ _'は、サブ変数の範囲外の引数変数に影響しますか? – Lanbo

+0

@スカン - そうです。私は新しい変数を導入するために私の答えでunlines()ルーチンを修正しました。そうすれば、サブ変数は文字列リテラルで動作します(そうでなければサブ関数ではchompできません)。 –

+0

ありがとう!あなたは私がそれをたくさん理解するのを手伝った。 – Lanbo