http://qs321.pair.com?node_id=751784


in reply to appending to a file

I'd start with error checking. (added: Fletch is more accurate than I am on the functions you'll want to check errors on, consider adding similar error checking to the functions mentioned):
open( my $in, ">>".$seq_dir."/".$fa) or die "Unable to open $seq_dir/$fa for append: $!\n";
Obviously if the file is read only or the path isn't parsed correctly, the open call will fail and you won't be able to write to the file.

Replies are listed 'Best First'.
Re^2: appending to a file
by lomSpace (Scribe) on Mar 19, 2009 at 17:19 UTC
    I can append to the file, but am having trouble accessing the file contents. I am
    appending the file names not the contents. Example
    13132HU.fa,13132HD.fa,13132Ltvec_small.FA 13132HU.fa,13132HD.fa,13132Ltvec_small.FA 13132HU.fa,13132HD.fa,13132Ltvec_small.FA 13132HU.fa,13132HD.fa,13132Ltvec_small.FA
    This is what is being appended to the file. I want the contents
    of those files to be appended to the file.
    Any ideas?

      I can't see how that's possible. The only thing you append to the file is a newline.

      Here's a guess on what you're really looking for. You want to append the three files to the $fa file. You'll need to open each in turn, read from it, then print the contents to the $fa file (those variable names could really be more descriptive, by the way).

      So I think what you want is something like this:

      #!/usr/bin/perl use strict; use Data::Dumper; use File::Glob ':glob'; my @dirs = glob("C:/Documents and Settings/mydir/Desktop/KOMP/*"); foreach my $maid_dir (@dirs) { # Combined the first two conditionals to reduce indentation if (-d $maid_dir and $maid_dir=~m%\d+\s[A-Z]%){ # match the dir na +me my $seq_dir = $maid_dir."/sequencing/"; chdir ($maid_dir) or die "Can't chdir to $maid_dir: $!\n"; next if (-M $seq_dir > 1.0); chdir ($seq_dir) or die "Can't chdir to $seq_dir: $!\n"; #print Dumper ($maid_dir, $seq_dir); opendir my $dh, "$seq_dir" or die "Can't open $seq_dir: $!\n"; if(-d $seq_dir){ my @files = readdir $dh; #my $path = @_; for my $f(@files){ if($f=~ m%^(\d*)(HU.fa|HD.fa|Ltvec_small.FA|_fasta)$%) +{ my ($fa, $hu, $hd, $lt)= ($1."_fasta", $1."HU.fa", + $1."HD.fa", $1."Ltvec_small.FA"); if(-e $fa){ # This is output, not input. Renamed variable +accordingly. open( my $out, ">>".$seq_dir."/".$fa) or die " +Can't open $seq_dir/$fa for append: $!\n"; # Append the contents of the three files to $f +a open my $hu_file, '<', $hu or die "Can't open +$hu: $!\n"; while (my $line = <$hu_file>) { print $out $line; } open my $hd_file, '<', $hd or die "Can't open +$hd: $!\n"; while (my $line = <$hd_file>) { print $out $line; } open my $lt_file, '<', $lt or die "Can't open +$lt: $!\n"; while (my $line = <$lt_file>) { print $out $line; } #open( my $out, ">>".$seq_dir."/".$fa); print $out, "\n" ;#"$hu,$hd,$lt\n"; print Dumper($f); close($out); close($hu_file); close($hd_file); close($lt_file); } } } } } }

      Note that this is a very quick revision of your code, with added error checks (and just noticed I missed the readdir, doh). And it may not be at all what you want. If not, please provide more detail on what you're trying to do.

        I want to append the three files to my $out file.
        I only need each file appended once. The loop is appending each file
        four times. Any ideas?
Re^2: appending to a file
by lomSpace (Scribe) on Mar 19, 2009 at 17:05 UTC
    The file test has not failed

      The -e checks for the existence of a file, not writability. So the file test in question won't guarantee that your file can be opened for appending.

      A reply falls below the community's threshold of quality. You may see it by logging in.