Not so much shorter, but avoids the 5.12 dependency:
sub occurs{
my %h;
push @{ $h{ $_[$_] } }, $_ for 0 .. $#_;
return \%h
};;
pp occurs( 2, 1, 3, 4, 3, 4, 4, 5 );;
{ 1 => [1], 2 => [0], 3 => [2, 4], 4 => [3, 5, 6], 5 => [7] }
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
/blockquote | [reply] [d/l] |
G'day pldanutz,
I generally think it's better to pass around scalars than entire data structures, so returning a reference to that hash would be my preference.
If you wrapped $h{$k} in @{...}, you could dispense with if (! $h {$k}) { $h {$k} = [] } entirely.
Even if you're using 5.012 for other reasons elsewhere in your code, I see little, if any, value in using each here. It's easy to write it for any Perl5.
Putting all that together, you could code occurrences() like this instead:
sub occurences {
my %h;
my $i = 0;
push @{$h{$_}}, $i++ for @_;
return \%h;
}
If you were looking for a golf answer, you could start with the following and then proceed to remove whitespace until illegibility was achieved. :-)
sub occurences { my ($i, %h) = 0; push @{$h{$_}}, $i++ for @_; \%h }
Here's my tests:
$ perl -Mstrict -Mwarnings -e '
use Data::Dumper;
sub occurences {
+
my %h;
my $i = 0;
push @{$h{$_}}, $i++ for @_;
return \%h;
}
my $h = occurences(2, 1, 3, 4, 3, 4, 4, 5);
print Dumper $h;
'
$VAR1 = {
'1' => [
1
],
'3' => [
2,
4
],
'2' => [
0
],
'4' => [
3,
5,
6
],
'5' => [
7
]
};
$ perl -Mstrict -Mwarnings -e '
use Data::Dumper;
sub occurences { my ($i, %h) = 0; push @{$h{$_}}, $i++ for @_; \%h
+ }
my $h = occurences(2, 1, 3, 4, 3, 4, 4, 5);
print Dumper $h;
'
$VAR1 = {
'4' => [
3,
5,
6
],
'1' => [
1
],
'5' => [
7
],
'2' => [
0
],
'3' => [
2,
4
]
};
| [reply] [d/l] [select] |
Pushing to the $i? That is a bit too much for 5.12.
| [reply] |
Fixed. Didn't copy/paste from the right source.
| [reply] |
Please, mark changes to the original IN the original... and include a note that the post has been updated, in the post. Do NOT delete/replace; use strikeouts.
| [reply] |