在《Ruby基础教程》中,作者为了详细说明对文本的操作举了一个非常生动的例子。我在学习的时候有一些地方不太理解,标记如下,与大家共勉。
Encoding.default_external = Encoding.find('utf-8')
pattern = Regexp.new(("(.{0,10})("+ARGV[0]+")(.{0,10})").to_s.encode('utf-8'))
filename = ARGV[1]
count = 0
File.open(filename) do |file|
file.each_line do |line|
line.scan(pattern) do |s|
prefix_len = 0
s[0].each_char do |ch|
if ch.ord < 128
prefix_len += 1
else
prefix_len += 2
end
end
space_len = 20 - prefix_len
puts "#{" "*space_len}#{s[0]}<<#{s[1]}>>#{s[2]}"
count += 1
end
end
end
puts "count: #{count}"
1.关于正则表达式
Ruby中定义了sub,gsub和scan三个方法来接收正则表达式,上面示例中使用了scan方法。
2.关于ch.ord方法
可以获取字符编码的码位。本例中,由于码位小于 128 时即为 ASCII 码,这时将长度加 1,除此以外的情况下则加 2,这些都是为了确定空白个数 space_len
以确保 20 个字符。然后再在 s[0]
之前留出与字符数相应的空白,这样输出结果就整齐多了。