оригинал:
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