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

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

Replies are listed 'Best First'.
Re^3: how to split based on new line or others ?
by prasadbabu (Prior) on Nov 08, 2006 at 07:29 UTC

    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 ?

        bh_perl, You have not shown your exact requirement. So by assuming your required output as:

        <name>00 00 0D</name> <mobile>123455</mobile> <name>00 00 30</name> <mobile>6575758</mobile>

        Here is one way to achieve this.

        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 "<name>$fldname</name>\n<mobile>$fldvalues</mobi +le>\n\n"; } } main { if ($opt{h}) { usage(); } open(DATA, "$opt{i}"); my $data = do {local $/, <DATA>}; + while ($data =~ /name\:([^\n]*)\nmobile\:([^\n]*)\n?/g) { my $fldname = $1; $fldvalue = $2; $fldinfo{$fldname} = $fldvalue; } close(DATA); chk_info(); exit(); }

        Prasad

Re^3: how to split based on new line or others ?
by swampyankee (Parson) on Nov 08, 2006 at 17:42 UTC

    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.