Link to home
Start Free TrialLog in
Avatar of deshaw
deshawFlag for India

asked on

How to declare Perl format for dynamically changing in variable length

Hi Experts,

Currently we are writing Perl script where we need to use Perl format for displaying output in particular format. We don't want to use sprintf as it is errorprone and want to use only Perl format. We are facing below problem:

Suppose I want to define my Perl format then I am using below code:

my ( $len1, $len2, $len3, $len4 ) = (0,0,0,0);
my ( $var1, $var2, $var3, $var4 ) = ( );
#We have to declare above variables before declaring format
my $srcheader = "format SRCHEADER = \n" .
            '@' . '>' x $len1 . " " . '@' . '<' x $len2 . ": " . '@' . '<' x $len3 . '@' . '<' x $len4 . "\n" .
            '$var1,                  $var2,                      $var3,              $var4' . "\n" .
            ".\n";

Where we $len1 to $len4 to be dynamically change in program so that when we execute below code, we should get desire output:

      $len1 = 45 if ( $ALLSTATS );
      $len2 = length($config);
      $len3 = length($SRC_COUNT{$config});
      my $srcinfo = " ";
      $srcinfo = "(Source : $SYNC_SRC)" unless ( $OLD_LOGS );
      $len4 = length($srcinfo);
      print "( $len1, $len2, $len3, $len4 )\n";
      $var1 = "Configuration";
      $var2 = $config;
      $var3 = $SRC_COUNT{$config};
      $var4 = $srcinfo;
      
                     eval $srcheader;
                     die $@ if $@;
                      select(STDOUT);
                      $~ = $srcheader;
                      write();

Here problem is : though we have updated $len1 to $len4 values it is taking the first defined values (0,0,0,0) but it is working fine for $var1 to $var4. Could any one tell what is the problem.

Thanks.
Avatar of ozo
ozo
Flag of United States of America image

sub srcheader{
print "format SRCHEADER = \n".
            '@' . '>' x $len1 . " " . '@' . '<' x $len2 . ": " . '@' . '<' x $len3 . '@' . '<' x $len4 . \
"\n" .
            '$var1,                  $var2,                      $var3,              $var4' . "\n" .
            ".\n";
eval "format SRCHEADER = \n".
            '@' . '>' x $len1 . " " . '@' . '<' x $len2 . ": " . '@' . '<' x $len3 . '@' . '<' x $len4 . \
"\n" .
            '$var1,                  $var2,                      $var3,              $var4' . "\n" .
            ".\n";
}
srcheader();
select(STDOUT);
$~ = "SRCHEADER";
write();
ASKER CERTIFIED SOLUTION
Avatar of deshaw
deshaw
Flag of India image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial