#!/ichigo/perl
use v5.12;
use warnings;
use strict;
my @array = qw/ one two three four five /;
my %hash = (
row_1 => [ qw/ one five two / ],
row_2 => [ qw/ four two / ],
row_3 => [ qw/ three one five four / ],
);
say "@array";
# Get index mapping.
my %index;
@index{@array} = 0..$#array;
my @zero = (0) x @array;
my @one = (1) x @array;
for my $key (sort keys %hash) {
# Zero-out a bit array.
my @bits = @zero;
# Flip bits to one using index.
@bits[@index{@{$hash{$key}}}] = @one;
say "$key = @bits";
}
| [reply] [d/l] |
"Or more simply as:" I would say that is debatable.
I think that sometimes we get a bit carried away with the "zoom" of Perl and don't emphasize the basics for beginners, i.e. we would do well to consider the audience when suggesting code.
The OP is a biologist, not a SW person. The purpose of my post was to show code that only used the most basic parts of beginning Perl - something simple - both from the program logic and the syntax. Also, this code may actually run faster than some some more terse versions!
For the OP, what jwkrahn is demonstrating here is called a "hash slice". This essentially combines multiple hash assignment statements, like: $hash{a}=0; $hash{b}=1; together as one statement, could be: @hash{'a','b'}=(0,1); This is great and cool stuff, but a plain old foreach() loop is just fine. Shorter code does not necessarily run faster - in fact, sometimes it runs slower, but it is sometimes easier to write for those "in the know". Perl is loaded with idioms. Extensive use of them is not necessary to write good solid, clear, high performing code.
The syntax for a hash slice looks similar to that of an array as a hash value. @{$hash{value}}, but it is not. The HoA (Hash of Array), @{$hash{value}} is the "take home", "use it often", "get used to seeing it" message here. A hash slice is less often encountered.
Anyway, my point here is that a hash slice is probably not "easier" for a beginner to understand because of the syntax. | [reply] |
| [reply] |
The OP doesn't say that so I assume that you know them personally?
In the level of thread that I directly replied to, the Original Poster says: "I am a PhD genome biologist still getting to grips with the finer details of Perl".
The OP says they have "an array with 5 elements" but you chose to store that in a string and then split it.
Well, I certainly did focus on the OP's description of the output:
one two three four five
row_1 = 1 1 0 0 1
row_2 = 0 1 0 1 0
row_3 = 1 0 1 1 1
etc...
It looked to me like there would be line with the column names - I certainly was thinking about a normal CSV type header. If not so what? We are focusing on the wrong detail.
I think we are getting bogged down into small details... You posted an excellent solution as did I. Let's leave it at that.
| [reply] [d/l] |