2012-01-07 6 views
3

は、私はこの$ IPは「スペースで区切られた単語」であるならば、私は「言葉」を取得するためにスプリットを使用する必要があるだろういつものperlでは、スペースや改行があるまでSTDINから読み込む方法は? Perlで

chomp(my $ip = <>); 

を使用しての唯一のよく知っている、「分離しました」、 "by"と "space"である。

最初に単語を単語で読み取る方法はありますか?

答えて

6

入力レコードセパレータ$/をスペースに設定すると、「単語ごとに」読み込まれます。結果はカウンター直感的であることがわかりますので、はあなたが欲しいものを慎重に考えてください

例えば試してみてください。

perl -nwe 'BEGIN { $/ = " ";} print "Line: $_"' 

それは標準入力から読み込み、そしてあなたに戻って、それを印刷しますが、一度に一つの単語ます。しかし、注意しなければならないように改行(ENTERを押す)は依然としてプロセスの不可欠な部分です。

$/はスマートではありません。入力レコードを区別するために使用するのは単なる文字ですが、STDIN以外にも他の多くのものに影響を与えますので、使用するとあなたを混乱させる可能性が高くなります。もちろん、あなたはそれをローカルで使っていない限り、それをあなたが望むところで正確に使用します。

{ # make this part lexically scoped 
    local $/ = " "; # use local version of $/ 
    while (<>) { 
     chomp(my $ip = $_); # note that chomp removes space instead 
    } 
} # End of scope, $/ is back to normal 
4

入力レコードセパレータ$/をスペースに変更できます。その場合には

#!/usr/bin/perl 
use strict; 

open(my $in, "<", "data.txt") or die "can't open input: $!"; 
local $/ = " "; 
while(<$in>) { 
    chomp; 
    print "\'$_\'\n"; 
} 

を(私は最後まで読んで、これを行うことはお勧めしません)、入力は、スペースではなく、改行で区切られます。同様に、CHOMPレコードセパレータの値を使用し、これは(複数行の場合)あなたを与える:行を終了

  • Wordは、次の行を開始するものから分離されません。あなたはスペースで行を終わらせることで回避することができますが、それは厄介です。
  • まだchompによって削除されない改行文字を取り除く必要があります。

したがって、最終的に1行以上ある場合は、デフォルトのレコード区切り記号を保持し、行を単語に分割する方がよいでしょう。

+1

注:常に警告を使用することを習慣にする必要があります。二重引用符で囲まれた文字列の中で一重引用符 ''をエスケープする必要はありません(またその逆もあります)。また、 'local'をこのように使用することは、このローカル変数のスコープがグローバルなので、実用的ではありません。 – TLP

+0

localはファイルに対してローカルにします。これはまさに意図されたものです。しかし、それをブロックで囲むことは、より良い方法です。私は同意します。 – voidengine

+0

ファイルスコープは、複数のファイルがある場合にのみ意味があります。 –

関連する問題