paddy3118 has asked for the wisdom of the Perl Monks concerning the following question:
I am a much better Python programmer and have the following data structure that classifies failing tests by their overall error, which could be something like "Vehicle packet not transferred"; and a more specific error type which could be something like "Ariel Atom sent but not received".
To categorize these tests I prototyped using the following type of nested list within dict within dict Python data structure:
In [1]: data = [ row.split() for row in '''\
...: test1 ERROR1 ERROR1:TYPE1
...: test2 ERROR1 ERROR1:TYPE2
...: test3 ERROR2 ERROR2:TYPE1
...: test4 ERROR1 ERROR1:TYPE1
...: test5 ERROR2 ERROR2:TYPE1
...: test6 ERROR2 ERROR2:TYPE2'''.split('\n')]
In [2]: data
Out[2]:
[['test1', 'ERROR1', 'ERROR1:TYPE1'],
['test2', 'ERROR1', 'ERROR1:TYPE2'],
['test3', 'ERROR2', 'ERROR2:TYPE1'],
['test4', 'ERROR1', 'ERROR1:TYPE1'],
['test5', 'ERROR2', 'ERROR2:TYPE1'],
['test6', 'ERROR2', 'ERROR2:TYPE2']]
In [3]: nested = {}
In [4]: for file, error, errortype in data:
...: nested.setdefault(error, {}).setdefault(errortype, []).app
+end(file)
...:
In [5]: nested
Out[5]:
{'ERROR1': {'ERROR1:TYPE1': ['test1', 'test4'], 'ERROR1:TYPE2': ['test
+2']},
'ERROR2': {'ERROR2:TYPE1': ['test3', 'test5'], 'ERROR2:TYPE2': ['test
+6']}}
In [6]: for error, errortypes in sorted(nested.items()):
...: print('\n##', error)
...: for errort, tests in sorted(errortypes.items()):
...: print('#', errort)
...: print(', '.join(tests))
...:
## ERROR1
# ERROR1:TYPE1
test1, test4
# ERROR1:TYPE2
test2
## ERROR2
# ERROR2:TYPE1
test3, test5
# ERROR2:TYPE2
test6
In [7]:
Could someone convert this to Perl for me so that I can learn how to manipulate this type of data structure in Perl?
I have read some of the tutorials on lists within hashes but it was new to me and I don't think I'm ready to try and extend them to handle another outer level of hash.
Thanks in advance- Paddy.
Re: List in hash in hash example from Python original
by jeffa (Bishop) on Apr 16, 2015 at 21:57 UTC
|
#!/usr/bin/env perl
use strict;
use warnings;
my $data = "test1 ERROR1 ERROR1:TYPE1
test2 ERROR1 ERROR1:TYPE2
test3 ERROR2 ERROR2:TYPE1
test4 ERROR1 ERROR1:TYPE1
test5 ERROR2 ERROR2:TYPE1
test6 ERROR2 ERROR2:TYPE2
";
my @data = map [ split /\s+/, $_ ], split "\n", $data;
my %nested;
for (@data) {
my ($file, $error, $type) = @$_;
push @{ $nested{$error}{$type} }, $file;
}
for my $error (sort keys %nested) {
print "\n##", $error, $/;
for my $type (sort keys %{ $nested{$error} }) {
print '#', $type, $/;
print join( ', ', @{ $nested{$error}{$type} } ), $/;
}
}
__DATA__
outputs:
## ERROR1
# ERROR1:TYPE1
test1, test4
# ERROR1:TYPE2
test2
## ERROR2
# ERROR2:TYPE1
test3, test5
# ERROR2:TYPE2
test6
jeffa
L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)
| [reply] [d/l] |
|
|
Thank you Jeffa!
I shall try this out and adapt it for my full problem later today but this is so sweet. Someone else pointed me at perldoc.perl.org/perldsc.html and perldoc.perl.org/perllol.htm, which I was reading but finding hard to turn into a working example. They should however allow me to fully understand your reply.
Thanks again Jeffa and PerlMonks!
| [reply] |
|
|
I am thinking that the above question might be formed into a task for the Rosetta Code site?
If I do then I will make sure to announce it here and ask you if you would like to contribute (or allow someone to add your solution with attribution), to the tasks examples.
- Paddy.
| [reply] |
|
|
Perhaps. I glanced through the categories from the link you provided and i found no applicable parent category (i was looking for Data Structures, Complex Data Structures, Tuples, etc. ... no luck) As it stands, your question is too specific in how you want to organize your data into Hashes and Arrays. One really needs to only understand how Hashes can store Arrays and Hashes, and how Arrays can store Hashes and Arrays -- the rest is combinations and variations of AoA, HoH, AoH and HoA.
So, if you want to supply some examples for Rosetta Code, then i think you will do well by first perusing perldsc and then find similar documentation for Python. Try to use very generic examples for your data structures. I think describing each of the following is more than enough: AoA, HoH, AoH, and HoA. Perhaps you can add this as a new category called "Complex Data Structures." Cheers!
jeffa
L-LL-L--L-LL-L--L-LL-L--
-R--R-RR-R--R-RR-R--R-RR
B--B--B--B--B--B--B--B--
H---H---H---H---H---H---
(the triplet paradiddle with high-hat)
| [reply] [d/l] [select] |