Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: how to split based on new line or others ?

by prasadbabu (Prior)
on Nov 08, 2006 at 06:54 UTC ( [id://582797]=note: print w/replies, xml ) Need Help??


in reply to how to split based on new line or others ?

bh_perl,

To accomplish your work, you have to use split and open. After writing the code, if you find any problem, post your code here and all will help you definitely. Or else you can read line by line using while statement.

Prasad

  • Comment on Re: how to split based on new line or others ?

Replies are listed 'Best First'.
Re^2: how to split based on new line or others ?
by bh_perl (Monk) on Nov 08, 2006 at 07:13 UTC
    Ok... This is my code:-
    #!/usr/bin/perl use Getopt::Std; use vars qw /%opt/; my %fldinfo; my $options = 'h:i:o:'; getopts("$options", \%opt) or usage(); sub usage { print "Usage: $0 -[h] -i <input_file>\n"; if ($opt{h}) { print " -h : help\n"; print " -i : input value to be created\n"; print " -o : output-file\n"; } } sub chk_info { while (my ($fldname, $fldvalues) = each (%fldinfo)) { print "<$fldname>$fldvalues</$fldname>\n"; } } main { if ($opt{h}) { usage(); } open(DATA, "$opt{i}"); while (my $data = <DATA>) { next if $data =~ /^#/; foreach (split(/\n/,$data)) { my ($fldname, $fldvalue) = (split(/:/,$_))[0,1 +]; $fldinfo{$fldname} = $fldvalue; } } close(DATA); chk_info(); exit(); }
    I have tried to open and split the input data based on the new line. But the program did not captured or print out all the input data of th +e input file. It only print out the last record of the files. As example:- name:00 00 30 mobile:6575758

      bh_perl

      The problem is not in splitting but in storing the keys in hash. Hash keys are always unique, but in your case (keys: name and mobile) you are using duplicate keys. So the final key and values are getting printed. If you tell the exact requirement, we can correct you.

      Check with the print statements:

      foreach (split(/\n/,$data)) { my ($fldname, $fldvalue) = (split(/\:/,$_))[0,1]; print "**$fldname**\t$fldvalue\n"; $fldinfo{$fldname} = $fldvalue; }

      Prasad

        Yes... you are right.. Do you have any ideas how to solved it ?

      You're asking to split input data on newlines, but you are reading the data a line at a time. So, your split (at

      foreach (split(/\n/,$data)) {)

      is "splitting" the $data into two pieces: everything before the newline and everything after. Since the newline is at the end of the line (by definition....), there's not much in the second chunk.

      Now, when splitting the chunks of $data, it will split them into a chunk ($fldname, with everything before the first colon(":"), and $fldvalue will contain everything after the first colon.

      So, the split on newline is superfluous, unless you reset $/ (see perlvar).

      emc

      At that time [1909] the chief engineer was almost always the chief test pilot as well. That had the fortunate result of eliminating poor engineering early in aviation.

      —Igor Sikorsky, reported in AOPA Pilot magazine February 2003.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://582797]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others examining the Monastery: (5)
As of 2024-04-19 23:44 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found