Passing a regex substitution as a variable in Perl?

后端 未结 9 1828
青春惊慌失措
青春惊慌失措 2020-12-13 06:45

I need to pass a regex substitution as a variable:

sub proc {
    my $pattern = shift;
    my $txt = \"foo baz\";

    $txt =~ $pattern;
}

my $pattern = \'s         


        
9条回答
  •  囚心锁ツ
    2020-12-13 07:23

    sub proc {
        my($match, $subst) = @_;
        my $txt = "foo baz";
        $txt =~ s/$match/$subst/;
        print "$txt\n";
    }
    
    my $matcher = qr/foo/;
    my $sub_str = "bar";
    
    proc($matcher, $sub_str);
    

    This rather directly answers your question. You can do more - but when I used a qr// term instead of the $sub_str as a simple literal, then the expanded regex was substituted.

    I recently needed to create a parser (test parser) for statements with some peculiar (dialect of) SQL types, recognizing lines such as this, splitting it into three type names:

    input: datetime year to second,decimal(16,6), integer
    

    The script I used to demo this used quoted regexes.

    #!/bin/perl -w
    use strict;
    while (<>)
    {
        chomp;
        print "Read: <$_>\n";
        my($r1) = qr%^input\s*:\s*%i;
        if ($_ =~ $r1)
        {
            print "Found input:\n";
            s%$r1%%;
            print "Residue: <$_>\n";
            my($r3) = qr%(?:year|month|day|hour|minute|second|fraction(?:\([1-5]\))?)%;
            my($r2) = qr%
                            (?:\s*,?\s*)?   # Commas and spaces
                            (
                                (?:money|numeric|decimal)(?:\(\d+(?:,\d+)?\))?   |
                                int(?:eger)?  |
                                smallint      |
                                datetime\s+$r3\s+to\s+$r3
                            )
                        %ix;
            while ($_ =~ m/$r2/)
            {
                print "Got type: <$1>\n";
                s/$r2//;
            }
            print "Residue 2: <$_>\n";
        }
        else
        {
            print "No match:\n";
        }
        print "Next?\n";
    }
    

    We can argue about the use of names like $r1, etc. But it did the job...it was not, and is not, production code.

提交回复
热议问题