MrTEE has asked for the wisdom of the Perl Monks concerning the following question:

I have a script that prints out a string of values which are pipe delimited. waht i want to do is is if $f3 field equals something, like the letter C I want it to print out the xout. However if the $f3 is not populated with any value, if $f3 defined and not equal to nothing I want N and G to be printed out in the $f5 and F7 fileds respectively.

#!/usr/bin/perl use strict; use warnings; my ($f1, $f2, $f3, $f4, $f5, $f6, $f7) = ("") x 7; #$f3="C"; my $xout = "$system|$f2|$f3|$f4|$f5|$f6|$f7|\n"; if ( defined $f3 && $f3 ne '' ) { print $xout; print "\$f3 is defined \n"; } else { my $f5 = "N"; my $f7 = "G"; print $xout; print "the 7th and 8th blocks should have values \n"; }

The output is going to look like this

host1||C||||| host2||C||||| host3||||N||G| host4||C||||| host5||||N||G|

Replies are listed 'Best First'.
Re: Augmented pipe delimited output
by Loops (Curate) on Nov 03, 2014 at 04:04 UTC

    Hi MrTEE

    You're masking the values of $f5 and $f7 by declaring them with "my" a second time. You also need to delay the creation of your $xout string until after all your variables are properly set. Try something like:

    my ($f1, $f2, $f3, $f4, $f5, $f6, $f7) = ("") x 7; #$f3="C"; if ( not defined $f3 or $f3 eq '' ) { $f5 = "N"; $f7 = "G"; print "the 7th and 8th blocks should have values \n"; } my $xout = "system|$f2|$f3|$f4|$f5|$f6|$f7|\n"; print $xout;
Re: Augmented pipe delimited output
by GrandFather (Saint) on Nov 03, 2014 at 04:07 UTC

    Something like:

    #!/usr/bin/perl use strict; use warnings; my @data = map {[("") x 8]} 1 .. 5; $data[$_][0] = "host" . ($_ + 1) for 0 .. 4; $data[$_][3] = 'C' for 0, 1, 3; for my $row (@data) { @{$row}[4, 6] = ('N', 'G') if !length($row->[3]); print join('|', @$row), "\n"; }

    Prints:

    host1|||C|||| host2|||C|||| host3||||N||G| host4|||C|||| host5||||N||G|
    Perl is the programming world's equivalent of English