Глядя, чтобы очистить небольшой скрипт ruby - PullRequest
0 голосов
/ 14 апреля 2010

Я ищу гораздо более идиотский способ сделать следующий маленький скрипт ruby.

File.open("channels.xml").each do |line|
  if line.match('(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)')
    puts line.match('(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)')
  end
end

Заранее спасибо за любые предложения.

Ответы [ 3 ]

3 голосов
/ 14 апреля 2010

оригинал:

File.open("channels.xml").each do |line|
  if line.match('(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)')
    puts line.match('(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)')
  end
end

можно изменить на это:

m = nil
open("channels.xml").each do |line|
  puts m if m = line.match(%r|(mms://{1}[\w\./-]+)|)
end

File.open можно изменить только на open.

if XYZ
   puts XYZ
end

можно изменить на puts x if x = XYZ, если x произошло в каком-то месте в текущей области видимости перед оператором if.

Регулярное выражение '(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)' может быть немного изменено. Используя нотацию %rXX, вы можете создавать регулярные выражения без необходимости использовать такое количество обратных слешей, где X - это любой соответствующий символ, например ( и ) или в приведенном выше примере | |.

Этот класс символов [a-zA-Z\.\d\/\w-] (читай: от A до Z, без учета регистра, символ точки, от 0 до 9, косая черта, любой символ слова или тире) немного избыточен. \w обозначает "символы слова", то есть A-Za-z0-9 и подчеркивание. Поскольку вы указываете \w в качестве положительного совпадения, A-Za-z и \d являются избыточными.

Используя эти 2 очистки, регулярное выражение можно изменить на следующее: %r|(mms://{1}[\w\./-]+)|

Если вы хотите избежать странного m = nil колдовства, это также сработает, но менее идиоматично:

open("channels.xml").each do |line|
  m = line.match(%r|(mms://{1}[\w\./-]+)|) and puts m
end

или более длинная, но более читаемая версия:

open("channels.xml").each do |line|
  if m = line.match(%r|(mms://{1}[\w\./-]+)|)
    puts m
  end
end
1 голос
/ 14 апреля 2010

Лично я, вероятно, просто использовал бы команду POSIX grep. Но в Ruby тоже есть Enumerable#grep:

puts File.readlines('channels.xml').grep(%r|mms://{1}[\w\./-]+|)

В качестве альтернативы, вы можете использовать некоторую магию Ruby для обработки файлов и строк, унаследованную от Perl. Если вы передадите флаг -p интерпретатору Ruby, он будет предполагать, что передаваемый вами скрипт обернут в while gets; ...; end, и в конце каждого цикла он напечатает текущую строку. Затем вы можете использовать специальную переменную $_ для доступа к текущей строке и использовать ключевое слово next, чтобы пропустить итерацию цикла, если вы не хотите печатать строку:

ruby -pe 'next unless $_ =~ %r|mms://{1}[\w\./-]+|' channels.xml

В основном,

ruby -pe 'next unless $_ =~ /re/' file

эквивалентно

grep -E re file
1 голос
/ 14 апреля 2010

Один очень простой для чтения подход - просто сохранить результат совпадения, а затем печатать только при наличии совпадения:

File.open("channels.xml").each do |line|
  m = line.match('(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)')
  puts m if m
end

Если вы хотите начать умничать (и иметь менее читаемый код), используйте $&, которая является глобальной переменной, которая получает переменную соответствия:

File.open("channels.xml").each do |line|
  puts $& if line.match('(mms:\/\/{1}[a-zA-Z\.\d\/\w-]+)')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...