in reply to Scripts work when run individually but not when run as one compiled script

Close the files you created before reading them

close $clss_out{$_} for keys %clss_out; csv_xlsx();

Also, consider deleting the csv file individually rather that using glob

sub csv_xlsx{ my $dir = "C:\\Temp\\Data"; my @csv_files = glob "$dir/*.csv"; foreach my $csv (@csv_files) { (my $xlsx = $csv) =~ s/csv/xlsx/i; print "Creating $xlsx "; my $workbook = Excel::Writer::XLSX->new($xlsx); my $worksheet = $workbook->add_worksheet(); my $row = 0; open my $fh, '<', $csv or die "Can't open '$csv' : $!"; while (<$fh>) { my @list = split /,/; $worksheet->write_row( $row, 0, \@list ); ++$row; } print "$row rows written\n"; $workbook->close(); close $fh or die "Can't close '$csv' ; $!"; unlink $csv or warn $! ; } }

Update : Why are you using this ?

my $xlsx_WSD = ( "C:\\Temp\\Data\\data.xlsx"),, 1;

instead of simply

my $xlsx_WSD = "C:\\Temp\\Data\\data.xlsx";
poj

Replies are listed 'Best First'.
Re^2: Scripts work when run individually but not when run as one compiled script
by john.tm (Scribe) on Jan 20, 2016 at 11:59 UTC
    I use this line.. my $xlsx_WSD = ( "C:\\Temp\\Data\\data.xlsx"),, 1; because in windows the file can be read if it is open.
      I use this line.. my $xlsx_WSD = ( "C:\\Temp\\Data\\data.xlsx"),, 1; because in windows the file can be read if it is open.

      Well, the ,, 1 from above is gratuitous:

      qwurx [shmem] ~> perl -MO=Deparse -e '$xlsx_WSD = ( "C:\\Temp\\Data\\d +ata.xlsx"),, 1;' $xlsx_WSD = 'C:\\Temp\\Data\\data.xlsx', '???'; -e syntax OK

      See the '???' ? This is what's optimized away: the commas, and the 1.

      Then, of course the file can be read if it is open - but only if it is opened for reading, right?

      perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
      in windows the file can be read if it is open.

      As I said here, that maybe true for Excel using Visual Basic for Applications but not in Perl.

      poj