希望清理一个小ruby脚本

希望清理一个小ruby脚本,ruby,Ruby,我正在寻找一种更为惯用的方法来完成下面的小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 提前感谢您的建议。一种非常容易阅读的方法是只存储匹配结果,然后仅在存在匹配时打印: File.open("channels.xm

我正在寻找一种更为惯用的方法来完成下面的小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

提前感谢您的建议。

一种非常容易阅读的方法是只存储匹配结果,然后仅在存在匹配时打印:

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

一种非常容易阅读的方法是只存储匹配结果,然后仅在存在匹配时打印:

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
原件:

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
可以更改为
如果x=XYZ则放置x
,只要x出现在if语句之前当前范围的某个位置

Regexp
'(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
是多余的

使用这两个清理,可以将Regexp更改为:
%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
原件:

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
可以更改为
如果x=XYZ则放置x
,只要x出现在if语句之前当前范围的某个位置

Regexp
'(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
是多余的

使用这两个清理,可以将Regexp更改为:
%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

就个人而言,我可能只会使用POSIX
grep
命令。但是Ruby中也有
可枚举的#grep

puts File.readlines('channels.xml').grep(%r|mms://{1}[\w\./-]+|)
或者,您可以使用Ruby从Perl继承的一些文件和行处理魔法。如果您将
-p
标志传递给Ruby解释器,它将假定您传入的脚本在get。。。;结束并在每个循环结束时打印当前行。然后,如果不想打印行,可以使用
$\ucode>特殊变量访问当前行,并使用
next
关键字跳过循环的迭代:

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

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

grep -E re file

就个人而言,我可能只会使用POSIX
grep
命令。但是Ruby中也有
可枚举的#grep

puts File.readlines('channels.xml').grep(%r|mms://{1}[\w\./-]+|)
或者,您可以使用Ruby从Perl继承的一些文件和行处理魔法。如果您将
-p
标志传递给Ruby解释器,它将假定您传入的脚本在get。。。;结束
并在每个循环结束时打印当前行。然后,如果不想打印行,可以使用
$\ucode>特殊变量访问当前行,并使用
next
关键字跳过循环的迭代:

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

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

grep -E re file

或者使用
Regex.last\u match
而不是晦涩的
$&
或者使用
Regex.last\u match
而不是晦涩的
$&
谢谢您的详细帮助!我来试试你的例子。谢谢你的详细帮助,约翰!我来给你们举个例子,谢谢大家的建议。我计划给他们一次机会来帮助我理解Ruby。谢谢大家的建议。我计划给他们所有人一次机会来帮助我理解Ruby。