[Chicago-talk] Limiting a hash, or producing an interesting list
Steven Lembark
lembark at wrkhors.com
Tue Nov 25 10:22:27 CST 2003
-- Jay Strauss <me at heyjay.com>
> Hi,
>
> I'm not sure how best to explain what I want to do. the code below does
> what I want, but it seems needlessly complicated. I figure there is
> probably a nice clean way to do this is less steps but I don't see it:
>
> Essentially, I have a list of all the fields "@all", and I want to
> produce a list of only the fields I'm interested in, and their position
> in the original list
>
> my @all = wq/this that other some junk trash need/;
> my %all;
> my @all{@all} = (0..$#all);
>
> my @interesting = qw/this that need/;
> my %interesting;
> @interesting{@interesting} = delete @all{@interesting};
Convert the header to a hash of name => offset and slice
the hash for the list of offsets that matter to you:
my @interesting = qw( what you knead );
my @header = qw( what you get );
my %fieldz = map { $header[$_] => $_ } ( 0..$#header );
my @offsetz = grep { defined } @fieldz{@interesting};
Nice thing about this approach is that you can easily change
the order that between @header and @offsetz. This gives you
a buffer between input field ordering since you can always
get the header fields out in order by name.
--
Steven Lembark 2930 W. Palmer
Workhorse Computing Chicago, IL 60647
+1 888 359 3508
More information about the Chicago-talk
mailing list