in reply to Compare Partial Lines of 2 Text Files

my solution is almost the same as GrandFather's, except for the use of unpack() instead of a regex to split the lines.

this may be noticeably faster with large files; however, the perl regex engine is often so well optimized that, in the case of a simple regex like the one below, the actual code generated may actually be an unpack() call or something very like it!

three variations are presented; all produce the same output.

only the section of the code that differs is presented below.

(and, yes, you should have considered GrandFather's response more carefully before replying.)

use constant UNPACKER => 'A24 A*'; open IN, '<', \$file1; while (<IN>) { # my ($key, $tail) = m/(.{24})(.*)/; # my ($key, $tail) = unpack('A24 A*', $_); # my ($key, $tail) = unpacker(); my ($key, $tail) = unpack(UNPACKER, $_); push @{$f1Lines{$key}}, [$tail, $.]; } close IN; open IN, '<', \$file2; while (<IN>) { # my ($key, $tail) = m/(.{24})(.*)/; # my ($key, $tail) = unpack('A24 A*', $_); # my ($key, $tail) = unpacker(); my ($key, $tail) = unpack(UNPACKER, $_); next unless exists $f1Lines{$key}; my @matches = @{$f1Lines{$key}}; print "Line $. of file2 ($key$tail) matches:\n"; print " line $_->[1] of file1 ($key$_->[0])\n" for @matches; } close IN; sub unpacker { unpack('A24 A*', $_) }

Replies are listed 'Best First'.
Re^2: Compare Partial Lines of 2 Text Files
by Knoperl (Acolyte) on Jul 31, 2007 at 20:21 UTC
    I would like to express my gratitude to Grandfather and Anonymous Monk for their assistance on this code.

    As to my reply and whether I have a brain or being more careful, I really had good intentions. I realized that I could have made the question more verbose and was concerned that I was not being clear and thus confusing. That is why when I saw there was no filehandling in the code of Grandfather I felt that it was my fault for not telling him exactly what I was looking for.

    I do apologize and hope with my public display of penance that I will be forgiven.