J'essaie d'écrire un interligne pour créer un hachage à partir de la sortie de la liste d'interfaces hôte-hôte de VirtualBox. Il ressemble à ceciAccès à la taille du tableau des résultats dans l'appel chaîné
Name: vboxnet0
GUID: 77777777-6666-4444-8888-020227202302
DHCP: Disabled
IPAddress: 192.168.42.1
NetworkMask: 255.255.255.0
IPV6Address:
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType: Ethernet
Status: Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet0
Name: vboxnet1
GUID: 77777777-6666-4444-8888-020227202301
DHCP: Disabled
IPAddress: 172.16.0.1
NetworkMask: 255.255.255.0
IPV6Address:
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:01
MediumType: Ethernet
Status: Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet1
J'ai essayé:
Hash[*`VBoxManage list hostonlyifs`.split("\n").reject(&:empty?).collect {|s| s.split(/:\ */)}.flatten(1)]
Le résultat est:
=> {"Name"=>"vboxnet1", "GUID"=>"786f6276-656e-4174-8000-0a0027000001", "DHCP"=>"Disabled", "IPAddress"=>"172.16.0.1", "NetworkMask"=>"255.255.255.0", "IPV6Address"=>"IPV6NetworkMaskPrefixLength", "0"=> "HardwareAddress", "0a"=>"00", "27"=>"00", "00"=>"01", "MediumType"=>"Ethernet", "Status"=>"Up", "VBoxNetworkName"=>"HostInterfaceNetworking-vboxnet1"}
À peu près ce que je voulais, mais seulement pour la première interface. Je pensais: "Ok, découpez le tableau en deux et convertissez chaque moitié en hash!".
Mon problème est de savoir comment obtenir la taille du tableau renvoyé par la méthode aplatie et l'utiliser dans le paramètre de la méthode de découpe sans l'affecter à une variable, etc.
je veux dire quelque chose comme:
`VBoxManage list hostonlyifs`.split("\n").reject(&:empty?).collect {|s| s.split(/:\ */)}.flatten(1).slice(0..>>>how_to_access_result_object_of_flatten_here<<<.size/2)
Je ne suis pas connu en Ruby désolé si la question est tout simplement évident, mais j'ai essayé beaucoup de recherche sur Google en vain.
EDIT: L'expression rationnelle pour split
dans le champ? Closure/lambda? passé à collect
n'est pas correct, car il renvoie une seule chaîne (devrait être deux pour la conversion de hachage au travail) si après le deux-points il n'y a que des espaces qui est le cas pour la ligne commençant par IPV6Address:
(non visible dans l'exemple). Je l'ai changé pour split(/:\ /)
et maintenant cela fonctionne. L'espace est nécessaire car l'utilisation de deux-points diviserait également l'adresse MAC.
Je ne comprends pas le problème «No tel fichier ou répertoire», je ne peux pas le produire sur ma machine. L'appel à un programme et obtenir sa sortie est exactement ce que je veux. Pour la partie de séparation, voir l'édition de la publication. – frigo
Je ne sais pas pourquoi je pensais que les accolades n'étaient pas prévues - il est clair à la deuxième lecture qu'elles l'étaient. –