2

我几乎是一个 Ruby-nOOb(只有 Ruby 知识来编写一些基本的 .erb 模板或 Puppet 自定义事实)。看起来我的要求相当简单,但我无法理解它。

尝试编写一个.erb模板,它将一个文件(用空格分隔的行)读取到一个数组中,然后根据要求处理每个数组元素。这是我到目前为止得到的:

fname = "webURI.txt"

def myArray()
    #if defined? $fname
    if File.exist?($fname) and File.file?($fname)
        IO.readlines($fname)
    end
end

myArray.each_index do |i|
    myLine = myArray[i].split(' ')
    puts myLine[0] +"\t=> "+ myLine.last
end

哪个工作得很好,除了(出于明显的原因)被注释掉的行或空白行。我还想确保当(按空格)向上吐出时,该行中的字段不应超过两个;像这样的文件:

# This is a COMMENT
#
# Puppet dashboard
puppet controller-all-local.example.co.uk:80

# Nagios monitoring
nagios controller-all-local.example.co.uk::80/nagios
tac talend-tac-local.example.co.uk:8080/org.talend.admin

mng console talend-mca-local.example.co.uk:8080/amc     # Line with three fields

所以,基本上我想实现这两件事:

  1. 将行读入数组,在第一个之后剥离所有内容#
  2. 如果数字 id 超过两个,则拆分每个元素并打印一条消息

任何帮助将不胜感激。干杯!!


2002 年 2 月 25 日更新

谢谢你的帮助!

blank件事根本不起作用;抛出这个错误;但我有点不明白为什么:

未定义的方法“空白?” 对于“\n”:字符串(NoMethodError)

我得到的数组:myArray实际上是这样的(使用p而不是puts

["\n", "puppet controller-all-local.example.co.uk:80\n", "\n", "\n", "nagios controller-all-local.example.co.uk::80/nagios\n", .....     \n"]

因此,我不得不这样做来解决这个问题:

$fname = "webURI.txt"

def myArray()
    if File.exist?($fname) and File.file?($fname)
        IO.readlines($fname).map { |arr| arr.gsub(/#.*/,'') }
    end
end

# remove blank lines
SSS = myArray.reject { |ln| ln.start_with?("\n") }

SSS.each_index do |i|
    myLine = SSS[i].split(' ')

    if myLine.length > 2
        puts "Too many arguments!!!"

    elsif myLine.length == 1
        puts "page"+ i.to_s + "\t=> " + myLine[0]

    else
        puts myLine[0] +"\t=> "+ myLine.last
    end
end

非常欢迎您改进代码。干杯!!

4

1 回答 1

1
goodArray = myArray.reject do |line|
  line.start_with?('#') || line.split(' ').length > 2
end

这将拒绝以 # 开头的任何内容,或者拆分返回一个包含两个以上元素的数组,返回一个只有好项目的数组。

编辑:

对于您的内联评论,您可以这样做

goodArray.map do |line|
  line.gsub(/#.*/, '')
end
于 2013-02-24T20:58:54.857 回答