পার্লের দুটি স্ট্রিংকে আমি কীভাবে তুলনা করব?


178

পার্লের দুটি স্ট্রিংকে আমি কীভাবে তুলনা করব?

আমি পার্ল শিখছি, আমি এই প্রাথমিক প্রশ্নটি এখানে স্ট্যাকওভারফ্লোতে দেখলাম এবং কোনও ভাল উত্তর পাই নি তাই আমি ভেবেছিলাম আমি জিজ্ঞাসা করব।


3
আপনার প্রথমে পার্লের সাথে আসা দুর্দান্ত দস্তাবেজের সাথে পরামর্শ করা উচিত।
সিনান Ünür

5
আপনি লার্নিং পার্ল (যা আমি সহ-রচনা করেছি) এর মতো কোনও বই চেক করতে চাইতে পারেন । এই প্রশ্নের ভাল উত্তর ছিল না কারণ এটি খুব প্রাথমিক। একটি টিউটোরিয়াল আপনাকে বেসিকগুলি দ্রুত বাছাই করতে সহায়তা করবে।
ব্রায়ান ডি ফোয়

উত্তর:


184

পার্লডোক পার্লপ দেখুন । ব্যবহারের lt, gt, eq, ne, এবং cmpস্ট্রিং তুলনা জন্য উপযুক্ত হিসাবে:

বাইনারি eqহলে TRUE বাম যুক্তি stringwise হয় ডান যুক্তি সমান।

বাইনারি neহলে TRUE বাম যুক্তি stringwise নয় অধিকার যুক্তি সমান।

বাইনারি cmp-1, 0, বা 1 এর উপর নির্ভর করে বাম আর্গুমেন্টটি স্ট্রিংওয়াইজের চেয়ে কম, সমান বা ডান আর্গুমেন্টের চেয়ে বড় whether

বাইনারি ~~তার তর্কগুলির মধ্যে একটি স্মার্টমেচ করে। ...

lt, le, ge, gtএবং cmpকোলেশন (সাজানোর) অর্ডার বর্তমান লোকেল দ্বারা নির্দিষ্ট ব্যবহার করেন একটি লিগ্যাসি ব্যবহার লোকেল (কিন্তু use locale ':not_characters') প্রভাব রয়েছে। পারলোকেলে দেখুন । এগুলি ইউনিকোডের সাথে মিশ্রন করবেন না, কেবলমাত্র লিগ্যাসি বাইনারি এনকোডিংগুলির সাথে। স্ট্যান্ডার্ড ইউনিকোড :: কোলেট এবং ইউনিকোড :: কোলেট :: লোকেল মডিউলগুলি কোলেশন ইস্যুতে আরও অনেক শক্তিশালী সমাধান সরবরাহ করে।


9
আর একটি, সমান না জন্য নে।
পিজেটি

4
আপনি উল্লেখ করতে চাইতে পারেন যে $ str1 = ~ "$ str2" (/ / str2 / নয়) will str2 $ str1 এর একটি স্ট্রিং কিনা তা পরীক্ষা করবে will
ড্যানিয়েল সি। সোব্রাল

@ ড্যানিয়েল indexএকটি স্ট্রিং অন্য স্ট্রাস্টিং কিনা তা দেখতে ব্যবহার করুন ।
সিনান Ünür

3
@ ড্যানিয়েল: = ~ "$ str2" এবং = ~ / $ str2 / (বা সেই বিষয়ে কেবল = ~ $ str2) এর মধ্যে খুব বেশি ব্যবহারিক পার্থক্য নেই; সূচকটি সঠিক সরঞ্জাম, তবে যদি কোনও কারণে আপনাকে একটি রেইজেক্স ব্যবহার করতে হয়, তবে = ~ / \ Q $ str2 \ E / করুন।
ysth

1
@ ইলিয়ারোস্টভটসেভ !=এবং neএক নয়, কারণ !=এবং neএটি আলাদা হতে সংজ্ঞায়িত হয়েছে। এটা কত কঠিন ?! একটি সংখ্যার তুলনা অপারেটর হওয়ায় এর !=দুটি অপারেশনকে সংখ্যায় রূপান্তর করে perl -E 'say "equal" if not "a" != "b"'
সিনান Ünür

137
  • cmp তুলনা করা

    'a' cmp 'b' # -1
    'b' cmp 'a' #  1
    'a' cmp 'a' #  0
    
  • eq সমান

    'a' eq  'b' #  0
    'b' eq  'a' #  0
    'a' eq  'a' #  1
    
  • ne অসমান

    'a' ne  'b' #  1
    'b' ne  'a' #  1
    'a' ne  'a' #  0
    
  • lt এর চেয়ে কম

    'a' lt  'b' #  1
    'b' lt  'a' #  0
    'a' lt  'a' #  0
    
  • le অপেক্ষাকৃত ছোট বা সমান

    'a' le  'b' #  1
    'b' le  'a' #  0
    'a' le  'a' #  1
    
  • gt অপেক্ষা বৃহত্তর

    'a' gt  'b' #  0
    'b' gt  'a' #  1
    'a' gt  'a' #  0
    
  • ge এর চেয়ে বড় বা সমান

    'a' ge  'b' #  0
    'b' ge  'a' #  1
    'a' ge  'a' #  1
    

দেখুন perldoc perlopআরও তথ্যের জন্য।

(আমি এটিকে সামান্যই সহজ করে দিচ্ছি তবে cmpএকটি শূন্য স্ট্রিং এবং এর পরিবর্তে একটি সংখ্যাসূচক শূন্য মান 0এবং একটি মান যা স্ট্রিং '1'এবং সংখ্যাসূচক মান উভয়ই ফিরিয়ে দিচ্ছি 1These এগুলি হ'ল একই মানগুলি পার্লের বুলিয়ান অপারেটরদের কাছ থেকে সর্বদা পান You আপনি বুলিয়ান বা সংখ্যাসূচক ক্রিয়াকলাপের জন্য কেবল রিটার্ন মানগুলি ব্যবহার করা উচিত, এক্ষেত্রে পার্থক্যটি আসলে কোনও বিষয় নয়))


8
আমি এই উত্তরটি আরও পছন্দ করি। সংক্ষিপ্ত সাধারণ উদাহরণগুলি সাধারণত ব্যালাল মাল্টিপেজ ডকস রেফারেন্সের চেয়ে নবাবিদের জন্য আরও বেশি সহায়ক।
জোন

@Zon ব্যতীত যে রিটার্ন মান eq, gt, ltইত্যাদি সঠিক নয় ... তারা সত্য বা মিথ্যা ফিরে। শুধুমাত্র cmpনির্দিষ্ট সংখ্যাসূচক মান প্রদান করে।
সিনান Ünür

পার্ল 6 এটির legপরিবর্তে সাধারণ অপারেটরগুলি ব্যবহার করে cmpযার পরিবর্তে জেনেরিক তুলনার জন্য ব্যবহৃত হয়।
ব্র্যাড গিলবার্ট

17

সিনান Ünür স্ট্রিং তুলনা অপারেটরগুলির তালিকাভুক্তকরণের যোগে পার্ল ৫.১০ স্মার্ট ম্যাচ অপারেটর যুক্ত করে।

স্মার্ট ম্যাচ অপারেটর তাদের ধরণের ভিত্তিতে দুটি আইটেমের তুলনা করে। 5.10 আচরণের জন্য নীচের চার্টটি দেখুন (আমি বিশ্বাস করি যে এই আচরণটি 5.10.1-এ সামান্য পরিবর্তিত হচ্ছে):

perldoc perlsyn"বিস্তারিত স্মার্ট ম্যাচিং" :

স্মার্ট মিলের আচরণ নির্ভর করে যে কী ধরণের জিনিস এর যুক্তি are এটি সর্বদা পরিবর্তিত, অর্থাত্ $a ~~ $bএকই আচরণ করে $b ~~ $a। আচরণটি নিম্নলিখিত সারণি দ্বারা নির্ধারিত হয়: প্রথম সারি যা প্রয়োগ হয়, উভয় ক্রমে মিলের আচরণ নির্ধারণ করে।

  Imp a $ b মিলিত প্রকারের মিশ্রিত মিল কোড
  ===== ========================================
  (ওভারলোডিং ট্রাম্প সবকিছু)

  কোড [+] কোড [+] রেফারেনশিয়াল সমতা $ a == $ খ   
  যে কোনও কোড [+] স্কেলার সাব সত্য $ বি -> ($ এ)   

  হ্যাশ হ্যাশ হ্যাশ কীগুলি অভিন্ন [সাজানোর কীগুলি% $ এ] ~~ [সাজানোর কীগুলি% $ বি]
  হ্যাশ অ্যারে হ্যাশ স্লাইস অস্তিত্ব গ্রেপ {উপস্থিত $ এ -> {$ _}} @ $ বি
  হ্যাশ রেজেক্স হ্যাশ কী গ্রেপ গ্রেপ / $ বি /, কী% $ এ
  হ্যাশ যে কোনও হ্যাশ প্রবেশের অস্তিত্ব বিদ্যমান $ a -> {$ b}

  অ্যারে অ্যারে অ্যারেগুলি অভিন্ন [*]
  অ্যারে রেজেক্স অ্যারে গ্রেপ গ্রেপ / $ বি /, @। এ
  অ্যারে নুম অ্যারেতে গ্রেপ number _ == $ বি, @। এ সংখ্যা রয়েছে 
  অ্যারে যে কোনও অ্যারেতে স্ট্রিং গ্রেপ contains _ ইক $ বি, @। এ রয়েছে 

  কোনও অপরিবর্তিত অপরিজ্ঞাত! সংজ্ঞায়িত $ ক
  যেকোন রেজেক্স প্যাটার্ন ম্যাচ $ a = ~ / $ বি / 
  কোড () কোড () ফলাফলগুলি সমান $ a -> () eq $ b -> ()
  যে কোনও কোড () সাধারণ বন্ধের সত্য $ b -> () # উপেক্ষা করা $ ক
  সংখ্যা নির্লজ্জ [!] সংখ্যা সমতা $ a == $ খ   
  যে কোনও স্ট্রিং স্ট্রিং সমতা $ a eq $ b   
  যে কোনও সংখ্যার সাম্যিক সমতা $ a == $ খ   

  যে কোনও স্ট্রিং সমতা $ a eq $ b   

+ - এটি অবশ্যই একটি কোড রেফারেন্স হতে হবে যার প্রোটোটাইপ (উপস্থিত থাকলে) "" নয়
(একটি "প্রোটোটাইপ সহ সাবস্ক্রিপশন নীচে 'কোড ()' এন্ট্রি দ্বারা ডিল করা হয়) 
* - অর্থাৎ প্রতিটি উপাদান অপরটিতে একই সূচকের উপাদানটির সাথে মেলে
অ্যারে। যদি একটি বিজ্ঞপ্তি রেফারেন্স পাওয়া যায়, আমরা রেফারেন্সিয়াল ফিরে ফিরে
সমতা।   
! - হয় আসল সংখ্যা, অথবা একটি স্ট্রিং যা সংখ্যার মতো দেখাচ্ছে

"ম্যাচিং কোড" প্রকৃত মিলের কোডটির প্রতিনিধিত্ব করে না, অবশ্যই: এটির উদ্দেশ্যটি ব্যাখ্যা করার জন্য এটি কেবলমাত্র। গ্রেপ থেকে ভিন্ন, স্মার্ট ম্যাচ অপারেটর যখনই এটি করতে পারে শর্ট সার্কিট করবে।

ওভারলোডিংয়ের মাধ্যমে কাস্টম মিলে যাওয়া কোনও ~~অপারেটরকে ওভারলোড করে যেভাবে কোনও বস্তুর সাথে মেলে সেভাবে পরিবর্তন করতে পারেন । এটি স্বাভাবিক স্মার্ট ম্যাচের শব্দার্থবিজ্ঞানগুলি ট্রাম্প করে। দেখুন overload


এটি সামান্য পরিবর্তন হচ্ছে না: এটি আমূল পরিবর্তন হচ্ছে। সহজ-সরল যে কোনও কিছুর জন্য স্মার্ট মেলিং গুরুতরভাবে ভেঙে গেছে।
ব্রায়ান ডি ফোয়

1
মধ্যবর্তী সময়ে ডকস পরিবর্তিত হওয়ায় লিঙ্কটি সম্ভবত পরিবর্তন করা উচিত। 5.14.2 বর্তমান
ব্র্যাড গিলবার্ট

10
print "Matched!\n" if ($str1 eq $str2)

পার্লের পৃথক স্ট্রিং তুলনা এবং সংখ্যার তুলনা অপারেটর রয়েছে ভাষায় আলগা টাইপিংয়ের ক্ষেত্রে সহায়তা করতে। আপনার বিভিন্ন অপারেটরের জন্য পার্লপ পড়তে হবে।


8

এই প্রশ্নের সুস্পষ্ট সাবটেক্সট হ'ল:

আপনি কেবল ==দুটি স্ট্রিং একই কিনা তা পরীক্ষা করতে কেন ব্যবহার করতে পারবেন না ?

পার্লের পাঠ্য বনাম সংখ্যাগুলির জন্য পৃথক ডেটা ধরণের নেই। তারা উভয়ই "স্কেলার" টাইপ দ্বারা উপস্থাপিত হয় । অন্য উপায় রাখুন স্ট্রিং হয় সংখ্যার যদি আপনি তাদের যেমন ব্যবহার

if ( 4 == "4" ) { print "true"; } else { print "false"; }
true

if ( "4" == "4.0" ) { print "true"; } else { print "false"; }
true

print "3"+4
7

যেহেতু পাঠ্য এবং সংখ্যাগুলি ভাষার দ্বারা পৃথক নয়, তাই আমরা ==উভয় ক্ষেত্রেই সঠিকভাবে কাজ করতে অপারেটরটিকে ওভারলোড করতে পারি না। অতএব, পার্ল eqমানকে পাঠ্যের হিসাবে তুলনা করে :

if ( "4" eq "4.0" ) { print "true"; } else { print "false"; }
false

if ( "4.0" eq "4.0" ) { print "true"; } else { print "false"; }
true

সংক্ষেপে:

  • পার্লের কাছে কেবল পাঠ্য স্ট্রিংয়ের জন্য কোনও ডেটা-টাইপ নেই
  • সংখ্যা হিসাবে দুটি অপারেশন তুলনা করতে ==বা ব্যবহার !=করুন
  • পাঠ্য হিসাবে দুটি অপারেশন তুলনা করতে eqবা ব্যবহার neকরুন

অন্যান্য অনেক ফাংশন এবং অপারেটর রয়েছে যা স্কেলারের মানগুলির তুলনা করতে ব্যবহার করা যেতে পারে, তবে এই দুটি ফর্মের মধ্যে পার্থক্য জানার একটি গুরুত্বপূর্ণ প্রথম পদক্ষেপ।


জাভাতেও একই সমস্যা রয়েছে, তবে ভিন্ন কারণে (এবং বিভিন্ন প্রভাবের সাথে)।
নোবার

1

এবং যদি আপনি দুটি স্ট্রিংয়ের মধ্যে পার্থক্যগুলি বের করতে চান তবে আপনি স্ট্রিং :: ডিফ ব্যবহার করতে পারেন ।


আপনি যদি পার্ল ডকুমেন্টেশনের সাথে লিঙ্ক করতে চলেছেন তবে সাধারণত পারমালিঙ্কস ব্যবহার করার পরামর্শ দেওয়া হয় যা সর্বদা মডিউলটির নতুন সংস্করণে লিঙ্ক থাকবে। search.cpan.org/perldoc/String::Diff search.cpan.org/perldoc?String::Diff p3rl.org/String::Diff metacpan.org/module/String::Diff metacpan.org/pod/String: : ডিফ হয়ে গেছে
ব্র্যাড গিলবার্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.