Это специальная переменная $.ушел от Руби? - PullRequest
0 голосов
/ 10 июня 2019

При обработке файла я использовал специальную переменную $., чтобы получить последний читаемый номер строки.Например, следующая программа

require 'csv'

IFS=';'
CSV_OPTIONS = { col_sep: IFS, external_encoding: Encoding::ISO_8859_1, internal_encoding: Encoding::UTF_8 }

CSV.new($stdin, CSV_OPTIONS).each do |row|
  puts "::::line #{$.} row=#{row}"
end

должна создать дамп CSV-файла (где поля разделяются точкой с запятой, а не запятой, как в нашем случае), и перед каждой строкой выводится строкачисло.

После обновления Ruby до

_ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-cygwin]_

строки по-прежнему сбрасываются, но номер строки всегда отображается как ноль.

Что меня поразило, так это то, что Ruby Wiki по специальным переменным Ruby, хотя в списке по-прежнему есть $., больше не имеет описания этой переменной.Поэтому мне интересно: эта переменная исчезла или она никогда не должна была работать с классом csv и просто работала для меня случайно в более ранних версиях?

1 Ответ

1 голос
/ 10 июня 2019

Я не уверен, почему $. не работает для вас, но это также не лучшее решение здесь. Когда это работает, $. дает вам количество строк, прочитанных из ввода, но поскольку поля в кавычках в CSV-файле могут занимать несколько строк, число, которое вы получите от $., не всегда будет числом строк , которые были прочитаны.

Как уже упоминалось выше, each_with_index является хорошей альтернативой:

CSV.new($stdin, CSV_OPTIONS).each_with_index do |row, i|
  puts "::::row #{i} row=#{row}"
end

Другая альтернатива - CSV#lineno:

LINENO ()

Номер строки последней строки, прочитанной из этого файла. Поля с вложенными символами конца строки не влияют на этот счет.

Вы бы использовали это так:

csv = CSV.new($stdin, CSV_OPTIONS)
csv.each do |row|
  puts "::::row #{csv.lineno} row=#{row}"
end

Обратите внимание, что each_with_index начнет отсчет с 0, тогда как lineno начнется с 1.

Вы можете увидеть оба подхода в действии на repl.it: https://repl.it/@jrunning/LoudBlushingCharactercode

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...