ecm has asked for the wisdom of the Perl Monks concerning the following question:
I am attempting to use a Path::Iterator::Rule "Custom rule subroutine".
I have a regexp during the buildup of my rules, which determines whether the custom rule subroutine is used. If it indicates to use the subroutine, then its capture group $1 at this point holds some text that I want to match in the subroutine to filter for certain pathnames.
With the naive approach, it seems that the $1 or $var variable in my regexp is only expanded at the time of the regexp/subroutine being run. At this point, the variable is no longer valid and could have been overwritten by some other value. Naive code:
my $rule = Path::Iterator::Rule->new; if ($id =~ /^([0-9A-F]{2})/) { my $int = $1; $rule->and( sub { m#/INT $int# } ); }
Resulting errors are many times this line:
Use of uninitialized value $int in regexp compilation at [redacted]/proj/intlist/intlist.pl line 1167.I found that it appears to work if I use a "postponed" regular subexpression like so:
my $rule = Path::Iterator::Rule->new; if ($id =~ /^([0-9A-F]{2})/) { my $int = $1; $rule->and( sub { m#/INT (??{ "$int" })# } ); }
Is this a correct approach? Are there other ways to interpolate a variable at the time of adding the custom rule subroutine, so that the rule doesn't refer to the variable later but rather uses the text that it used to hold?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Interpolate variable into regexp at time of definition rather than execution, as a filter for Path::Iterator::Rule
by ikegami (Patriarch) on Apr 27, 2026 at 21:22 UTC | |
|
Re: Interpolate variable into regexp at time of definition rather than execution, as a filter for Path::Iterator::Rule (updated)
by LanX (Saint) on Apr 27, 2026 at 21:54 UTC |