in reply to How to eliminate "/n" from text

Hi Deib,

One thing I want to point out: you are currently reading the entire file into an array. Is this necessary? Would a loop suffice? From the example you provide, it seems like you're only using the first entry in the file. Is this true?

It might be more memory efficient to loop over the contents of your file. To do so, replace everything between the open and close statements with this code:

# The while loop reads each line of the file, one at a time. You can # then process each line individually. while( <INFO> ) { chomp( $_ ); # This removes the newline from each line. # Add code to process each URL. }

If the file is small, it probably doesn't make much difference. If the file is large, looping over the file will be nicer to your machine.

If you really only need the first line of the file, use this code:

open( INFO, $file ); # This will only read the file up to the first newline. If the lines # in the file are delimited with newlines, it will read the first # line in the file and stop. my $line = <INFO>; close( INFO ); chomp ( $line ); # Add code to process the first URL.

It might seem "nit-picky", but I think it's a good habit to develop early. :)

If you really do need to read the entire file into an array, add this line to your script, after you load the array:

# Removes newlines from each array element at once. chomp( @lines );

HTH,

/Larry

Replies are listed 'Best First'.
Re^2: How to eliminate "/n" from text
by Anonymous Monk on Jan 02, 2005 at 09:48 UTC
    Moreover, you can do this:

    open(foo,"bar") or die;
    chomp(my @baz = <FOO>);
    close(foo) or die;

    While intended to show another way to do chomp, the neat
    thing is that you can open a file, save the contents to
    an array, and then close the file.

    Thanks to various people on perlmonks for helping me
    learn that.
      Thanks for that nice and simple way of doing it, Anonymous. :)
      I appreciate it. ^_^
Re^2: How to eliminate "/n" from text
by Deib (Sexton) on Jan 05, 2005 at 01:07 UTC
    (In this post, when I say "file" I mean the .inf file, not the perl file)

    Larry, thanks a lot for posting.
    Sorry I'm late with the reply, we had some issues with my workspace, so I couldn't work on this for a few days.

    There are many URLs in the file, in the example code I only take the first line because I was just doing a test. Sorry that I did not specify.

    Actually, the file is constituted of 2 URLs per process. So I divide the lines in 2 different arrays. One with the even lines and one with the odd ones. Let's suppose that the file I use is like this:

    www.google.com/folder/ www.google.com/folder/onething.htm www.hotmail.com/folder/ www.hotmail.com/folder/anotherthing.htm


    So, for each process I have to use the URLs in pairs.
    I use a for to do it. However, that while( <INFO> ) way you told is great!! :)

    The only way I know how to do what i want is with a for and a counter to separate the odds and evens.

    Any ideas on alternatives that can be more efficient?? It can involve the code or the way the file is arranged.
    I feel really narrow-minded right now since I'm a newbie, so any input is greatly appreciated. I hope my post is clear enough. Thanks!! :)

      Hi Deib,

      Sorry for the delay in my response. I've been out of town since Jan. 5 and I just got back yesterday.

      Are you creating the data file you're using? If so, it seems like you're creating extra work for yourself. It seems like the first line is the root of the site (or site folder) and the second line is the path to the page. Why don't you simply load the file with the lines that represent the paths to the pages and use these to parse out the site paths?

      You could use the File::Basename module to parse the page paths. Consider this:

      #!/usr/bin/perl use strict; use File::Basename; my @paths = ( 'www.google.com/folder/', 'www.google.com/folder/onething.htm', 'www.hotmail.com/folder/', 'www.hotmail.com/folder/anotherthing.htm', 'www.hotmail.com/folder' ); foreach my $path ( @paths ) { print "PATH: $path\n"; # This line does all the work. my ($base, $dir, $ext) = fileparse( $path, '\.[^.]*' ); printf "DIR: $dir\nBASE: $base\nEXT: $ext\n\n"; }

      The commented line in the foreach loop is doing all the parsing work. It splits the path you give it into three pieces: The directory path to the file, the basename (the part of the file name before the extension), and the extension (the part of the file name after the final period.) Of course, if the file name does not contain an extension, the entire part after the final slash is returned as the basename.

      This is certainly a more efficient way to process the input file since it reduces the number of lines you have to process by 50%. Of course, if you have to use the file the way it stands in the example you provided, this might not help as much. :)

      Without knowing exactly what it is you're trying to do, I'm afraid I'll spend a lot of time guessing what your requirements are.

      Let me know if you have other questions or if this is unclear.

      HTH,

      /Larry