calling Tcl script with ato arguments

2005-01-17 Thread Vladimir Lemberg
Hi All,

Could you help me to solve following problem:

I need to execute tkl script with two arguments (input file and output file) 
within my Perl script:

#!/usr/bin/perl -w
use strict;
use File::Basename;

my @gdflist = `find . -name *.gdf`;
my $gdf_number = scalar(@gdflist);
my $counter = 0;

 foreach my $gdf (@gdflist){
   my $base = basename $gdf;
   my $path = dirname $gdf;
   $base =~ s/(.*)(\.)/$1$2/;
 
chomp($gdf);
my $arg1 = $gdf;
my $arg2 = $path/$1_patched.gdf;
 
 system patch_teleatlas_gdf.tcl $arg1 $arg2 or die 
patch_teleatlas_gdf.tcl is not working properly;
 $counter ++;
 print \{$gdf\}:PATCHED($counter of $gdf_number);
}

The problem that I'm receiving the die message patch_teleatlas_gdf.tcl is not 
working properly but then I manually assign arguments, 
Tcl script works with no problem.

my arg1 = ./CSK/cansk47.gdf;
my arg2 = ./CSK/cansk47_patched.gdf;
system patch_teleatlas_gdf.tcl $arg1 $arg2 or die patch_teleatlas_gdf.tcl is 
not working properly;

Any ideas? Should i use execvp(3) instead?

Thanks in advance,
Valdimir 









Re: calling Tcl script with ato arguments

2005-01-17 Thread Randy W. Sims
Vladimir Lemberg wrote:
Hi All,
Could you help me to solve following problem:
I need to execute tkl script with two arguments (input file and output file) 
within my Perl script:
#!/usr/bin/perl -w
use strict;
use File::Basename;
my @gdflist = `find . -name *.gdf`;
my $gdf_number = scalar(@gdflist);
my $counter = 0;
 foreach my $gdf (@gdflist){
   my $base = basename $gdf;
   my $path = dirname $gdf;
   $base =~ s/(.*)(\.)/$1$2/;
 
chomp($gdf);
my $arg1 = $gdf;
my $arg2 = $path/$1_patched.gdf;
 
 system patch_teleatlas_gdf.tcl $arg1 $arg2 or die patch_teleatlas_gdf.tcl is not working properly;
 $counter ++;
 print \{$gdf\}:PATCHED($counter of $gdf_number);
}

The problem that I'm receiving the die message patch_teleatlas_gdf.tcl is not working properly but then I manually assign arguments, 
Tcl script works with no problem.

my arg1 = ./CSK/cansk47.gdf;
my arg2 = ./CSK/cansk47_patched.gdf;
system patch_teleatlas_gdf.tcl $arg1 $arg2 or die patch_teleatlas_gdf.tcl is not 
working properly;
Any ideas? Should i use execvp(3) instead?
Csystem returns the exit code of the program executed. Most programs 
return 0 (zero) on success. However, zero is treated as a false value in 
perl, so your Cor condition above is executed when the tcl script 
succeeds. You need to compare the result of system to zero to determine 
success:

system(...) == 0 or die;
A more perlish version of your script might look like (untested):
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
use File::Spec;
my $script = 'tickle.tcl';
my $count = 0;
find( sub {
return unless /\.gdf/  -f;
(my $base = $_) =~ s/\.[^.]+$//;
my $src  = $File::Find::name;
my $dest = File::Spec-catfile( $File::Find::dir, 
${base}_patched.gdf );

system( $script, $src, $dest ) == 0
or die error code $? returned: $!;
++$count;
}, 'downloads' );
print $count files patched\n;
__END__
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/ http://learn.perl.org/first-response