0

次のコードに欠けているものがあります。

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 に出力されます。ブロック外の値を取得しようとすると、空の配列が取得されます。

ブロックは私の変数のコピーを生成し、それらで動作すると思いますが、それらはブロックから戻されません。内部がどのように機能するかはわかりません。ただの推測です。

4

2 に答える 2

1

配列に何かを追加したい場合は、適切な演算子を使用する必要があります。

hostnames += hostname.to_a if hostname

あなたがしているのは、一時的な結果を作成してそれを破棄することです:a + bは永続的な変更ではありませんa = a + bが、短縮形がa += b.

通常<<、単一の要素を配列に追加するために使用します。新しい配列の作成を回避し、既存の配列に追加するだけです。例えば:

hostnames << hostname if hostname

それは一般的に十分です。一度に複数の値を実際に追加しない限り、連結するためだけにすべてを配列にキャストするのは無駄です。

于 2013-08-07T19:29:13.197 に答える
1

hostnames + hostname.to_aに変更hostnames << hostname.to_a

hostnameコードの現在のバージョンでは、実際にはhostnames配列に追加しません。要素を<<プッシュしますhostnamehostnames

于 2013-08-07T19:31:49.353 に答える