#!/usr/bin/perl -- use strict; use warnings; use Data::Dump qw/ dd /; my $line = q{11/21/2010 05:02 AM 1,572,696,748 IN11-135.E05}; #11/21/2010 05:02 AM 1,572,696,748 IN11-135.E05 #1234567890 12345678 12345678901234567 # date A10 time +A8 size A18 filename the rest # x2 to ignore spaces between date and time my( $date, $time, $sizewithcommas, $name ) = unpack "A10 x2 A8 x1 A18 A*", $line; dd( [ $date, $time, $sizewithcommas, $name ] ); my $raw = q{ 03/19/2011 04:01 PM 1,451 filename 09/07/2011 05:15 AM dirname }; open my($fh), '<', \$raw ; while(<$fh>){ my( $datetime, $filesizeordirindicator, $filename ) = eval { unpack 'A20 A18 x1 A*', $_ }; warn $@ if $@; dd([ $datetime, $filesizeordirindicator, $filename ]); } __END__ ["11/21/2010", "05:02 AM", " 1,572,696,748", "IN11-135.E05"] 'x' outside of string in unpack at crap line 22, <$fh> line 1. [undef, undef, undef] ["03/19/2011 04:01 PM", " 1,451", "filename"] ["09/07/2011 05:15 AM", " ", "dirname"]