Solved

Basic perl question.

Posted on 1998-07-17
11
192 Views
Last Modified: 2010-03-05
Here's the situation (quite a common one) : I've got an ascii file filled with lines like aaa#bbb. I want to read this file line by line, filling an array with values got from the ascii file. I made it as usual with :
open(IN,"myfile");
while ($ligne=<IN>){some split and array stuff };
close(IN);
My question is very simple (I've a lot of points left!!)
I don't want to read the last line if this last line is blank (for example to carriage returns). What is the most elegant (more efficient, more perl-style) manner to do that.
0
Comment
Question by:steph84
  • 3
  • 2
  • 2
  • +3
11 Comments
 
LVL 6

Expert Comment

by:alamo
ID: 1208478
If I understand, you want to skip your split and array stuff if the line is blank? If that's it, then try:

next if $ligne eq "\n";

I would assume the first part if your processing would be "chop $ligne;", if so you could make the next line
next if $ligne eq '';

You might be able to detect a blank line slightly more efficiently as a byproduct of your processing the line, but it seems like it wouldn't be worth the effort.

But definitely don't consider the issue closed till ozo weighs in on this subject...
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 1208479
$_=$ligne; next if m/^\s*$/
0
 
LVL 1

Expert Comment

by:mikegrb
ID: 1208480
alamo I like that last line :)
next if $ligne eq "\n";  <=== that's the way I would do it but
TIMTOWTDI :)
0
 
LVL 84

Expert Comment

by:ozo
ID: 1208481
Do you only want to skip blanks when it's the last line?
(as it is, you're skipping "0" when it's the last line)
I'd also be interested in seeing your split and array stuff.
0
 
LVL 1

Expert Comment

by:notanexpert
ID: 1208482
Arn't we forgetting a key issue here? Is there a way to do /anything/ elegantly in Perl? ;)

Back to the question, why not make this conditional that you'll write to include lines not of the proper format? Ie, if a line doesn't have the format xxx#yyy or whatever, skip it. That'd include blank lines, and blank lines at the end of the file.

Something like

if $ligne=~ /^[a-zA-Z]{3}#[a-zA-Z]{3}$/ {

# process valid line

}

. or something like that. I don't have this stuff memorized, I'm just suggesting you might wanna cover the blanket case anyways if its something youll have to think about later ....
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:steph84
ID: 1208483
for ozo and others, split and array stuff :
each line has this form : id#name#password.
I'm quite impressed by the number of comments or answers!!!

while ($ligne=<IN>)      
{
      @info =  split(/#/,$ligne);

      # array of array
      @compte = (@compte,[@info]);
}
close(IN);
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 1208484
So you may vote now for your favorite one ;-)
0
 
LVL 84

Expert Comment

by:ozo
ID: 1208485
while( <IN> ){
  push @compte,[split/#/] if /#/;
}

@compte = map{ /#/?[split/#/]:() } <IN>;
#but these skip blanks evn if it's not the last line, or non-blank lines containing no '#'s
0
 

Author Comment

by:steph84
ID: 1208486
sorry for others, but ozo's answer seems to be the best one....
Thanks anyway.
0
 
LVL 6

Expert Comment

by:alamo
ID: 1208487
By the way, you do realize the final element in each line's array has a trailing \n? This would cause problems in many implementations. A "chomp" can work wonders.
0
 
LVL 84

Accepted Solution

by:
ozo earned 50 total points
ID: 1208488
while( <IN> ){
      chomp;
      push @compte,[split/#/] if /#/;
}

@compte = map{ /#/?(chomp,[split/#/]):() } <>;

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

On Microsoft Windows, if  when you click or type the name of a .pl file, you get an error "is not recognized as an internal or external command, operable program or batch file", then this means you do not have the .pl file extension associated with …
There are many situations when we need to display the data in sorted order. For example: Student details by name or by rank or by total marks etc. If you are working on data driven based projects then you will use sorting techniques very frequently.…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
Learn how to create flexible layouts using relative units in CSS.  New relative units added in CSS3 include vw(viewports width), vh(viewports height), vmin(minimum of viewports height and width), and vmax (maximum of viewports height and width).

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now