Vincent Lin
Vincent Lin

Reputation: 3

Perl: How come "seek" is not working

I'm trying to go through a bunch of text files twice to look for two different values. However, the seek $fh, 0, 0 doesn't seem to work. Why?

Please help

My codes:

 use strict;
 use warnings;
 ...
 read_in_data_employer();
 read_in_data_union();
 process_files ($FileFolder);
 close $FileHandle;
 ...
 sub process_files
 {
         opendir (DIR, $FileFolder)
                 or die "Unable to open $FileFolder: $!";
         my @files = grep { /.pdf.txt/ } readdir (DIR);
         closedir (DIR);
         @files = map { $FileFolder . '/' . $_ } @files;
         foreach my $file (@files)
         {
                 open (my $txtfile, $file) or die "error opening $file\n";
                 print "$file";
                 LookForEmployer:
                 {
                         print $FileHandle "\t";
                         while (my $line=<$txtfile>)
                         {
                                 foreach (@InputData_Employers)
                                 {
                                         if ($line =~ /\Q$_/i)
                                         {
                                                 print $FileHandle "$_";
                                                 last LookForEmployer;
                                         }
                                 }
                         }
                 }
                 seek ($txtfile, 0, 0);
                 LookForUnion:
                 {
                         print $FileHandle "\t";
                         while (my $line=<$txtfile>)
                         {
                                 print "$.\n";
                                 foreach (@InputData_Unions)
                                 {
                                         if ($line =~ /\Q$_/i)
                                         {
                                                 print $FileHandle "$_";
                                                 last LookForUnion;
                                         }
                                 }
                         }
                 }
                 close $txtfile
         }
 }

Output:

>perl "test.pl" test "employers.txt" "unions.txt" output.txt
test/611-2643-03 (801-0741).pdf.txt12
13
14
15
16
17
18
19
20
21
22
test/611-2643-05 (801-0741).pdf.txt
7
8
9
10
11
12
test/611-2732-21 (805-0083).pdf.txt
2
3
4
5
6
7
8
test/611-2799-17 (801-0152).pdf.txt
6
7
8
9
10
11
12
13
14

Thanks

Upvotes: 0

Views: 562

Answers (1)

ikegami
ikegami

Reputation: 385897

Files don't have line numbers. They don't even have lines. Files just have bytes. That means you can't just ask the system "What line of the file is at this position?"

But, since you're seeking to the start of the file, all you need is to reset $..

use Fcntl qw( SEEK_SET );

seek($txtfile, 0, SEEK_SET)
   or die("seek: $!\n");

$. = 0;

By the way, you program is insanely inefficient. Load the data into hashes or into a database!

Upvotes: 1

Related Questions