Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

hash to count words

by underoathed (Initiate)
on Sep 13, 2012 at 14:05 UTC ( #993499=perlquestion: print w/replies, xml ) Need Help??
underoathed has asked for the wisdom of the Perl Monks concerning the following question:

Ok PerlMonks got a question for you. How do I create a hash to count certain words? I have everything else set up properly except that. Also can anyone tell me what /g means in my code? Here is my code. <code> #! /usr/bin/perl -w foreach $file (ARGV) { open (IN, $file) or die "Cannot open '$file' : $!\n; $line = <IN>; @array = split (' ', $line); foreach $word (@array){ $word =~ s/^\w\x\//g; $word = lc ($word); %hash = (); %hash_ref = $word; print "word\n":] close (IN); } </c>

Replies are listed 'Best First'.
Re: hash to count words
by NetWallah (Canon) on Sep 13, 2012 at 14:30 UTC
    Please use "code" tags correctly, as described in Writeup Formatting Tips.

    Your regex "$word =~ s/^\w\x\//g;" is invalid.

    you probably want:

    $word=~s/[^\w]//g; # Eliminate non-word chars
    Your re-initilazation of "%hash=()" within the loop makes the hash useless.

    Declare it outside the loop, and add data to it using

    $hash{$word}++; # Get a count of the word
    Later , you can get a list of words found by accessing:
    keys (%hash)
    Please try to follow davido's excellent advice in response to your previous question on the same subject.

                 I hope life isn't a big joke, because I don't get it.

      So here is what i have for code so far for the hash.

      #!/usr/bin/perl -w open (IN, $file) or die "Cannot open file '$file' : $!\n; $line = <IN>; @array = split ( ' ', $line); foreach $word (@array){ $word =~ s/^\w\w//g; $word = lc ($word); print "$word\n";} $hash {$the}++; $hash {$linux}++; $hash {$hello}++;
      What am I doing wrong?
        Ok - I'll take a stab at answering your question "What am I doing wrong?" :
        • Not using 'strict'. (add "use strict;" to the top of your code)
        • Not using canonical "open" with local filehandle. (Try : open(my $f, "<", $file) or die "Cannot open '$file':$!";)
        • Not declaring variables (use my @array; (follows from "use strict"))
        • Not formatting/aligning your code for visibility
        • Not following advice (davido's code works for what you need)
        • Not reading how hashes work
        • Not closing the file handle you opened.
        • Not posing your question(s) clearly
        • Not showing what you expect as a result of your code
        • Not showing sample data
        The answer to the question in your previous post on the meaning of "/g" can be found by running "perldoc perlre".

                     I hope life isn't a big joke, because I don't get it.

Re: hash to count words
by tobyink (Abbot) on Sep 13, 2012 at 15:45 UTC
    #!/usr/bin/perl -w while (<>) { $COUNT{$_}++ for map lc, split /\W+/; } print "$_: $COUNT{$_}\n" for sort keys %COUNT;

    Or if you're only interested in certain words...

    #!/usr/bin/perl -w @W = qw( hello world ); while (<>) { $COUNT{$_}++ for grep { $_~~@W } map lc, split /\W+/; } print "$_: $COUNT{$_}\n" for sort keys %COUNT;
    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://993499]
and a kettle whistles...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (3)
As of 2018-03-20 04:05 GMT
Find Nodes?
    Voting Booth?
    When I think of a mole I think of:

    Results (247 votes). Check out past polls.