LinuxQuestions.org
Share your knowledge at the LQ Wiki.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices

Reply
 
Search this Thread
Old 02-19-2010, 08:06 AM   #16
ashok.g
Member
 
Registered: Dec 2009
Location: Hyderabad,India
Distribution: RHEl AS 4
Posts: 215

Original Poster
Rep: Reputation: 32

K guys,
I'm I am calling the day off. I will catch you surely tomorrow.
Hope you will debug your code.
Happy posting
 
Old 02-19-2010, 08:44 AM   #17
ghostdog74
Senior Member
 
Registered: Aug 2006
Posts: 2,695
Blog Entries: 5

Rep: Reputation: 240Reputation: 240Reputation: 240
Quote:
Originally Posted by ashok.g View Post
Guys,
Get me out of the while loop I am using in the code which is:
Code:
#find the no. of occurences of a word in the given line
$a=<STDIN>;
$f=$a;
while($f ne "")
{
	if($f=~/(hi)/)
	{
		#print $f;
		$c++;
	}
$f=$';
}
print "The total no. of ocurrances are $c\n";
Thanks in advance
see perldoc -q count.
Code:
while(<>){
    $count = () = $_ =~ /hi/g;
    print "count: $count\n";
}
 
Old 02-19-2010, 10:18 AM   #18
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371
Hi,

@ghostdog74: One of the things the OP does not comprehend is the way STDIN works and how to implement this in a perl program. He will keep complaining about "being stuck in a loop", which is also "true" for your short and elegant solution.

But without a clear description of what it is he tries to accomplish (is perl a must, is there always 1 line of input from STDIN or could there be more, is STDIN actually needed) solving his problem for him (it looks like learning is not on his agenda) is going to be problematic.

Last edited by druuna; 02-19-2010 at 10:36 AM.
 
Old 02-19-2010, 02:22 PM   #19
Aizenmyou
LQ Newbie
 
Registered: Jun 2009
Location: Houston
Distribution: Slackware 64
Posts: 14

Rep: Reputation: 0
Quote:
Originally Posted by ashok.g View Post
I'm I am calling the day off. I will catch you surely tomorrow.
Hope you will debug your code.
Happy posting
I'm sorry but that is so "WTF".
 
Old 02-19-2010, 03:45 PM   #20
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 453Reputation: 453Reputation: 453Reputation: 453Reputation: 453
Quote:
Originally Posted by ashok.g View Post
I am really enjoying this guys.

I think your code really works for only some inputs.
But what about this input?
Code:
[Ashok@station130 My Work]$ perl temp.pl
not getting hi here
Its again running an infinite loop for YOUR code. You debug your code now.
This is you who has to debug your code.

This is your duty to verify the while loop condition.

You shouldn't have just taken the code published by others (an I only published a statement supposed to help debugging), you should have analyzed the root cause and should have corrected it.

This is not your first thread regarding your Perl problems, and to me it looks like you repeat making the same mistakes.

This is you who gave no explanation regarding

Quote:
not getting hi here
- is it your input from keyboard ? If yes, why do you think your code is supposed to work ? I.e. based on what exactly statements in Perl documentation is your code supposed to work for such input ?
 
Old 02-19-2010, 08:01 PM   #21
ghostdog74
Senior Member
 
Registered: Aug 2006
Posts: 2,695
Blog Entries: 5

Rep: Reputation: 240Reputation: 240Reputation: 240
Quote:
Originally Posted by druuna View Post
Hi,

@ghostdog74: One of the things the OP does not comprehend is the way STDIN works and how to implement this in a perl program. He will keep complaining about "being stuck in a loop", which is also "true" for your short and elegant solution.
don't understand. if he wants to use STDIN,
Code:
echo "hi there hi hi" | perl myscript.pl
Also, i have directed OP to see the perldoc. That's where he can find how to count words. Its all from perldoc.

Last edited by ghostdog74; 02-19-2010 at 08:04 PM.
 
Old 02-20-2010, 12:12 AM   #22
ashok.g
Member
 
Registered: Dec 2009
Location: Hyderabad,India
Distribution: RHEl AS 4
Posts: 215

Original Poster
Rep: Reputation: 32
Hi ghostdog74,
Quote:
Originally Posted by ghostdog74 View Post
see perldoc -q count.
Thanks for your suggestion.
Quote:
Originally Posted by druuna View Post
@ghostdog74: One of the things the OP does not comprehend is the way STDIN works and how to implement this in a perl program. He will keep complaining about "being stuck in a loop", which is also "true" for your short and elegant solution.
I think <STDIN> is used to get the entire line the user entered along with the last line. So, to remove that last line we generally use chomp.This is what I know about <STDIN>. If this is not correct I request you to suggest me some documents as ghostdog74 did.
Quote:
Originally Posted by Sergei Steshenko View Post
This is not your first thread regarding your Perl problems, and to me it looks like you repeat making the same mistakes.
Sergei Steshenko, If I'm not rude could you please tell me what made you think I'm repeating the same mistakes.

Also, I request all you guys to suggest me documents in learning perl effectively.
 
Old 02-20-2010, 01:29 AM   #23
Sergei Steshenko
Senior Member
 
Registered: May 2005
Posts: 4,481

Rep: Reputation: 453Reputation: 453Reputation: 453Reputation: 453Reputation: 453
Quote:
Originally Posted by ashok.g View Post
...
Also, I request all you guys to suggest me documents in learning perl effectively.
Your problem is not no knowing Perl, as I wrote, your problem is lack of basic debugging skills. Getting out of endless 'while' loop with condition as simple as

Code:
while($s ne '')
is trivial in any language - one has to analyze the value $s - end of story.
 
Old 02-20-2010, 02:48 AM   #24
ashok.g
Member
 
Registered: Dec 2009
Location: Hyderabad,India
Distribution: RHEl AS 4
Posts: 215

Original Poster
Rep: Reputation: 32
Quote:
Originally Posted by Sergei Steshenko View Post
Getting out of endless 'while' loop with condition as simple as

Code:
while($s ne '')
is trivial in any language - one has to analyze the value $s - end of story.
But i'm not getting out of the while loop using the code which you specified either.
Could you please check your code with the input as "hiiiiiii"?

Last edited by ashok.g; 02-20-2010 at 02:51 AM.
 
Old 02-20-2010, 04:33 AM   #25
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371
Hi ashok.g,

Let's try to get this back on track again.......

I'm curious about something: Have you played with and do you understand the following example (I used ghostdog74's example [post #17], because it is the most elegant and simple):
Code:
#!/usr/bin/perl

use strict ;
use warnings ;

my $count ;

while ( <> ) {
   $count = () = $_ =~ /hi/g ;
   print "count: $count\n" ;
}
I am not talking about the count part or the condition part (although those are important for other reasons), but why you do not get your prompt back and the script keeps waiting for input.

You mention the following in one of your replies:
Quote:
I think <STDIN> is used to get the entire line the user entered along with the last line. So, to remove that last line we generally use chomp.This is what I know about <STDIN>.
STDIN takes input form standard in (in your case you use the keyboard but it could also be a pipe). It keeps waiting for input until it gets an EOF (end of file character).
A carriage return (enter or return if you will, also represented in linux as \n or \r) is not an EOF, it is seen as part of the input. Using chomp will not help. Chomp takes off the end character of a specified string ONLY if that character is a RETURN (Enter).

If you do the following: echo "not getting hi here" | ./hi.counter.pl (hi.counter.pl being the example I posted a few lines back):
the output will be: count: 1
And you will have your prompt back.

If you do this: ./hi.counter.pl
And enter not getting hi here from the keyboard, you will get count: 1 but you will not get your prompt back.

The first one also echo's an EOF and the script (be it perl, bash, awk or whatever) knows there is no more input coming from STDIN and it can continue.
The second example does not echo an EOF and STDIN keeps waiting for input.

You can enter an EOF from the keyboard by pressing ctrl-d. This will tell STDIN that no more input is comming and the script can continue (STDIN can take multiple lines).

STDIN, STDERR and STDOUT are not perl specific.

A few URL's about this subject:
(perl) Reading Input from Standard Input
(wiki) Standard streams
(shell) stdin, stdout, stderr

Hope this finally clears things up a bit.

Last edited by druuna; 02-20-2010 at 05:42 AM. Reason: Fix a typo and fixed a EOL / EOF mix up.
 
Old 02-20-2010, 05:14 AM   #26
ashok.g
Member
 
Registered: Dec 2009
Location: Hyderabad,India
Distribution: RHEl AS 4
Posts: 215

Original Poster
Rep: Reputation: 32
Hi druuna,
Thanks for your post #25. I really understood the program which ghostdog74 quoted in the post #17 with the concept I have about EOF, EOL and STDIN. But your explanation for them is very neat and clean.

Coming back to the line which I had written in the code,
Code:
while ( $f ne "" )
or the line suggested by Sergei Steshenko in one of his replies
Code:
while ( $f ne '')
(I think both conditions will return the same value in this context)
In this line we are not expecting any EOL character rather than we are expecting the condition to be failed. Isn't it?
But as you said we are not echoing any EOL using <STDIN>, then it must wait for the input( You also specified this point in your reply :"The second example does not echo an EOL and STDIN keeps waiting for input") rather than going for an infinite loop( please give any prrint statement like print ("------\n")inside while loop then you can see its goiing infinite loop).

Last edited by ashok.g; 02-20-2010 at 05:21 AM.
 
Old 02-20-2010, 05:43 AM   #27
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371
Hi,

Stupid me, I mixed up EOL and EOF in my previous reply (already fixed it).

Please have another look.

Sorry for that!!
 
Old 02-20-2010, 05:48 AM   #28
ashok.g
Member
 
Registered: Dec 2009
Location: Hyderabad,India
Distribution: RHEl AS 4
Posts: 215

Original Poster
Rep: Reputation: 32
But what about my post, #26
 
Old 02-20-2010, 06:10 AM   #29
druuna
LQ Veteran
 
Registered: Sep 2003
Posts: 10,532
Blog Entries: 7

Rep: Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371Reputation: 2371
Hi again,

The reason I used ghostdog74 example and not your initial script is 'cause your script is basically flawed.

This $a = <STDIN> ; will set up the STDIN 'rules' (waiting for a EOF, which is essentially a loop). After that you create another loop (the while ( $f ne '' ) { part), within the first loop. The action part of the while construct (if ....) is caught between 2 loops.

You have a valid script if you re-write your original script to this:
Code:
#!/usr/bin/perl

use strict ;
use warnings ;

my $c = '0' ;

while ( <STDIN> ) {
   if ( $_ =~ /hi/ ) {
      $c++ ;
   }
}
print "The total no. of ocurrances are $c\n" ;
Now you have 1 loop (reading from STDIN) and the stdin rules apply.

echo "not getting hi here" | ./hi.counter.2.pl
Output: The total no. of ocurrances are 1
And you have your prompt back.

Or: ./hi.counter.2.pl
Enter text from keyboard: not getting hi here (with or without enter/return [=EOL!!])
Enter EOF char to stop the loop: ctrl-d
Output will be:
The total no. of ocurrances are 1
or
not getting hi hereThe total no. of ocurrances are 1
depending on the enter/return you did (output 1) or did not (output 2) press. In both cases your prompt is back.

Hope this helps.
 
Old 02-20-2010, 06:35 AM   #30
ashok.g
Member
 
Registered: Dec 2009
Location: Hyderabad,India
Distribution: RHEl AS 4
Posts: 215

Original Poster
Rep: Reputation: 32
I'm really exhausted today with my work and these posts.
Druuna,
Your last code is working fine with respective to the control loops and all other stuff but it actually doesn't serving the main functionality, i.e., counting the no.of occurances of a word.
(please give multiple "hi"s in multiple lines like
hi hi hi
hiiiiiiiiiiiii
hhhhhhhhhhi
)
It's giving the worng output even after I gave /g in matching there.
 
  


Reply

Tags
matching, perl


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Regexp: difference between sed and Perl matiasar Programming 2 10-15-2009 11:03 AM
Need a perl regexp master sal_paradise42 Programming 8 10-14-2007 06:17 PM
Perl Regexp search-n-replace jpbarto Programming 2 06-16-2005 12:45 PM
perl simple regexp champ Programming 3 07-07-2004 03:27 AM
perl regexp problem raven Programming 4 03-21-2004 11:49 PM


All times are GMT -5. The time now is 07:40 PM.

Main Menu
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: linuxquestions Google+: linuxquestions
Open Source Consulting | Domain Registration