Thank you, it was indeed an error on my part. I originally used $1 in the filter's regexp which does generate a similar error message (that was part of what misled me later). I also pruned a test case now so there aren't thousands of error messages confusing things (which also misled me). For the test case I deleted all but 4 content files (20, 21.5800, 21.5802, 22), then compiled that to get a much smaller list file. And I found a way to run the filter from a command-line interface rather than my application's TUI. I uploaded all the test case files to our server.
Here's the nonworking code without a named variable, just using $1:
test$ grep '#/INT' dir1list.pl -A1 -B3
}
my $rule = Path::Iterator::Rule->new;
if ($id =~ /^([0-9A-F]{2})/) {
$rule->and( sub { m#/INT $1# } );
}
And here's the output, as expected except for the "Use of uninitialized value $1 in regexp compilation" lines and the fact that "Searching file INT 20 DOS 1 TERMINATE PROGRAM.txt" is displayed. (The filter is intended to avoid this scan specifically, as the unique ID indicates that we only want to search pathnames matching "/INT 21".)
test$ ./dir1list.pl --listing TheList/INTERRUP.LST --source source --f
+ind --summary --link 21.58
From "[Link command line switch]": Hyperlink selected: INT 21/AH=58h
Found: "INT 21 - DOS 2.11+ - GET OR SET MEMORY ALLOCATION STRATEGY (AH
+=58h/AL=00h,01h)"
Use of uninitialized value $1 in regexp compilation at ./dir1list.pl l
+ine 1166, <$array_lstff[...]> line 125.
Searching file INT 20 DOS 1 TERMINATE PROGRAM.txt
Use of uninitialized value $1 in regexp compilation at ./dir1list.pl l
+ine 1166.
Searching file INT 2158 DOS 211 GET OR SET MEMORY ALLOCATION STRATEGY.
+txt
source/Interrupt List/INT 21 DOS Function Calls/INT 2158 DOS 211 GET O
+R SET MEMORY ALLOCATION STRATEGY.txt
Found: "INT 21 - DOS 5+ - GET OR SET UMB LINK STATE (AH=58h/AL=02h,03h
+)"
Use of uninitialized value $1 in regexp compilation at ./dir1list.pl l
+ine 1166, <$array_lstff[...]> line 323.
Searching file INT 20 DOS 1 TERMINATE PROGRAM.txt
Use of uninitialized value $1 in regexp compilation at ./dir1list.pl l
+ine 1166.
Searching file INT 2158 DOS 211 GET OR SET MEMORY ALLOCATION STRATEGY.
+txt
Use of uninitialized value $1 in regexp compilation at ./dir1list.pl l
+ine 1166.
Searching file INT 2158 DOS 5 GET OR SET UMB LINK STATE.txt
source/Interrupt List/INT 21 DOS Function Calls/INT 2158 DOS 5 GET OR
+SET UMB LINK STATE.txt
And here's what I reconstructed from my editor as the wrong code I tried, note the minus sign instead of equals sign:
test$ grep '#/INT' minuslst.pl -A1 -B3
my $rule = Path::Iterator::Rule->new;
if ($id =~ /^([0-9A-F]{2})/) {
my $int - $1;
$rule->and( sub { m#/INT $int# } );
}
Here's what this runs like. Note the error messages, including some I didn't notice previously reading "Useless use of subtraction (-) in void context at ./minuslst.pl line 1166." and "Use of uninitialized value $int in subtraction (-) at ./minuslst.pl line 1166, <$array_lstff...> line 125." (It is unfortunate that the subtraction like that only warrants an error at run time and doesn't cause perl to refuse to run the program. I do of course have "use warnings;" and "use strict;" already.) After that the error message that I previously quoted appears multiple times, and the INT 20 file is also searched again.
test$ ./minuslst.pl --listing TheList/INTERRUP.LST --source source --f
+ind --summary --link 21.58
Useless use of subtraction (-) in void context at ./minuslst.pl line 1
+166.
From "[Link command line switch]": Hyperlink selected: INT 21/AH=58h
Found: "INT 21 - DOS 2.11+ - GET OR SET MEMORY ALLOCATION STRATEGY (AH
+=58h/AL=00h,01h)"
Use of uninitialized value $int in subtraction (-) at ./minuslst.pl li
+ne 1166, <$array_lstff[...]> line 125.
Use of uninitialized value $int in regexp compilation at ./minuslst.pl
+ line 1167, <$array_lstff[...]> line 125.
Searching file INT 20 DOS 1 TERMINATE PROGRAM.txt
Use of uninitialized value $int in regexp compilation at ./minuslst.pl
+ line 1167.
Searching file INT 2158 DOS 211 GET OR SET MEMORY ALLOCATION STRATEGY.
+txt
source/Interrupt List/INT 21 DOS Function Calls/INT 2158 DOS 211 GET O
+R SET MEMORY ALLOCATION STRATEGY.txt
Found: "INT 21 - DOS 5+ - GET OR SET UMB LINK STATE (AH=58h/AL=02h,03h
+)"
Use of uninitialized value $int in subtraction (-) at ./minuslst.pl li
+ne 1166, <$array_lstff[...]> line 323.
Use of uninitialized value $int in regexp compilation at ./minuslst.pl
+ line 1167, <$array_lstff[...]> line 323.
Searching file INT 20 DOS 1 TERMINATE PROGRAM.txt
Use of uninitialized value $int in regexp compilation at ./minuslst.pl
+ line 1167.
Searching file INT 2158 DOS 211 GET OR SET MEMORY ALLOCATION STRATEGY.
+txt
Use of uninitialized value $int in regexp compilation at ./minuslst.pl
+ line 1167.
Searching file INT 2158 DOS 5 GET OR SET UMB LINK STATE.txt
source/Interrupt List/INT 21 DOS Function Calls/INT 2158 DOS 5 GET OR
+SET UMB LINK STATE.txt
Finally, the correct code that I intended to try before:
test$ grep '#/INT' dirlist.pl -A1 -B3
my $rule = Path::Iterator::Rule->new;
if ($id =~ /^([0-9A-F]{2})/) {
my $int = $1;
$rule->and( sub { m#/INT $int# } );
}
As you suggested, this actually works just fine. The run shows no more error messages and the INT 20 and INT 22 files aren't searched, as intended:
test$ ./dirlist.pl --listing TheList/INTERRUP.LST --source source --fi
+nd --summary --link 21.58
From "[Link command line switch]": Hyperlink selected: INT 21/AH=58h
Found: "INT 21 - DOS 2.11+ - GET OR SET MEMORY ALLOCATION STRATEGY (AH
+=58h/AL=00h,01h)"
Searching file INT 2158 DOS 211 GET OR SET MEMORY ALLOCATION STRATEGY.
+txt
source/Interrupt List/INT 21 DOS Function Calls/INT 2158 DOS 211 GET O
+R SET MEMORY ALLOCATION STRATEGY.txt
Found: "INT 21 - DOS 5+ - GET OR SET UMB LINK STATE (AH=58h/AL=02h,03h
+)"
Searching file INT 2158 DOS 211 GET OR SET MEMORY ALLOCATION STRATEGY.
+txt
Searching file INT 2158 DOS 5 GET OR SET UMB LINK STATE.txt
source/Interrupt List/INT 21 DOS Function Calls/INT 2158 DOS 5 GET OR
+SET UMB LINK STATE.txt
test$
|