Perl Language
स्ट्रिंग्स और उद्धृत करने के तरीके
खोज…
टिप्पणियों
संस्करण सिंटैक्स हमें उन संस्करणों की रक्षा करने की अनुमति नहीं देता है जो अभी तक मौजूद नहीं हैं, इसलिए यह किसी के लिए वापस जाने और उन्हें एक बार इसे संपादित करने के लिए एक अनुस्मारक है (भूमि: 5.2 पर्ल)। संस्करण रक्षकों को अस्थायी सुविधाओं के लिए "भविष्य" का वर्गीकरण करने की आवश्यकता होती है, जो एक स्रोत चेकआउट करने के लिए पर्याप्त बहादुर लोगों के लिए उपलब्ध हो सकते हैं।
स्ट्रिंग साक्षर उद्धरण
स्ट्रिंग के शाब्दिक अर्थ है कोई पलायन या प्रक्षेप नहीं (स्ट्रिंग टर्मिनेटर को उद्धृत करने के अपवाद के साथ)
print 'This is a string literal\n'; # emits a literal \ and n to terminal
print 'This literal contains a \'postraphe '; # emits the ' but not its preceding \
झड़पों से बचने के लिए आप वैकल्पिक उद्धरण तंत्र का उपयोग कर सकते हैं:
print q/This is is a literal \' <-- 2 characters /; # prints both \ and '
print q^This is is a literal \' <-- 2 characters ^; # also
कुछ चुने हुए उद्धरण वर्ण "संतुलित" हैं
print q{ This is a literal and I contain { parens! } }; # prints inner { }
डबल-हवाले से
डबल-उद्धृत स्ट्रिंग एकल-उद्धृत स्ट्रिंग्स के विपरीत, प्रक्षेप और भागने का उपयोग करते हैं। एक स्ट्रिंग को डबल-कोट करने के लिए, या तो दोहरे उद्धरण चिह्नों का उपयोग करें "
या qq
ऑपरेटर।
my $greeting = "Hello!\n";
print $greeting;
# => Hello! (followed by a linefeed)
my $bush = "They misunderestimated me."
print qq/As Bush once said: "$bush"\n/;
# => As Bush once said: "They misunderestimated me." (with linefeed)
उद्धरण चिह्नों से बचने के लिए qq
यहां उपयोगी है। इसके बिना, हमें लिखना होगा ...
print "As Bush once said: \"$bush\"\n";
... जो अभी उतना अच्छा नहीं है।
पर्ल आपको स्लैश का उपयोग करने के लिए सीमित नहीं करता है /
qq
साथ; आप किसी भी (दृश्यमान) चरित्र का उपयोग कर सकते हैं।
use feature 'say';
say qq/You can use slashes.../;
say qq{...or braces...};
say qq^...or hats...^;
say qq|...or pipes...|;
# say qq ...but not whitespace. ;
आप सरणियों को स्ट्रिंग्स में भी प्रक्षेपित कर सकते हैं।
use feature 'say';
my @letters = ('a', 'b', 'c');
say "I like these letters: @letters.";
# => I like these letters: a b c.
डिफ़ॉल्ट रूप से मान अंतरिक्ष-पृथक होते हैं - क्योंकि विशेष चर $"
एक ही स्थान पर चूक करते हैं। यह निश्चित रूप से बदला जा सकता है।
use feature 'say';
my @letters = ('a', 'b', 'c');
{local $" = ", "; say "@letters"; } # a, b, c
यदि आप पसंद करते हैं, तो आपके पास use English
का use English
करने और इसके बजाय $LIST_SEPARATOR
बदलने use English
विकल्प है:
use v5.18; # English should be avoided on older Perls
use English;
my @letters = ('a', 'b', 'c');
{ local $LIST_SEPARATOR = "\n"; say "My favourite letters:\n\n@letters" }
इससे अधिक जटिल किसी भी चीज के लिए, आपको इसके बजाय एक लूप का उपयोग करना चाहिए।
say "My favourite letters:";
say;
for my $letter (@letters) {
say " - $letter";
}
प्रक्षेप हैश के साथ काम नहीं करता है।
use feature 'say';
my %hash = ('a', 'b', 'c', 'd');
say "This doesn't work: %hash" # This doesn't work: %hash
कुछ कोड संदर्भों के प्रक्षेप का दुरुपयोग करते हैं - इससे बचें ।
use feature 'say';
say "2 + 2 == @{[ 2 + 2 ]}"; # 2 + 2 = 4 (avoid this)
say "2 + 2 == ${\( 2 + 2 )}"; # 2 + 2 = 4 (avoid this)
तथाकथित "कार्ट ऑपरेटर" प्रतिफल @{ ... }
को संदर्भित करता है सरणी संदर्भ [ ... ]
जिसमें अभिव्यक्ति है जिसे आप प्रक्षेपित करना चाहते हैं, 2 + 2
। जब आप इस ट्रिक का उपयोग करते हैं, तो पर्ल एक अनाम सरणी बनाता है, फिर इसे डीरॉफ़ कर देता है और इसे छोड़ देता है।
${\( ... )}
संस्करण कुछ कम बेकार है, लेकिन इसके लिए अभी भी मेमोरी आवंटित करने की आवश्यकता है और इसे पढ़ना और भी कठिन है।
इसके बजाय, लेखन पर विचार करें:
-
say "2 + 2 == " . 2 + 2;
-
my $result = 2 + 2; say "2 + 2 == $result"
Heredocs
बड़े मल्टी-लाइन तार लिखने के लिए बोझ हैं।
my $variable = <<'EOF';
this block of text is interpreted literally,
no \'quotes matter, they're just text
only the trailing left-aligned EOF matters.
EOF
नायब: सुनिश्चित करें कि आप स्टैक-ओवरफ्लो सिंटैक्स हाइलाइटर को अनदेखा करते हैं: यह बहुत गलत है।
और इंटरपोल किए गए हेरेडोक्स उसी तरह काम करते हैं।
my $variable = <<"I Want it to End";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
I Want it to End
5.26.0 * में लंबित एक "इंडेंटेड हेरेडोक" सिंटेक्स है जो आपके लिए बाएं-पेडिंग को ट्रिम करता है
my $variable = <<~"MuchNicer";
this block of text is interpreted.
quotes\nare interpreted, and $interpolations
get interpolated...
but still, left-aligned "I Want it to End" matters.
MuchNicer
अनुगामी newlines निकाल रहा है
फंक्शन chomp
एक न्यूलाइन कैरेक्टर को हटा देगा, यदि मौजूद है, तो उसके पास दिए गए प्रत्येक स्केलर से। chomp
मूल स्ट्रिंग को chomp
करेगा और हटाए गए वर्णों की संख्या वापस कर देगा
my $str = "Hello World\n\n";
my $removed = chomp($str);
print $str; # "Hello World\n"
print $removed; # 1
# chomp again, removing another newline
$removed = chomp $str;
print $str; # "Hello World"
print $removed; # 1
# chomp again, but no newline to remove
$removed = chomp $str;
print $str; # "Hello World"
print $removed; # 0
आप एक बार में एक से अधिक स्ट्रिंग को भी chomp
कर सकते हैं:
my @strs = ("Hello\n", "World!\n\n"); # one newline in first string, two in second
my $removed = chomp(@strs); # @strs is now ("Hello", "World!\n")
print $removed; # 2
$removed = chomp(@strs); # @strs is now ("Hello", "World!")
print $removed; # 1
$removed = chomp(@strs); # @strs is still ("Hello", "World!")
print $removed; # 0
लेकिन आम तौर पर, कितने नई-पंक्तियों के बारे में कोई भी चिंता नहीं, हटा दिया गया तो chomp
आमतौर पर आम तौर पर कारण एक फ़ाइल से पढ़ने लाइनों होने के लिए शून्य संदर्भ में देखा जाता है, और:
while (my $line = readline $fh)
{
chomp $line;
# now do something with $line
}
my @lines = readline $fh2;
chomp (@lines); # remove newline from end of each line