There are a couple ways you could go with this. One would be to create a hash of arrays. So the hash key '111' would point to an array containing 'on', '10.1.1.1', and '12.1(SAG1)', for example.
However, since you said some keys may have multiple values for some positions, that may be too restrictive. So another method would be to create a hash of hashes, keying the secondary hashes with whatever keys fit your data. For example:
my %hoh = ( '111' => { switch => 'on',
ip => '10.1.1.1',
version => '12.1(SAG1)'},
'222' => { switch => 'off',
ip => '12.1.1.1',
version => '12.4(FCL5)'},
'333' => { switch => 'null',
ip => '13.1.1.1',
version => '12.1(5)'},
);
# $hoh{333}{switch} = 'null';
By doing it this way, it doesn't matter if a key doesn't have a 'switch' value, for instance; it won't throw off the rest of the array. And if a particular sub-key may have multiple values, you can give it an array of its own, like so:
'333' => { switch => 'null',
ip => ['13.1.1.1','13.2.2.2','13.3.3.3'],
version => '12.1(5)'},