8

次の内容のファイル INPUT があります。

123\n
456\n
789

script.rb < INPUT のようにスクリプトを実行し、INPUT ファイルの内容を配列に変換して、改行文字で分割します。したがって、myArray = [123,456,789] のようなものがあります。これが私がやろうとしたことであり、あまり運がありません:

myArray = STDIN.to_s
myArray.split(/\n/)
puts field.size

これが 3 を出力することを期待していますが、15 を取得しています。ここで本当に混乱しています。ポインタはありますか?

4

3 に答える 3

21

あなたがしたい

myArray = $stdin.readlines

これにより、入力行ごとに 1 つの配列エントリを持つ配列にすべての $stdin が取得されます。

これは、大きな入力ファイルでは(メモリに関して)非常に非効率的であるため、次のようなものを使用する方がはるかに優れていることに注意してください。

$stdin.each_line do |l|
  ...
end

それ以外の

a = $stdin.readlines
a.each do |l|
  ...
end

前者は事前にすべてのメモリを割り当てないためです。数ギガバイトのログ ファイルを 2 番目の方法で処理して、システムのスワップ パフォーマンスがどれほど優れているかを確認してください... <にやにや笑い>

于 2009-02-14T04:55:51.107 に答える
1

あなたが求めているのは、 $stdin.to_s の代わりに使用しています $stdin

ruby -e 'p $stdin.readlines.size' < INPUT
3

ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
于 2009-02-14T03:53:04.720 に答える