For Programmers: Free Programming Magazines  


Home > Archive > PERL Beginners > November 2007 > Cannot understand this fragment of code









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Cannot understand this fragment of code
Giuseppe.G.

2007-11-29, 7:02 pm

Hello there, I'm trying to understand and modify some perl code to
create an index of word. The subroutine I have is in OO Perl, and I'm
just starting to learn normal Perl. So I'd like to transform it. Here
it is:

sub make_word_list {
my ( $self ) = @_;
my %all_words;
foreach my $doc ( @{ $self->{docs} } ) {
my %words = $self->get_words( $doc );
foreach my $k ( keys %words ) {
#print "Word: $k\n";
$all_words{$k} += $words{$k};
}
}

#-------------?? from here
# create a lookup hash of word to position
my %lookup;
my @sorted_words = sort keys %all_words;
@lookup{@sorted_words} = (1..$#sorted_words );

$self->{'word_index'} = \%lookup;
$self->{'word_list'} = \@sorted_words;
$self->{'word_count'} = scalar @sorted_words;
}

and it's called by

make_word_list();

Ok, the first part is clear (til when %all_words is created).

%all_words for us is a hash like

KEY VALUE
word frequency in documents
foo 32
cat 12
....

but what about the rest? @sorted_words contains just the sorted words
with no frequency, and then?


Thank you so much

Giuseppe

John W . Krahn

2007-11-29, 7:02 pm

On Thursday 29 November 2007 03:08, Giuseppe.G. wrote:
>
> Hello there,


Hello,

> I'm trying to understand and modify some perl code to
> create an index of word. The subroutine I have is in OO Perl, and I'm
> just starting to learn normal Perl. So I'd like to transform it. Here
> it is:
>
> sub make_word_list {
> my ( $self ) = @_;
> my %all_words;
> foreach my $doc ( @{ $self->{docs} } ) {
> my %words = $self->get_words( $doc );
> foreach my $k ( keys %words ) {
> #print "Word: $k\n";
> $all_words{$k} += $words{$k};
> }
> }
>
> #-------------?? from here
> # create a lookup hash of word to position
> my %lookup;
> my @sorted_words = sort keys %all_words;
> @lookup{@sorted_words} = (1..$#sorted_words );


@lookup{ } is a hash slice. Search for "Slices" in the perldata man
page:

perldoc perldata


Also, if you have warnings enabled, you should get a warnings when that
line is run. Say that @sorted_words contains four elements therefore
the value of $#sorted_words will be 3 and the message "Odd number of
elements in hash assignment" should be displayed. That line should be:

@lookup{ @sorted_words } = 1 .. @sorted_words;

Or:

@lookup{ @sorted_words } = 0 .. $#sorted_words;


> $self->{'word_index'} = \%lookup;
> $self->{'word_list'} = \@sorted_words;
> $self->{'word_count'} = scalar @sorted_words;
> }
>
> and it's called by
>
> make_word_list();
>
> Ok, the first part is clear (til when %all_words is created).
>
> %all_words for us is a hash like
>
> KEY VALUE
> word frequency in documents
> foo 32
> cat 12
> ...
>
> but what about the rest? @sorted_words contains just the sorted words
> with no frequency, and then?


That depends on what the rest of the program is doing.



John
--
use Perl;
program
fulfillment
Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com