Frage

Ich bin ein kleines Programm zu schreiben, die Getops Benutzereingabe verwendet wird, und auf der Grundlage es dauert, wird das Programm entweder versuchen, ein Muster gegen einen Text passen, oder Ersatztext für das, was abgestimmt.

Das Problem, das ich habe ist, dass ich nicht die Substitution Teil bekommen kann zu arbeiten. Ich freue mich auf die qr // Eintrag in den Manpages: http : //perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators aber ich bin kein Glück nicht mit ihm mit. Ich habe versucht, meinen Code genau wie die Dokumente in diesem Fall zu modellieren. Ich kompilieren ein Übereinstimmungsmuster und ersetzen die in eine Substitution.

Könnte jemand darauf hin, wohin ich gehe falsch? (Keine Sorge zu viel über Sicherheit, das ist nur ein kleines Skript für den persönlichen Gebrauch)

Hier ist, was ich suche unter:

if($options{r}){

    my $pattern = $options{r};
    print "\nEnter Replacement text: ";
    my $rep_text = <STDIN>;

    #variable grab, add flags to pattern if they exist.
    $pattern .= 'g' if $options{g};
    $pattern .= 'i' if $options{i};
    $pattern .= 's' if $options{s};


    #compile that stuff
    my $compd_pattern = qr"$pattern" or die $@;
    print $compd_pattern; #debugging

    print "Please enter the text you wish to run the pattern on: ";
    my $text = <STDIN>;
    chomp $text;    

    #do work and display
    if($text =~ s/$compd_pattern/$rep_text/){ #if the text matched or whatever
        print $text;
    }
    else{
        print "$compd_pattern on \n\t{$text} Failed. ";
    }
} #end R FLAG

Wenn ich es mit -r laufen "/ matt /" -i, und geben Sie den Ersetzungstext 'matthew', auf den Text 'matt', scheitert es. Warum ist das?

EDIT:

Danke für die Antworten Jungs! Das war wirklich sehr hilfreich. Ich kombinierte Ihre beiden Vorschläge in eine funktionierende Lösung für das Problem. Ich habe das / g Flagge ein wenig anders zu handhaben. Hier ist das Arbeits Beispiel:

if($options{r}){

    my $pattern = $options{r};
    print "\nEnter Replacement text: ";
    my $rep_text = <STDIN>;
    chomp $rep_text;

    #variable grab, add flags to pattern if they exist.

    my $pattern_flags .= 'i' if $options{i};
    $pattern_flags .= 's' if $options{s};

    print "Please enter the text you wish to run the pattern on: ";
    my $text = <STDIN>;
    chomp $text;    

    #do work and display
    if($options{g}){
        if($text =~ s/(?$pattern_flags:$pattern)/$rep_text/g){ #if the text matched or whatever (with the g flag)
            print $text;
        }
        else{
            print "$pattern on \n\t{$text} Failed. ";
        }
    }
    else{
        if($text =~ s/(?$pattern_flags:$pattern)/$rep_text/){ #if the text matched or whatever
            print $text;
        }
        else{
            print "$pattern on \n\t{$text} Failed. ";
        }
    }
} #end R FLAG
War es hilfreich?

Lösung

Wie Chaos weist darauf hin, werden Sie einige Schwierigkeiten stoßen qr// verwenden. Benötigen Sie wirklich das Muster vorzukompilieren? Wenn nicht, könnte eine Strategie, wie diese Arbeit:

my $pattern      = 'matt';
my $text         = 'Matt';
my $rep_text     = 'Matthew';
my $pattern_opts = 'i';

print $text, "\n" if $text =~ s/(?$pattern_opts:$pattern)/$rep_text/;

Update in Reaktion auf den neuen Code : Sie könnte einen Ansatz wie dies in Betracht ziehen:

my ($orig, $patt, $rep, $flags) = qw(FooFooFoo foo bar ig);

my $make_replacement = $flags =~ s/g//        ?
    sub { $_[0] =~ s/(?$flags:$patt)/$rep/g } :
    sub { $_[0] =~ s/(?$flags:$patt)/$rep/  }
;

if ( $make_replacement->($orig) ){
    print $orig;
}
else {
    print "Failed...";
}

Andere Tipps

Führen Sie es mit -r "matt", nicht -r "/matt/". Sie brauchen nicht zu, und in der Tat kann es nicht, Versorgungsmuster Begrenzungszeichen in Ihrer Option String. Die Zitate sind die Trennzeichen in Ihrem qr. Also eigentlich ist es sucht nach matt mit Schrägstrichen um ihn herum, so, wie Sie es laufen lassen, das ist nicht das, was Sie wollen. Sie versuchen, die Zitate zu verwenden Perl zu sagen, Ihre Musterzeichenfolge zu behandeln, wie es Quellcode war, aber leider kann man das nicht tun.

Alle, Muster anfügt Sie für die anderen Optionen tun wird auch nicht funktionieren. Sie werden die Art und Weise ändern, müssen Sie die Regex kompilieren, wenn Sie alles, was tun möchten. So etwas wie dies tun könnte es für /i und /s:

my $compd_pattern = qr/$pattern/ or die $@;
$compd_pattern = qr/$compd_pattern/i if $options{i};
$compd_pattern = qr/$compd_pattern/s if $options{s};

Für /g Sie benötigen eine alternative Version der Suche unterstützen / ersetzen. /g ist kein gültiger Modifikator qr//.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top