2010-07-13 20 views
5

में एक चर के रूप में एक चर का उपयोग कैसे करें एक प्रतिस्थापन में एक चर के रूप में एक चर का उपयोग करने का कोई तरीका है?एक प्रतिस्थापन

my $search = 'looking'; 
my $replace = '"find: $1 ="'; 
my $modifier = 'ee'; 

s/$search/$replace/$modifier; 

मुझे विभिन्न संशोधकों के साथ थोक खोज-प्रतिस्थापन करने के लिए हैश की एक सरणी का उपयोग करने की आवश्यकता है।

+9

कुछ संशोधक को रेगेक्स के अंदर '(? संशोधक: पैटर्न)' के रूप में आपूर्ति की जा सकती है, लेकिन ऐसी चीजें नहीं जो पूरी चीज को/g या/e जैसे प्रभावित करती हैं। यह उन लोगों में से एक है "आप ऐसा क्यों कर रहे हैं" क्षण। यदि आपने हमें बताया कि यह क्या है, तो हम ऊंट के बाल (और सुरक्षा छेद खोलने) के बजाय ब्रश करने के बजाए एक आसान तरीके से आ सकते हैं। – Schwern

+0

@Schwern: और यदि आप अपने ऊंट में छेद खोलते हैं तो यह सबसे अप्रिय है – Borodin

उत्तर

3

हम्म, अगर मैं यह करने के लिए मैं इस तरह करना होता था:

use warnings; 
use strict; 
my @stuff = (
{ 
    search => "this", 
    replace => "that", 
    modifier => "g", 
}, 
{ 
    search => "ono", 
    replace => "wendy", 
    modifier => "i", 
} 
); 
$_ = "this ono boo this\n"; 
for my $h (@stuff) { 
    if ($h->{modifier} eq 'g') { 
     s/$h->{search}/$h->{replace}/g; 
    } elsif ($h->{modifier} eq 'i') { 
     s/$h->{search}/$h->{replace}/i; 
    } 
    # etc. 
} 
print; 

वहाँ केवल बहुत से अलग संशोधक आप मुझे यह लगता है तो उपयोग कर सकते हैं कर रहे हैं काफी आसान है।

आप इसके लिए eval का उपयोग कर सकते हैं, लेकिन यह बहुत गन्दा है।

+7

मेसी दर्शक की नजर में है। मुझे eval समाधान से यह messier लगता है। – runrig

+2

@runrig: इस मामले में "गन्दा" इस बात का संदर्भ नहीं देता कि कोड कैसा दिखता है। यदि आप 'eval' का उपयोग करते हैं तो देखभाल करने के लिए आपको बहुत सी मुश्किल-से-ट्रैक बग की आवश्यकता होती है। –

+0

यह वह समाधान है जिसे मैं स्टैक ओवरफ्लॉक्स से पूछने से पहले सोच रहा था। – bem33

4

यदि आप अपने सुरक्षा चश्मा और अपने विभाजन-दर-शून्य सूट डालते हैं तो आप eval का उपयोग कर सकते हैं।

उदाहरण के लिए:

use strict; 
use warnings; 
sub mk_re { 
    my ($search, $replace, $modifier) = @_; 
    $modifier ||= ''; 
    die "Bad modifier $modifier" unless $modifier =~ /^[msixge]*$/; 
    my $sub = eval "sub { s/($search)/$replace/$modifier; }"; 
    die "Error making regex for [$search][$replace][$modifier]: [email protected]" unless $sub; 
    return $sub; 
} 

my $search = 'looking'; 
my $replace = '"find: $1 ="'; 
my $modifier = 'e'; 

# Sub can be stored in an array or hash 
my $sub = mk_re($search, $replace, $modifier); 

$_ = "abc-looking-def"; 
print "$_\n"; 
$sub->(); 
print "$_\n"; 
+0

मेरा डिवाइड-बाय-शून्य सूट में इसके नीचे एक छेद है जो शून्य से अनंतता – Borodin

4

जबकि eval उपयोग कर एक नया प्रतिस्थापन संकलित करने के लिए विधि शायद सबसे सरल है, तो आप एक प्रतिस्थापन अधिक मॉड्यूलर है कि बना सकते हैं:

use warnings; 
use strict; 

sub subst { 
    my ($search, $replace, $mod) = @_; 

    if (my $eval = $mod =~ s/e//g) { 
     $replace = qq{'$replace'}; 
     $replace = "eval($replace)" for 1 .. $eval; 
    } else { 
     $replace = qq{"$replace"}; 
    } 
    sub {s/(?$mod)$search/$replace/ee} 
} 

my $sub = subst '(abc)', 'uc $1', 'ise'; 

local $_ = "my Abc string"; 

$sub->(); 

print "$_\n"; # prints "my ABC string" 

यह केवल हल्के से परीक्षण किया जाता है, और यह एक व्यायाम के रूप में छोड़ दिया जाता है g

+0

+1 चालाक, जब तक सुरक्षा सावधानी बरतती है ... – dawg

+0

यह एक अच्छा तरीका प्रतीत होता है। मैं देखूंगा। धन्यवाद। – bem33

+0

प्रत्येक प्रतिस्थापन पर 'ई' संशोधक क्यों है? – runrig

2

s/$search/$replace/ जैसे अन्य ध्वज लागू करने के लिए पाठक के लिए पाठ की आवश्यकता है। यह गतिशील संशोधक है जो सीधा नहीं है।

नियमित मिलान modifierspimsx के लिए आप अपने पैटर्न के हिस्से के रूप में फ्लाई पर संशोधक झंडे को संशोधित करने के लिए पर्ल के Extended Patterns का उपयोग कर सकते हैं। उन संशोधकों को चालू/बंद करने के लिए ये (?pimsx-imsx) फॉर्म हैं।

s//e और ee रूपों के लिए, आप एक ही (?{ perl code}) perlre अनुभाग में दस्तावेज़ीकृत उपयोग कर सकते हैं। evale या ee रूपों के लिए, परिणामस्वरूप कोड की सुरक्षा पर विचार करें!

ग्लोबल बनाम पहले मैच में वैश्विक स्तर को संशोधित करने के लिए कोई रूप नहीं है, इसलिए वैश्विक बनाम पहले मैच को अलग-अलग बयानों की आवश्यकता होगी।

2

यहां किनोपिको के उत्तर और eval का संयोजन है।

eval का उपयोग नियंत्रित और रखरखाव फैशन में लुकअप टेबल उत्पन्न करने के लिए किया जाता है, और एक लुकअप टेबल का उपयोग सभी को बचाने के लिए किया जाता है .. elsif .. elsif जो देखने के लिए बहुत मजेदार नहीं है।

(बहुत हल्के से परीक्षण किया)

my @stuff = (
{ 
    search => "this", 
    replace => "that", 
    modifier => "g", 
}, 
{ 
    search => "ono", 
    replace => "wendy", 
    modifier => "i", 
} 
); 
$_ = "this ono boo this\n"; 

my @modifiers = qw{m s i x g e}; 

my $s_lookup = {}; 

foreach my $modifier (@modifiers) { 
    $s_lookup->{$modifier} = eval " sub { s/\$_[0]/\$_[1]/$modifier } "; 
} 

for my $h (@stuff) { 
    $s_lookup->{$h->{modifier}}->($h->{search},$h->{replace}); 
} 

print; 

इस जरूरत को पूरी तरह से उपयोगी हो करने के लिए: संभव संशोधक की

  1. संयोजन
  2. लुकअप तालिका पर
  3. तरह समारोह तो 'एमएसआई' संयोजन और 'गलत संयोजन एक ही कुंजी पर जाएगा।
+0

या बस एक अन्य संशोधक उत्तर जैसे संशोधक सत्यापन जांच जोड़ें। – runrig