2010-02-06 11 views
5

मैं निम्नलिखित कोड है:पर्ल मेरी स्ट्रिंग को "1" से क्यों बदलता है?

#$domain = domainname.co.uk 
#$root = public_html 
#$webpage = domainname.co.uk/foo/bar/foobar.html 
my $string = ($webpage =~ s/^$domain//g); 
my $linkFromRoot = $dbh->quote($root . $string); 

आमतौर पर यह ठीक काम करता है, लेकिन किसी कारण से उत्पादन "public_html/foo/बार/foobar.html" के बदले "public_html 1" है।

क्या कोई देख सकता है क्यों?

+5

जब आप इन समस्याओं में भाग लेते हैं, तो यह पता लगाने के लिए कि समस्या डेटा कहां दिखाता है, अपने कोड को विभाजित करना शुरू करें। इस मामले में, आप इसका उपयोग करने से पहले '$ string' के मान की जांच करेंगे, यह पता लगाएं कि यह '1' है, फिर यह देखने के लिए प्रतिस्थापन ऑपरेटर पर पढ़ें कि यह क्या कर रहा है। :) –

+1

फिर से विषय, लेकिन प्लेसहोल्डर के बजाय डीबीआई 'उद्धरण क्यों? :) – hobbs

उत्तर

11

आप सही जवाब क्योंकि प्रतिस्थापन आप रिटर्न 1 जो प्रतिस्थापित आइटम्स की संख्या है नहीं मिल रहा है कैसे। How can I count the number of occurrences of a substring within a string?

$domain = "domainname.co.uk"; 
$root = "public_html"; 
$webpage = "domainname.co.uk/foo/bar/foobar.html"; 
my $string = ($webpage =~ s/^$domain//g); 
print $string."\n"; 

करने के लिए perlfaq4 के जवाब देखें $string निकालें और बस $webpage =~ s/^$domain//g; और फिर $webpage के साथ स्ट्रिंग संयोजन है।

0

के बारे में
$webpage =~ s/^$domain//g; 
my $linkFromRoot = $dbh->quote($root . $webpage); 
7

मुझे लगता है कि आप मानते हैं कि नियमित अभिव्यक्ति के चारों ओर कोष्ठक इसके बारे में एक सूची संदर्भ प्रेरित करते हैं। यह मामला नहीं है। असाइनमेंट ऑपरेटर का बायां संदर्भ निर्धारित करता है, और यह स्केलर है। स्केलर संदर्भ में, s /// सफल प्रतिस्थापन की संख्या देता है। घोषित परिवर्तनीय चर के चारों ओर कोष्ठक डालकर यह वही करता है जो आप करना चाहते हैं, क्योंकि यह सूची संदर्भ के लिए बनाता है।

यह: डोमेन नाम:

my ($string) = $webpage =~ s/^$domain//; 

$ वेबपेज के मैचों हिस्सा लौट आते हैं। यह शायद आप नहीं चाहते हैं। आप या तो S.Mark के कोड हैं:

$webpage =~ s/^$domain//; 
my $linkFromRoot = $dbh->quote($root . $webpage); 

या इस

my ($string) = $webpage =~ /^$domain(.+)$//; 
my $linkFromRoot = $dbh->quote($root . $string); 
+0

मुझे पसंद है कि आपने संदर्भ को समझने में संभावित गलती की व्याख्या की है। पर्ल में यह विषय बहुत महत्वपूर्ण है कि इसे मजबूत करने का मौका छूट जाए। – HerbN

4

पूरी तरह से अपने मूल प्रश्न के विषय से दूर है, लेकिन यह संभव है कि क्या आप वास्तव में चाहते थे:

my $webpage = URI->new("http://domainname.co.uk/foo/bar.html"); 
my $path = $webpage->rel("http://domainname.co.uk/"); 
print "public_html/$path\n"; 
0

यदि आपको किसी अन्य चर की आवश्यकता नहीं है, तो मुझे लगता है कि ऊपर दिए गए उत्तरों बेहतर हैं, लेकिन मेरी पसंदीदा छोटी वाक्यविन्यास चालों में से एक यह तथ्य का लाभ उठाना है कि असाइनमेंट एक लवल्यू है, इसलिए थोड़ा पुनर्गठन कोष्ठक:

(my $string = $webpage) =~ s/^$domain//g; 

आप एक प्रतिलिपि बना सकते हैं और इसे एक कथन में संशोधित कर सकते हैं।

इसके अलावा, अन्य कोड के साथ जो इस कोड के बारे में थोड़ा अजीब है, से शुरू होने वाले पैटर्न पर /g पर बहुत कुछ नहीं है। यह एक से अधिक बार मेल नहीं खा सकता है।

संबंधित मुद्दे