2008-11-14 25 views
74

मैं एक संख्या को पर्ल में अपने संख्यात्मक मूल्य में एक स्ट्रिंग को कैसे परिवर्तित करूं?मैं पर्ल में एक स्ट्रिंग को एक नंबर में कैसे परिवर्तित कर सकता हूं?

+3

कुछ जवाब भ्रमित हैं क्योंकि प्रश्न संपादित किया गया है। Porquero द्वारा उत्तर प्रश्न के इस संस्करण के लिए सबसे अच्छा है। – TimK

+0

प्रश्न को और विस्तार की आवश्यकता है। स्ट्रिंग केवल अंकों से बना है? अक्षरांकीय? ठीक है अगर जोर छीन लिया जाता है? क्या परिणामस्वरूप संख्या के लिए कोई विशिष्ट उद्देश्य है? – JGurtz

उत्तर

83

आप सब पर यह बदलने की आवश्यकता नहीं है:

% perl -e 'print "5.45" + 0.1;' 
5.55 
+18

5.55 एक पूर्णांक नहीं है – OrangeDog

+13

@ ऑरेंजडॉग ओपी ने प्रश्न संपादित किया (इस उत्तर के कुछ महीने बाद पोस्ट किया गया था) - मूल प्रश्न में वास्तव में फ्लोटिंग पॉइंट नंबर थे। – Alnitak

+1

जब स्ट्रिंग में कॉमा है तो तुलना के बारे में क्या? – Ramy

3

पर्ल वास्तव में केवल तीन प्रकार: scalars, सरणियों, और हैश। और यहां तक ​​कि वह भेद बहस योग्य है। ;) प्रत्येक चर के इलाज के तरीके पर निर्भर करता है कि आप इसके साथ क्या करते हैं:

% perl -e "print 5.4 . 3.4;" 
5.43.4 


% perl -e "print '5.4' + '3.4';" 
8.8 
+4

पर्ल के मुकाबले कई और प्रकार हैं, लेकिन एकल मानों के लिए, यह सिर्फ एक है एकल मूल्य –

+2

आप 0 –

40

पर्ल एक संदर्भ-आधारित भाषा है। यह आपके द्वारा दिए गए डेटा के अनुसार अपना काम नहीं करता है। इसके बजाए, यह पता चलता है कि आपके द्वारा उपयोग किए जाने वाले ऑपरेटरों और उस संदर्भ के आधार पर डेटा का इलाज कैसे किया जाए, जिसमें आप उनका उपयोग करते हैं। आप चीजों की संख्या तरह की गतिविधियां करते हैं, तो आप नंबर प्राप्त:

# numeric addition with strings: 
my $sum = '5.45' + '0.01'; # 5.46 

आप चीजों के तार तरह की गतिविधियां करते हैं, तो आप तार मिलती है:

# string replication with numbers: 
my $string = (45/2) x 4; # "22.522.522.522.5" 

पर्ल ज्यादातर का पता लगा लेता क्या करना है और यह ज्यादातर सही है। एक ही बात कहने का एक और तरीका यह है कि पर्ल संज्ञाओं के मुकाबले क्रियाओं के बारे में अधिक परवाह करता है।

क्या आप कुछ करने की कोशिश कर रहे हैं और यह काम नहीं कर रहा है?

+0

भी जोड़ सकते हैं यहां ज्ञान की कमी को क्षमा करें लेकिन मुझे आपका दूसरा उदाहरण नहीं मिला है। आप दो संख्याओं को विभाजित कर रहे हैं, फिर उन्हें गुणा कर रहे हैं, यह एक स्ट्रिंग में कैसे/क्यों परिणाम देता है? – gideon

+4

मैं संख्याओं को गुणा नहीं कर रहा हूं। 'X' स्ट्रिंग प्रतिकृति ऑपरेटर है। –

+1

ओह मैं देखता हूं। धन्यवाद! :) पर्ल यकीन है कि बहुत सारे ऑपरेटरों हैं। – gideon

9

Google एक ही प्रश्न पर पूछते समय मुझे यहां ले जाता है फिल (पूछताछ फ्लोट्स) तो मुझे लगता है कि धागे पुराने होने के बावजूद जवाब पोस्ट करने लायक होगा। मैं पर्ल के लिए नया हूं और अभी भी अपने सिर को चारों ओर लपेट रहा हूं लेकिन ब्रायन डी फोय का बयान "पर्ल ने संज्ञाओं के मुकाबले क्रियाओं के बारे में अधिक परवाह की है।" ऊपर से सिर पर नाखून वास्तव में हिट करता है। इस प्रकार को लागू करने से पहले आपको तारों को फ़्लोट में बदलने की आवश्यकता नहीं है। आपको मूल्यों को संख्याओं के रूप में क्रमबद्ध करने और तारों को क्रमबद्ध करने के लिए सॉर्ट करने की आवश्यकता नहीं है। यानी

my @foo = ('1.2', '3.4', '2.1', '4.6'); 
my @foo_sort = sort {$a <=> $b} @foo; 

तरह

6

बारे में अधिक जानकारी के लिए http://perldoc.perl.org/functions/sort.html देखें मैं समझता हूँ के रूप में यह int() डेटा प्रकार को निर्दिष्ट यह बस जा रहा है (ab) यहाँ संदर्भ परिभाषित करने के लिए प्रयोग किया जाता है के लिए एक 'डाली' समारोह के रूप में इरादा नहीं है एक अंकगणितीय के रूप में। मैंने (एबी) अतीत में (0 + $ वैल) का उपयोग किया है ताकि यह सुनिश्चित किया जा सके कि $ वैल को एक संख्या के रूप में माना जाता है।

54

यह एक सरल उपाय है:

उदाहरण 1

my $var1 = "123abc"; 
print $var1 + 0; 

परिणाम

123 

उदाहरण 2

my $var2 = "abc123"; 
print $var2 + 0; 

परिणाम

0 
+5

AFAIU – Cougar

+0

@ कौगर से पूछा गया यह एकमात्र उत्तर है: मैं सहमत हूं। –

+1

स्ट्रिंग में शून्य जोड़ते समय सावधान रहें। यदि स्ट्रिंग "inf" या "नैन" के साथ शुरू होती है, तो मान शून्य नहीं होगा। ईजी। मेरी $ var2 = "info123"; प्रिंट $ var2 + 0: परिणाम होगा: Inf –

1

तुलना में यह एक फर्क पड़ता है यदि स्केलर एक स्ट्रिंग की संख्या है। और यह हमेशा निर्णायक नहीं है।मैं एक मामले की रिपोर्ट कर सकते हैं जहां पर्ल "वैज्ञानिक" अंकन में एक नाव लिया गया और प्रयोग किया जाता है कि एक ही एक तुलना में नीचे कुछ पंक्तियां:

use strict; 
.... 
next unless $line =~ /and your result is:\s*(.*)/; 
my $val = $1; 
if ($val < 0.001) { 
    print "this is small\n"; 
} 

और यहाँ $val उदा के लिए संख्यात्मक रूप में व्याख्या नहीं की गई थी "2e-77"$line से पुनर्प्राप्त। 0 (या अच्छे ओले सी प्रोग्रामर के लिए 0.0) जोड़ने में मदद मिली।

6
$var += 0 

शायद आप जो चाहते हैं। लेकिन चेतावनी दी, अगर $ वर स्ट्रिंग सांख्यिक में परिवर्तित नहीं किया जा सकता है, तो आपको त्रुटि मिल जाएगा, और $ वर पर रीसेट हो जाएगा:

my $var = 'abc123'; 
print "var = $var\n"; 
$var += 0; 
print "var = $var\n"; 

लॉग

var = abc123 
Argument "abc123" isn't numeric in addition (+) at test.pl line 7. 
var = 0 
0

पर्ल कमजोर टाइप और संदर्भ आधारित है। आपके द्वारा उपयोग किए जाने वाले ऑपरेटरों के आधार पर कई स्केलरों को स्ट्रिंग और संख्या दोनों के रूप में माना जा सकता है। $a = 7*6; $b = 7x6; print "$a $b\n";
आपको 42 777777 मिलते हैं।

हालांकि, एक सूक्ष्म अंतर है। जब आप किसी टेक्स्ट फ़ाइल से डेटा संरचना में संख्यात्मक डेटा पढ़ते हैं, और फिर इसे Data::Dumper के साथ देखते हैं, तो आप देखेंगे कि आपकी संख्या उद्धृत की गई है। पर्ल उन्हें तारों के रूप में आंतरिक रूप से व्यवहार करता है।
पढ़ें: $my_hash{$1} = $2 if /(.+)=(.+)\n/;
डंप: 'foo' => '42'

आप डंप में गैर उद्धृत संख्या चाहते हैं:
पढ़ें: $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;
डंप: 'foo' => 42

बाद $2+0 पर्ल देखती है कि आप एक संख्या के रूप में $ 2 का इलाज किया गया है, क्योंकि आप एक अंकीय ऑपरेटर इस्तेमाल किया।

मैंने Data::Dumper के साथ दो हैंश की तुलना करने की कोशिश करते हुए यह देखा।

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

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