By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,847 Members | 1,253 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,847 IT Pros & Developers. It's quick & easy.

dictionary using perl

P: 9
i am trying to write a dictionary using perl, the program would use a primary .pl file, and a text file, designated .dat

i have no programing background, and am trying to teach myself perl, and c++, so excuse my ignorance.

i have experimented with some scripts, i have figured out why my last one didn't work, but i have no idea what to do. this was my last attempt:

dictionary.pl

Expand|Select|Wrap|Line Numbers
  1. #!/usr/bin/perl
  2.  
  3. $data_file="bionicle.dat";
  4.  
  5. $input=<STDIN>;
  6.  
  7. open(DAT, $data_file) || die("Could not open file!");
  8. @raw_data=<DAT>;
  9. close(DAT);
  10.  
  11. foreach $word (@raw_data)
  12. {
  13.  chop($word);
  14.  ($name,$def)=split(/\|/,$word);
  15.  if ($name=$input) {
  16.   print "$name: $def";
  17.   sleep(10);
  18.   } else {
  19.   print "sorry, word not found";
  20.   sleep(3);
  21.   }
  22. }
  23.  
and dictionary.dat

Expand|Select|Wrap|Line Numbers
  1. word1|definition1
  2. word2|definition2
  3. word3|definition3
  4.  
so i that my script was nothing like what i wanted, but what did i want?

thanks in advance,

ian
Mar 25 '08 #1
Share this Question
Share on Google+
10 Replies


KevinADC
Expert 2.5K+
P: 4,059
beginner mistake:

Expand|Select|Wrap|Line Numbers
  1. if ($name=$input) {
'=' is the assignment operator so the above is always true because you are assigning the value of $input to $name. Probably you want to use 'eq':

Expand|Select|Wrap|Line Numbers
  1. if ($name eq $input) {
look up perls string operators when you get a chance.
Mar 26 '08 #2

P: 9
beginner mistake:

Expand|Select|Wrap|Line Numbers
  1. if ($name=$input) {
'=' is the assignment operator so the above is always true because you are assigning the value of $input to $name. Probably you want to use 'eq':

Expand|Select|Wrap|Line Numbers
  1. if ($name eq $input) {
look up perls string operators when you get a chance.
oops actually i think i meant to use "==", i knew that. isn't "eq" used for numeric equallity?
Mar 26 '08 #3

P: 9
by the way, my intended result was for the script to print the word originally typed, and the definition supplied by the dictionary.dat file. actually there were quite a few problems with that script.

basically my question is how can i make perl read from another file, such as the one i supplied, search for a word found before the pipe divider, and print the text following the pipe.
Mar 26 '08 #4

eWish
Expert 100+
P: 971
perlop Equality Operators.

--Kevin
Mar 26 '08 #5

P: 9
ok thanks, i guess i shouldn't question people more experienced than me lol. i got that completely backward.

however upon using the "eq" operator, my script just ran indefinitely, without ever printing an indication of true or false. i believe if it was working correctly, although this is not what i wanted, wouldn't it print "word not found", for each line in the dictionary.dat file? but when i run it, it never prints anything.
Mar 26 '08 #6

KevinADC
Expert 2.5K+
P: 4,059
ok thanks, i guess i shouldn't question people more experienced than me lol. i got that completely backward.

however upon using the "eq" operator, my script just ran indefinitely, without ever printing an indication of true or false. i believe if it was working correctly, although this is not what i wanted, wouldn't it print "word not found", for each line in the dictionary.dat file? but when i run it, it never prints anything.
post a few (2 or 3) sample lines from the dictionary file and show what input you give your script.
Mar 26 '08 #7

P: 9
post a few (2 or 3) sample lines from the dictionary file and show what input you give your script.
the dictionary is a dictionary of maori words.

dictionary.dat:

Expand|Select|Wrap|Line Numbers
  1.  
  2. kopaka|ice
  3. pohatu|stone
  4. tahu|burn
  5.  
this is just an example there are a lot of words before, after, and in between.

input into dictionary.pl:

"tahu" without quotes

it then runs infinitely without printing, and obviously not ending.

(edit) actually after some time it does end. so i guess it is going through my entire dictionary.dat file.
Mar 27 '08 #8

eWish
Expert 100+
P: 971
After you get your input into the $input variable use chomp.

Expand|Select|Wrap|Line Numbers
  1. my $file_name = 'f:/test_file.txt';
  2.  
  3. print 'Please enter a word?';
  4.  
  5. my $input = <STDIN>;
  6. chomp($input);
  7.  
  8. open (my $FILE, '<', $file_name) || die "Can't open file $file_name: $!\n";
  9. while (<$FILE>) {
  10.     chomp;
  11.     my ($name, $def) = split(/\|/);
  12.  
  13.     if ($name eq $input) {
  14.         print "$name means $def\n";
  15.         exit;
  16.  
  17.     ..rest of code here...
  18.  
  19. }
  20. close($FILE);
--Kevin
Mar 27 '08 #9

P: 9
After you get your input into the $input variable use chomp.

Expand|Select|Wrap|Line Numbers
  1. my $file_name = 'f:/test_file.txt';
  2.  
  3. print 'Please enter a word?';
  4.  
  5. my $input = <STDIN>;
  6. chomp($input);
  7.  
  8. open (my $FILE, '<', $file_name) || die "Can't open file $file_name: $!\n";
  9. while (<$FILE>) {
  10.     chomp;
  11.     my ($name, $def) = split(/\|/);
  12.  
  13.     if ($name eq $input) {
  14.         print "$name means $def\n";
  15.         exit;
  16.  
  17.     ..rest of code here...
  18.  
  19. }
  20. close($FILE);
--Kevin
ok, thank you very much! most of the code make sense to me, but like i said, im a n00b. the parts i don't understand are '<' and < and > around $FILE

thanks a lot,

ian
Mar 27 '08 #10

eWish
Expert 100+
P: 971
It is the same as witting the following.
Expand|Select|Wrap|Line Numbers
  1. open FILEHANDLE,MODE,EXPR
In theory it is a more secure way to open a file. That is according to 'Perl Best Practices'.

--Kevin
Mar 28 '08 #11

Post your reply

Sign in to post your reply or Sign up for a free account.