كيفية تحويل محتويات stdin إلى صفيف؟
سؤال
لدي إدخال ملف يحتوي على المحتويات التالية:
123\n
456\n
789
أريد تشغيل البرنامج النصي الخاص بي مثل ذلك: Script.rb <Input وجعله يقوم بتحويل محتويات ملف الإدخال إلى صفيف، والتقسيم على حرف السطر الجديد. لذلك، سأواجه شيئا مثل Myarray = [123،456،789]. إليك ما حاولت القيام به ولا حظ كثيرا:
myArray = STDIN.to_s
myArray.split(/\n/)
puts field.size
أتوقع أن أطبع هذا 3، لكنني أحصل على 15. أنا مرتبك حقا هنا. أي مؤشرات؟
المحلول
انت تريد
myArray = $stdin.readlines
التي سوف تحصل على جميع Stdin $ في صفيف مع إدخال صفيف واحد لكل خط من المدخلات.
لاحظ أن هذا غير فعال بشكل مذهل (الذاكرة الحكيمة) مع ملفات إدخال كبيرة، لذلك أنت أفضل بكثير من استخدام شيء مثل:
$stdin.each_line do |l|
...
end
بدلا من
a = $stdin.readlines
a.each do |l|
...
end
لأن السابق لا يخصص الذاكرة لكل شيء مقدما. حاول معالجة ملف سجل Gigabyte متعدد البدء الطريقة الثانية لرؤية مدى جودة أداء مبادلة النظام الخاص بك هو ...u003Cgrin>
نصائح أخرى
ما هي بعد هو استخدام $stdin
بدلا من $ stdin.to_s
ruby -e 'p $stdin.readlines.size' < INPUT
3
ruby -e 'p $stdin.to_s'
"#<IO:0x7fc7cc578af0>"
Stdin.lines كسول، لكنه يمنحك بنية تشبه الصفيف لتمرير وتكرار.