Hi Shawn,

On Wednesday 03 November 2010 16:25:09 shawn wilson wrote:
> hummm, i'm still having issues with these references. i'm hoping someone
> might see some flaw in my syntax or logic that might be easily corrected.
> so, here is what i have in all it's glory. what i want for output is return
> a csv with:
> search term,string from db,lines from input search string came from
> 
> one search string will most definitely have multiple database matches and
> one search string (word) might be on multiple lines (it's why i put that
> last - so that i could easily keep columns straight).
> 
> now, (thanks Shlomi) i'm just getting these errors which don't make sense
> to me:
> Global symbol "%word" requires explicit package name at
> ./namevsfield.plline 83. Global symbol "%word" requires explicit package
> name at ./namevsfield.plline 84.

This anachronistic message means you're using "use strict;" and have not 
declared a variable or you are using a variable that does not exist. You can 
add "use diagnostics;" at the top to turn on more verbose error descriptions, 
that are useful for beginners (after you're experienced, they become a 
nuisance).

In your case what happens is that you've written $word{$some_key} to access 
the %word hash while you should have written $word->{$some_key} to access the 
$word hash-*reference* (which is a scalar). See:

http://perl-begin.org/topics/references/

> 
> i mean, word is a hash reference, but it should be defined inside of %data,
> no?

$word is, but not %word.

Now some comments on your code:

> 
> after i get this working i'm definitely going to have to clean this up and
> start using $ref->{$key} notation. for now, this is what i have:
> 
> #!/usr/bin/perl -Tw
> 

You should use "use warnings;" instead of "-w".

> ##### WHAT #
> # What names return per search
> # search,db,line
> ###########
> 
> use Carp::Assert;
> use strict;
> use DBI;
> 
> #       search left out:  "owner.owner, owner.manown"
>         my $searcher = "owner.manager, owner.owner, owner.manown";
> 
> my $dbh = DBI->connect('DBI:mysql:db;host=localhost',
>                         'user', 'pass')
>                 or die "Database connection: $!";
> 
> open( FILE, "< $ARGV[0]" );

See:

http://perl-begin.org/tutorials/bad-elements/#open-function-style

Also don't reference $ARGV[0] directly:

http://perl-begin.org/tutorials/bad-elements/#subroutine-arguments

> 
> my %data = {};
> 

That's the wrong way to initialise an empty hash.

Just do: «my %data;». If you want to empty the hash later, you can do:
«%data = ();»

> while ( <FILE> ) {
> 
>         my $line = $_;

Don't do that:

http://perl-begin.org/tutorials/bad-elements/#assigning-from-dollar-underscore

> 
>         chomp ($line);
>         my @word = split / /, $line;
> 
> 
>         my $count = 0;
>         while ( $word[ $count ] ) {
>                 $word[ $count ] =~ tr/^[\-a-zA-Z]//;
>                 $word[ $count ] =~ s/\'/\\\'/g;
> 
>                 $data{ $word[ $count ] } = 0 unless defined( $data{ $word[
> $count ] } );
> ### from the last email, below doesn't look right, but i'm not sure how to
> fix it. it's not err'ing but...
>                 $data{ $word[ $count ] }{ $line } = $line;
> 
>                 $count++;
>         }

You should use a foreach loop here. testing for the truth of $word[$count] may 
cause the loop to exit prematurely because "", 0, etc. are false in Perl.

Moreover, what are you trying to do in these lines:

>                 $data{ $word[ $count ] } = 0 unless defined( $data{ $word[
> $count ] } );
> ### from the last email, below doesn't look right, but i'm not sure how to
> fix it. it's not err'ing but...
>                 $data{ $word[ $count ] }{ $line } = $line;

> }
> 
> 
> for my $word ( keys %data ) {
> 
>         my ( $imo, $owner, $manown, $manager );
> 
>         my $select =    qq/SELECT $searcher /;
>         my $from =              qq/FROM owner, spd /;
>         my $where =             qq/WHERE MATCH( $searcher )
> AGAINST('+$word' IN BOOLEAN MODE) /;

Use a placeholder here, and avoid SQL injections:

http://bobby-tables.com/

>         my $join =              qq/AND owner.num = spd.num/;
> 
>         my $query = $select . $from . $where . $join;
>

Why not use a here-document here?
 
>         print "SQL: $query\n";
>         my $sth = $dbh->prepare( $query );
>         $sth->execute;

You are preparing similar statements time and again. Prepare it once and re-
use it with different parameters.

> 
>         while ( my $fields =  $sth->fetchrow_arrayref ) {
>                 foreach my $field ( @{ $fields } ) {
>                         definition( $word, $field );
>                 }
>         }
> 
> }
> 
> $dbh->disconnect;
> 
> 
> for my $word ( keys %data ) {
>         while( my ($field, $type) = each %{ $data { $word } } ) {

You are using $data{$word} twice. You should abstract it into a variable using 
each.

>                 print "$word,$field" if( $type eq 'field' );
>                 while( my ($line, $type) = each %{ $data { $word } } ) {
>                         print ",$line" if( $type eq 'line' );
>                 }
>         }
> }
> 
> 
> sub definition {
> 
>         my ($word, $ufield) = @_;
> ### the below lines are what are err'ing when i run the script.
>         if( defined( $ufield ) && !defined( $data{ $word { $ufield } } ) )
> { $data{ $word { $ufield } } = 'field';

Here's your error - you should do $word->{$ufield} instead of $word{$ufield}

Regards,

        Shlomi Fish

P.S: please go over the rest of http://perl-begin.org/tutorials/bad-elements/ 
for enlightenment.

-- 
-----------------------------------------------------------------
Shlomi Fish       http://www.shlomifish.org/
Best Introductory Programming Language - http://shlom.in/intro-lang

<rindolf> She's a hot chick. But she smokes.
<go|dfish> She can smoke as long as she's smokin'.

Please reply to list if it's a mailing list post - http://shlom.in/reply .

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to