سؤال

حسنًا ، لقد حصلت على واحدة بسيطة إلى حد ما (على الأقل تبدو بسيطة). لديّ سلسلة متعددة المبطنة وأنا ألعب فقط باستبدال كلمات مختلفة بشيء آخر. دعني اريك...

#!/usr/bin/perl -w
use strict;

$_ = "That is my coat.\nCoats are very expensive.";
s/coat/Hat/igm;
print;

سيكون الإخراج
That is my Hat
Hats are very expensive...

لا ينبغي أن يتم رسملة "القبعة" على السطر الأول. هل هناك أي حيل يمكن أن تجعل الغلاف متوافقًا مع كيفية كتابة اللغة الإنجليزية؟ شكرًا :)

نصائح أخرى

يمكنك استخدام ال e المعدل ل s/// للقيام بالخدعة:

s/(coat)/ucfirst($1) eq $1 ? 'Hat' : 'hat'/igme;

لأحد ، يجب أن تستخدم \b (حدود الكلمة) لمطابقة الكلمة بأكملها فقط. فمثلا s/hat/coat/ سوف يتغير That إلى Tcoat دون قيادة \b. الآن لسؤالك. مع العلم /e يمكنك استخدام رمز Perl في الجزء البديل من Regex. حتى تتمكن من كتابة وظيفة Perl التي تتحقق من حالة المباراة ثم ضبط حالة الاستبدال بشكل صحيح:

my $s = "That is my coat.\nCoats are very expensive.";
$s =~ s/(\bcoat)/&same_case($1, "hat")/igme;
print $s, "\n";

sub same_case {
        my ($match, $replacement) = @_;

        # if match starts with uppercase character, apply ucfirst to replacement
        if($match =~ /^[A-Z]/) {
                return ucfirst($replacement);
        }
        else {
                return $replacement;
        }
}

مطبوعات:

That is my hat.
Hats are very expensive.

قد يحل هذا مشكلتك:


#!/usr/bin/perl -w

use strict;

sub smartSubstitute {
    my $target = shift;
    my $pattern = shift;
    my $replacement = shift;

    $pattern = ucfirst $pattern;
    $replacement = ucfirst $replacement;

    $target =~ s/$pattern/$replacement/gm;

    $pattern = lcfirst $pattern;
    $replacement = lcfirst $replacement;

    $target =~ s/$pattern/$replacement/gm;

    return $target;
}

my $x = "That is my coat.\nCoats are very expansive.";
my $y = smartSubstitute($x, "coat", "Hat");
print $y, "\n";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top