سؤال

وأنا أكتب برنامج صغير أن يأخذ إدخال المستخدم باستخدام Getops، وبناء على ذلك، سيقوم البرنامج إما محاولة لتتناسب مع نمط ضد بعض النصوص، أو نص بديل للما يقابل.

والمشكلة أواجه هو أنني لا يمكن الحصول على جزء استبدال للعمل. أنا أبحث في ريال قطري // دخول في صفحات الرجل: HTTP : //perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators ولكن أنا ليس لها أي حظ معها. حاولت أن نموذج قانون بلدي تماما مثل مستندات في هذه القضية. I تجميع نمط المباراة، واستبدال ذلك إلى إجراء تبديل.

ويمكن أن يشير أحد إلى أين أنا ذاهب خاطئة؟ (لا تقلق بشأن الأمن كثيرا، وهذه ليست سوى سيناريو الصغير للاستخدام الشخصي)

وإليك ما أنا أبحث في:

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

عند I تشغيله مع -r "/ مات /" -i، وأدخل النص البديل "ماثيو"، على النص "مات"، فإنه فشل. لماذا هذا؟

وتحرير:

وشكرا للرفاق إجابات! كان ذلك حقا مفيدة جدا. I الجمع بين كل من اقتراحاتكم في حل العمل لهذه المشكلة. لدي للتعامل مع / ز العلم بشكل مختلف قليلا. هنا هو عينة العمل:

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
هل كانت مفيدة؟

المحلول

وكما يشير الفوضى خارج، سوف تواجه بعض الصعوبات باستخدام qr//. هل كنت حقا بحاجة الى precompile النمط؟ إن لم يكن، ووضع استراتيجية من هذا القبيل يمكن أن تعمل:

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/;

على تحديث ردا على القانون الجديد الخاص : لأنك قد تنظر في استخدام نهج مثل هذا:

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...";
}

نصائح أخرى

وتشغيله مع -r "matt"، وليس -r "/matt/". لم يكن بحاجة إلى ذلك، في واقع الأمر لا يمكن، المحددات نمط العرض في سلسلة ديك الخيار. ونقلت هي المحددات في qr الخاص بك. حتى انها فعلا تبحث عن matt مع مائلة حوله، والطريقة التي تقوم بتشغيل عليه، وهي ليست على ما تريد. كنت تحاول استخدام اقتباسات لأقول بيرل لعلاج سلسلة نمط الخاصة بك مثل ذلك كانت شفرة المصدر، ولكن للأسف لا يمكنك أن تفعل ذلك.

وجميع تلك نمط بإلحاق تفعلونه من أجل خيارات أخرى أيضا لن ينجح. سوف تحتاج إلى تغيير الطريقة التي جمع التعبير المعتاد إذا كنت تريد أن تفعل كل ذلك. شيء من هذا القبيل قد تفعل ذلك ل/i و/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};

ل/g ستحتاج إلى دعم صيغة بديلة للبحث / استبدال. /g ليس معدل صالح لqr//.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top