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

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>

Comment on hash to count words
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.
                       -SNL

      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.
                           -SNL

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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://993499]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (12)
As of 2014-07-28 19:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (207 votes), past polls