2012-03-30 15 views
9

मैं पर्ल के साथ हाल ही में बहुत काम कर रहा है, फिर भी मैं वास्तव में नहीं पता न कैसे <,>,>=,=<, ne,gt, आदि .. stringified "संख्या", "संख्या" द्वारा पर मैं की तरह कुछ मतलब की तुलना: '1.4 .5.6.7.8.0 'पर्ल ऑपरेटरों और stringified "संख्या"

मुझे सही करते हैं मैं गलत हूँ, निम्नलिखित रिटर्न सच:

if ('1.4.5' > '8.7.8'); 

क्योंकि दोनों सच नहीं है (एक खाली स्ट्रिंग) पर मजबूर कर दिया जाएगा। लेकिन, ne,gt, आदि स्ट्रिंग ऑपरेटर ऐसे नंबरों पर कैसे काम करते हैं?

मूल रूप से मैं तुलना करने के लिए संस्करण संख्या निम्न प्रपत्र शामिल थे कोशिश कर रहा हूँ:

1.3.4.0.2 

मैं प्रत्येक अंक की संख्यात्मक तुलना कर सकते हैं, लेकिन इससे पहले, मैं स्ट्रिंग की तुलना ऑपरेटरों की जानना चाहता हूँ ranther ऐसे तारों पर प्रदर्शन करें।

धन्यवाद,

+1

"1.4.5.6.7.8.0" एक नंबर नहीं है। [Perldata] देखें (http://perldoc.perl.org/perldata.html) और [स्केलर :: उपयोग] (http://search.cpan.org/perldoc?Scalar::Util) 's_ looks_like_number'। – ikegami

+0

मैंने कहा "संख्याएं" – snoofkin

+1

दरअसल, आपने कहा "संख्या": «संख्या" से "मेरा मतलब कुछ है: '1.4.5.6.7.8.0'»। और फिर आपने «'> '» का उपयोग किया, जो प्रत्येक तरफ एक * संख्या * लेता है, इसलिए मेरी टिप्पणी उचित है भले ही आपने "संख्याएं" कहा हो। – ikegami

उत्तर

17

पहले: कृपया use warnings हर समय। आप एक ही बार में निम्नलिखित एहसास हो गया होगा:

$ perl -wle 'print 1 unless "1.4.5" > "8.7.8"' 
Argument "8.7.8" isn't numeric in numeric gt (>) at -e line 1. 
Argument "1.4.5" isn't numeric in numeric gt (>) at -e line 1. 

पर्ल v5.9.0 version के साथ वितरित आया। और इस मॉड्यूल यह बहुत आसान संस्करण संख्याओं की तुलना करने के लिए बनाता है:

use warnings; 
use version; 

my ($small, $large) = (version->parse('1.4.5'), version->parse('8.7.8')); 

print "larger\n" if $small > $large; 
print "smaller\n" if $small < $large; 
8

एक स्ट्रिंग तुलना केवल तभी कार्य करेगा डॉट्स के बीच हर संख्या लम्बाई समान होती है। एक स्ट्रिंग तुलना में संख्या का कोई ज्ञान नहीं है और डॉट्स और अंकों की तुलना करना शुरू कर देगा (क्योंकि वे स्ट्रिंग में दोनों वर्ण हैं)।

वहाँ एक CPAN मॉड्यूल है कि है कि वास्तव में क्या आप देख रहे हैं: Sort::Versions

3

जब आप संख्यात्मक संबंध ऑपरेटरों <, >, आदि का उपयोग कर तार की तुलना, पर्ल एक चेतावनी अगर आप use warnings जारी करता है। हालांकि, पर्ल अभी भी तारों को संख्याओं में बदलने का प्रयास करेगा। यदि स्ट्रिंग अंकों के साथ शुरू होती है, तो पर्ल इनका उपयोग करेगा, अन्यथा स्ट्रिंग 0 के बराबर होगी। आपके उदाहरण में '1.4.5' और '8.7.8' की तुलना में संख्या 1.4 और 8.7 की तुलना में समान प्रभाव पड़ता है।

लेकिन ne, gt आदि के लिए, यह वास्तव में कोई फर्क नहीं पड़ता कि आपके तारों में संख्याएं या कुछ और (डॉट्स सहित) शामिल हैं। इसलिए:

print "greater" if '2.3.4' gt '10.1.2' # prints 'greater' because '2' > '1' stringwise 
print "greater" if '02.3.4' gt '10.1.2' # prints nothing because '0' < '1' stringwise 

इसलिए आप उपयोग नहीं कर सकते न >, <, आदि है और न ही gt, lt, आदि संस्करण की तुलना के लिए, आप अलग दृष्टिकोण का चयन करने, के रूप में एक और जवाब में प्रस्तावित है, उदाहरण के लिए।

2

इस की भूमि के ऊपर पर सुनिश्चित नहीं हैं, लेकिन आप Sort::Naturally कोशिश कर सकते हैं। और विशेष रूप से, ncmp ऑपरेटर।

2

रूप @tent ने कहा, @ SebastianStumpf के समाधान के करीब है, लेकिन नहीं बहुत सही है क्योंकि:

अग्रणी 'वी:

>perl -Mversion -e 'my @n = ("1.10", "1.9"); print "$n[0] is " . (version->parse($n[0]) > version->parse($n[1]) ? "larger" : "smaller") . " than $n[1]\n";' 
1.10 is smaller than 1.9 

सौभाग्य से यह आसानी से version's documentation में संकेत निम्नलिखित हल किया जाता है 'अब स्पष्टता के लिए दृढ़ता से अनुशंसा की जाती है, और छोड़े जाने पर भविष्य की रिलीज में चेतावनी फेंक देगा।

>perl -Mversion -e 'my @n = ("1.10", "1.9"); print "$n[0] is " . (version->parse("v$n[0]") > version->parse("v$n[1]") ? "larger" : "smaller") . " than $n[1]\n";' 
1.10 is larger than 1.9