in reply to output can be displayed in screen, but not in output file

You can do this task all sorts of ways in perl. It is often done using what is know as "inplace editing". It is in the FAQ which are worth a look if you are new to perl. Inplace Editing shows several idioms and one liners. The classic is:

perl -pi.bak -e 's/OLDSTRING/NEWSTRING/g' FILELIST

Taking the code you have, adding some error checking and rationalising your matching regex where you capture things into $1 and $2 but do nothing with them (untested):

for my $file (@files){ open IN,"$directory/$file" or die "Can't read $directory/$file Error: $!\n"; open OUT,">$directory/$file.out" or die "Can't write $directory/$file.out Error: $!\n"; while(<IN>){ chomp; # remove newline so new data on same (?correct?) line print OUT $_; print OUT "\t\t <local-id>$file</local-id>" if /<asset-id/; print OUT "\n"; } close IN; close OUT; # now unlink IN and rename OUT to IN if desired. # warning unlink will delete the original file # unlink "$directory/$file" or die $!; # rename "$directory/$file.out", "$directory/$file" or die $!; }

This is not an elegant of perlish way of doing it but should get you heading in the right direction.

Replies are listed 'Best First'.
Re^2: output can be displayed in screen, but not in output file
by happyrainb (Novice) on Nov 28, 2007 at 15:12 UTC
    Thank you very much! It works perfectly. I will keep learning from here!

      To prevent unwanted disaster I suggest the first step should be to rename the file file.txt -> file.txt.bak. Then read this .bak file and write out the new file, that way you retain the original in case you accidentally destroy the data, which is easy enough to do.