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


86

मेरे पास एक स्ट्रिंग है जो इसमें एक दशमलव मान रखता है और मुझे उस स्ट्रिंग को एक फ्लोटिंग पॉइंट वेरिएबल में बदलने की आवश्यकता है। तो मेरे पास जो स्ट्रिंग है उसका एक उदाहरण "5.45" है और मुझे एक फ्लोटिंग पॉइंट समतुल्य चाहिए ताकि मैं इसमें 1 जोड़ सकूं। मैंने इंटरनेट पर चारों ओर खोज की है, लेकिन मैं केवल यह देखता हूं कि स्ट्रिंग को पूर्णांक में कैसे परिवर्तित किया जाए।


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

जवाबों:


90

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

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

26
5.55 एक पूर्णांक नहीं है
ऑरेंजडॉग

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

1
क्या तुलना के बारे में जब स्ट्रिंग में एक अल्पविराम है?
Ramy

[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;'
रेमी

73

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

उदाहरण 1

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

परिणाम

123

उदाहरण 2

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

परिणाम

0

7
AFAIU यह एकमात्र उत्तर है जो पूछा गया था
कौगर

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

मैं foreach my $i ('00'..'15')कुछ स्थानों पर अग्रणी शून्य को हटाने के लिए एक और कर रहा था । 0+एक नंबर के लिए यह कास्टिंग भी हासिल करता है।
स्टेव्सलाइवा

जाहिरा तौर पर यह हेक्स स्ट्रिंग्स के साथ काम नहीं करता है: '0x14C' + 0 में 0 परिणाम (arrggg)
Allasso

41

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

# 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"

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

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


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

4
मैं संख्याओं को गुणा नहीं कर रहा हूं। xस्ट्रिंग प्रतिकृति ऑपरेटर है।
ब्रायन डी फ़ो

3
यह my $string = ( 45/2 ) x 3; # "22.522.522.5"44 के बजाय 45 के साथ नहीं होना चाहिए ? अन्यथा मुझे वह नहीं मिलता जहां परिणाम में '.5 का आना है ...
विकस्टर

10

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

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

अधिक विवरण के लिए http://perldoc.perl.org/functions/sort.html देखें


8

जैसा कि मैं समझता हूँ कि यह int () डेटा प्रकार को निर्दिष्ट करने के लिए एक 'कास्ट' फ़ंक्शन के रूप में अभिप्रेत नहीं है, यह एक अभिजात वर्ग के रूप में संदर्भ को परिभाषित करने के लिए यहां इस्तेमाल किया जा रहा है। मैंने यह सुनिश्चित करने के लिए अतीत में उपयोग किया है कि ($) वैल्यू को संख्या के रूप में माना जाता है।


हां, int()"इस्तेमाल किया जा रहा है" (अब); समझ गया।
नीलमणि_क्री

6
$var += 0

शायद तुम क्या चाहते हो। हालांकि चेतावनी दी जा सकती है, यदि $ var स्ट्रिंग को संख्यात्मक में नहीं बदला जा सकता है, तो आपको त्रुटि मिलेगी, और $ 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

3

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

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


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

5
पर्ल के कई और प्रकार हैं, लेकिन एकल मानों के लिए, यह सिर्फ एक मूल्य है।
ब्रायन डी फॉय

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 अच्छा ole C प्रोग्रामर के लिए) को जोड़ने में मदद की।


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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.