in reply to Counting instances in a hash from an array

Looks to me like your data structures are arse backwards. Consider:

use strict; use warnings; my %triggers; @triggers{qw(bodi forc twice mass acceler law)} = (1); my @UnNum = ( [35, [qw(forc two bodi twice strong on bodi sai bodi mass)]], [39, [qw(you expect on think new bodi made two bodi origin)]], [60, [qw(attract bodi b origin force)]], [46, [qw(total forc b twice origin force)]], [34, [qw(sai on bodi twice mass three time mass forc six)]], [17, [qw(on now see why bodi fall same rate bodi twice)]], ); for (@UnNum) { my $count = \$_->[0]; exists $triggers{$_} && ++$$count for @{$_->[1]}; } print join "\n", map {"$_->[0]: " . join ' ', @{$_->[1]}} @UnNum;

Prints:

41: forc two bodi twice strong on bodi sai bodi mass 41: you expect on think new bodi made two bodi origin 61: attract bodi b origin force 48: total forc b twice origin force 39: sai on bodi twice mass three time mass forc six 20: on now see why bodi fall same rate bodi twice

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: Counting instances in a hash from an array
by Gavin (Archbishop) on Mar 24, 2006 at 12:52 UTC
    Thanks to all for their input.
    My text file is in the format
    print OUTLET "$count\t $_";
    Which gives me
    81, galileo measur us newton basi law motion 45, galileo experi bodi roll slope act same forc weight effect make co +nstantli speed up 50, show real effect forc chang speed bodi set move previous thought 45, meant bodi act forc keep move straight line same speed
    When fed into an array it does not give me the input suggested by "Grandfather".
    I'm not sure how to get qw function syntax placed correctly.
    Again many thanks for all help give.
    my @UnNum = ( [35, [qw(forc two bodi twice strong on bodi sai bodi mass)]], [39, [qw(you expect on think new bodi made two bodi origin)]], [60, [qw(attract bodi b origin force)]], [46, [qw(total forc b twice origin force)]], [34, [qw(sai on bodi twice mass three time mass forc six)]], [17, [qw(on now see why bodi fall same rate bodi twice)]], );

      You need to build the array from the input data. Note that this appends the data in a __DATA__ section following the code. To use an external file instead, open it and use the file handle in place of DATA in the while loop.

      Try this version:

      use strict; use warnings; use strict; use warnings; my %triggers; @triggers{qw(bodi forc twice mass acceler law)} = (1); my @UnNum; while (<DATA>) { chomp; next if ! /(\d+),/; push @UnNum, [$1, [split /\s+/]]; } for (@UnNum) { my $count = \$_->[0]; exists $triggers{$_} && ++$$count for @{$_->[1]}; } print join "\n", map {"$_->[0]: " . join ' ', @{$_->[1]}} @UnNum; __DATA__ 81, galileo measur us newton basi law motion 45, galileo experi bodi roll slope act same forc weight effect make co +nstantli speed up 50, show real effect forc chang speed bodi set move previous thought 45, meant bodi act forc keep move straight line same speed

      Prints:

      82: 81, galileo measur us newton basi law motion 47: 45, galileo experi bodi roll slope act same forc weight effect mak +e constantli speed up 52: 50, show real effect forc chang speed bodi set move previous thoug +ht 47: 45, meant bodi act forc keep move straight line same speed

      DWIM is Perl's answer to Gödel
        Thanks again for all your help.
        My output is now as below, I'm now getting the text lines in ok.
        81:81, galileo measur us newton basi law motion 45:45, galileo experi bodi roll slope act same forc weight effect make + constantli speed up 50:50, show real effect forc chang speed bodi set move previous though +t 50:50, meant bodi act forc keep move straight line same speed
        But it is not increasing the score. There must be a problem with the format of the trigger words. They were split on a space would a comma be better?