以下代码中缺少一些东西。
hostnames = []
ip_addrs = []
hw_addrs = []
File.open("/etc/dhcp/dhcpd.conf", "r").each_line do |line|
unless line.match('#') # Make sure the line is not commented
if line.match("host-name")
hostname = line.scan(/"([^"]*)"/) # extract the Hostname
elsif line.match("fixed-address")
ip_addr = line.scan(/(\S*);/) # Extract IP addr
elsif line.match("ethernet")
hw_addr = line.scan(/(\S*);/) # Extract the HW address
end
end
hostnames + hostname.to_a if hostname # Protect against `nil' values
ip_addrs + ip_addr.to_a if ip_addr # Same
hw_addrs + hw_addr.to_a if hw_addr # Same
end
puts hostnames.inspect # Should be a list of hostnames...
这应该使用dhcpd.conf
文件中的值填充数组。
如果我打印File.open.each_line
块内的值,那么我将获得STDOUT的完整列表。当我试图获取块之外的值时,我得到空数组。
我认为该块会生成我的变量的副本并对其进行处理,但它们不会从块中传回。我不确定内部是如何工作的,只是一个猜测。
答案 0 :(得分:1)
如果要向数组中添加内容,则需要使用正确的运算符:
hostnames += hostname.to_a if hostname
您正在做的是创建一个临时结果并将其丢弃:a + b
不是永久性修改,但a = a + b
是简称a += b
。
通常使用<<
将单个元素添加到数组中,它可以避免创建新数组,只是附加到现有数组。例如:
hostnames << hostname if hostname
这通常就足够了。将所有内容转换为数组只是为了连接它们是浪费,除非你实际上一次附加多个值。
答案 1 :(得分:1)
将hostnames + hostname.to_a
更改为hostnames << hostname.to_a
在当前版本的代码中,您实际上并未将hostname
添加到hostnames
数组中。 <<
将hostname
元素推送到hostnames