in reply to create separate output files based on the matched values

The following does the trick. Note that the line ending for the created files is Windows rather than Mac or *nix style.

use warnings; use strict; my %files; while (<DATA>) { my ($name, $data) = /^(\w+)\s+(.*)/; last if ! defined $data || ! length $data; open $files{$name}, '>', "$name.out" if (! defined $files{$name}); syswrite $files{$name}, $data . "\r\n"; } close $files{$_} for (keys %files); __DATA__ T001 Test1 012354 Abcde T001 Test1 013456 bcdef T002 Test2 024567 xxxxx T001 Test1 012354 yyyyy T003 Test3 02345 cdefg T002 Test2 000000 56789

Perl is Huffman encoded by design.

Replies are listed 'Best First'.
Re^2: create separate output files based on the matched values
by Skeeve (Parson) on Sep 27, 2005 at 23:12 UTC
    Are you sure you will get CR LF at the line end on every system? read perldoc perlport:
           In most operating systems, lines in files are terminated by newlines.
           Just what is used as a newline may vary from OS to OS.  Unix tradition-
           ally uses "\012", one type of DOSish I/O uses "\015\012", and Mac OS
           uses "\015".
    
           Perl uses "\n" to represent the "logical" newline, where what is logi-
           cal may depend on the platform in use.  In MacPerl, "\n" always means
           "\015".  In DOSish perls, "\n" usually means "\012", but when accessing
           a file in "text" mode, STDIO translates it to (or from) "\015\012",
           depending on whether you're reading or writing.  Unix does the same
           thing on ttys in canonical mode.  "\015\012" is commonly referred to as
           CRLF.
    
    

    $\=~s;s*.*;q^|D9JYJ^^qq^\//\\\///^;ex;print

      I don't think that the line endings are a particular problem for the OP. The trick is generating the various output files.

      However replacing the syswrite with:

      my $fh = $files{$name}; print $fh "$data\n";

      fixes the problem. What do you expect from a reply written before morning coffee :).


      Perl is Huffman encoded by design.
Re^2: create separate output files based on the matched values
by tariqahsan (Beadle) on Nov 10, 2005 at 19:02 UTC
    What if I want to put a header line for each of the
    generated files?

    What's the best way to do this using this script?

    Thanks for the help!

      Change:

      open $files{$name}, '>', "$name.out" if (! defined $files{$name});

      to

      if (! defined $files{$name}) { open $files{$name}, '>', "$name.out"; syswrite $files{$name}, "This is a header line for file $name.out\ +r\n"; }

      Perl is Huffman encoded by design.