Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?

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 (Abbot) 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]
[chacham]: finally fixed it. just changing it in all my projects... then maybe to finally fix the junit error i've been ignoring

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (7)
As of 2017-03-29 08:16 GMT
Find Nodes?
    Voting Booth?
    Should Pluto Get Its Planethood Back?

    Results (344 votes). Check out past polls.