2009-02-14 24 views
7

Tôi đã có một đầu vào tập tin đó có các nội dung sau:Làm thế nào để chuyển đổi nội dung STDIN thành một mảng?

123\n 
456\n 
789 

Tôi muốn chạy script của tôi như vậy: script.rb < INPUT và có nó chuyển đổi các nội dung của tập tin đầu vào cho một mảng, tách trên ký tự dòng mới. Vì vậy, tôi muốn có một cái gì đó như myArray = [123,456,789]. Dưới đây là những gì tôi đã cố gắng làm và không có nhiều may mắn:

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

Tôi mong đợi điều này để in 3, nhưng tôi nhận được 15. Tôi thực sự bối rối ở đây. Bất kỳ con trỏ?

+0

oy vey. Dòng thứ ba thực sự nói rằng đặt myArray.size. Typo trong câu hỏi, không phải mã. – miketaylr

+0

@Mike: Vì vậy, hãy chỉnh sửa câu hỏi ... – womble

Trả lời

20

Bạn muốn

myArray = $stdin.readlines 

Điều đó sẽ nhận được tất cả $ stdin vào một mảng với nhập một mảng trên mỗi dòng đầu vào.

Lưu ý rằng đây là ngoạn mục không hiệu quả (bộ nhớ khôn ngoan) với các tập tin đầu vào lớn, vì vậy bạn tốt hơn bằng cách sử dụng một cái gì đó như:

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

thay vì

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

Vì doesn cựu không cấp phát bộ nhớ cho mọi thứ ở phía trước. Hãy thử xử lý tệp nhật ký nhiều gigabyte theo cách thứ hai để xem hiệu suất hoán đổi của hệ thống của bạn tốt như thế nào ... < grin>

1

gì bạn đang theo đuổi là sử dụng$stdin thay vì $ stdin.to_s

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

ruby -e 'p $stdin.to_s' 
"#<IO:0x7fc7cc578af0>" 
1

STDIN.lines rất lười, nhưng cung cấp cho bạn một cấu trúc giống như mảng để truyền đi và lặp lại kết thúc.

Các vấn đề liên quan