পার্লে একটি অ্যারের আকার সন্ধান করুন


243

মনে হচ্ছে একটি অ্যারের আকার খুঁজে পেতে আমি বিভিন্ন উপায়ে এসে পৌঁছেছি। এই তিনটি পদ্ধতির মধ্যে পার্থক্য কী?

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size

13
অন্য কোন উপায়ে: print 0+@arr, print "".@arr,print ~~@arr
ভিড়

3
@mob, হুম, এক এড়িয়ে যেতে চাইতে পারেন "".@arrযেমন "@arr"কিছু পুরোপুরি ভিন্ন না।
ইকেগামি

39
"দ্বিতীয় উপায়" অ্যারে আকার মুদ্রণ করার উপায় নয় ...
tadmc

স্কেলারের প্রসঙ্গে; @ অার টেবিলের আকার দেয়। $ x = @ আরআর স্কেলার প্রসঙ্গ। $ # অ্যারের অ্যারের শেষ সূচকটি প্রদান করে। সূচী 0 থেকে শুরু হয়, তারপরে সত্য সমীকরণ $ # আরআর + 1 == @ অর। যদি আপনি কিছু উপাদান ক্রম ছাড়াই লিখেন, উদাহরণস্বরূপ $ আরআর [100] = 'যেকোন', তবে টেবিলটি স্বয়ংক্রিয়ভাবে সর্বোচ্চ সূচক 100, এবং (সূচক 0 সহ) 101 টি উপাদানে উন্নত হবে।
Znik

উত্তর:


234

প্রথম এবং তৃতীয় উপায় একই: তারা স্কেলার প্রসঙ্গে একটি অ্যারের মূল্যায়ন করে। আমি এটিকে অ্যারের আকার পাওয়ার মানক উপায় হিসাবে বিবেচনা করব।

দ্বিতীয় উপায়টি আসলে অ্যারের শেষ সূচকটি দেয়, যা (সাধারণত) অ্যারের আকারের মতো হয় না।


29
(1,2,3) এর আকার 3, এবং সূচকগুলি (ডিফল্টরূপে) 0, 1 এবং 2 হয় So সুতরাং, $ # আরার এই ক্ষেত্রে 2 হবে, 3 নয়
নেট সি কে

5
পূর্বনির্ধারিত ভেরিয়েবলটি $["অ্যারেতে প্রথম উপাদানটির সূচক এবং একটি স্ট্রিংয়ের প্রথম অক্ষরের সূচক" নির্দিষ্ট করে perldoc perlvar। এটি ডিফল্টরূপে 0 এ সেট করা হয়েছে এবং 0 এর বাইরে অন্য যে কোনও কিছুতে সেট করা অত্যন্ত নিরুৎসাহিত।
কিথ থম্পসন

5
@ কিথ থম্পসন $[নিরুৎসাহিত হয়েছেন (এবং এক দশক ধরে হয়েছে)। $[অবচয় করা হয়। $[এমনকি যখন কেউ সতর্কতা চালু না করে তখনই হতাশার সতর্কতা ইস্যুগুলি ব্যবহার করা । $[5.16 এ শূন্য ব্যতীত অন্য কোনও কিছু নির্ধারণ করা ত্রুটি হবে be আমরা $[ইতিমধ্যে উল্লেখ বন্ধ করতে পারি ?
ইকেগামি

2
@ কিথ থম্পসন, আসলে 5.14 এর চেয়ে পুরানো। তবে আমি যেমন বলেছিলাম, এটি তার চেয়ে দীর্ঘ সময়ের জন্য নিরুৎসাহিত করা হয়েছে এবং অবহেলা করা হয়েছে, এবং যে কেউ এর ব্যবহার সম্পর্কে $[জানতে পারে।
ইকেগামি

7
@ পাইগামি: হ্যাঁ, তবে কেউ পার্থক্যটি বোঝার চেষ্টা করছে scalar @arrএবং এখনও এর সম্ভাব্য প্রভাবগুলি বোঝা $#arrউচিত , যদিও তা তারা বিরল। $[
কিথ থম্পসন

41

প্রথম, দ্বিতীয়টি অন্য দুটির সমতুল্য নয়। $#arrayঅ্যারের শেষ সূচকটি প্রদান করে, যা অ্যারের আকারের চেয়ে কম less

অন্য দুটি কার্যত একই। স্কেলারের প্রসঙ্গ তৈরি করতে আপনি কেবল দুটি ভিন্ন উপায় ব্যবহার করছেন। এটি পাঠযোগ্যতার প্রশ্নে নেমে আসে।

আমি ব্যক্তিগতভাবে নিম্নলিখিতগুলি পছন্দ করি:

say 0+@array;          # Represent @array as a number

আমি এটার থেকে আরও স্পষ্ট মনে করি

say scalar(@array);    # Represent @array as a scalar

এবং

my $size = @array;
say $size;

উত্তরোত্তর একা বেশ পরিষ্কার দেখায় তবে আমি দেখতে পাই যে অতিরিক্ত কোডটি অন্য কোডের অংশ হিসাবে স্পষ্টতা থেকে দূরে সরে যায়। @arrayস্কেলারের প্রসঙ্গে কী করে তা শেখানোর জন্য এটি দরকারী এবং আপনি যদি $sizeএকাধিকবার ব্যবহার করতে চান তবে ।


15
ব্যক্তিগতভাবে আমি সেই সংস্করণটি পছন্দ করি যা "স্কেলার" কীওয়ার্ডটি ব্যবহার করে, কারণ এটি একেবারে স্পষ্ট। my $size=@arrayদেখে মনে হচ্ছে এটি ভুল হতে পারে যেখানে ভুল সিগিল ব্যবহার করা হয়েছিল।
নাট সি কে

5
এটা সত্যিই খারাপ ধারণা। যে লোকেরা scalarবিনা কারণে ব্যবহার করেন তারা ভুল পাঠ শিখেন। তারা তাদের মাথায় startুকতে শুরু করে যে অপারেটরগুলি তালিকা ফিরিয়ে দেয় যা স্কেলারে জোর করা যেতে পারে। কয়েক ডজন দেখেছি।
ইকগামি

2
কেন এই "কারণ নেই"? আপনি ব্যবহার করছেন scalarকারণ আপনি তালিকাটিকে কোনও স্কেলারের প্রসঙ্গে প্রযোজ্য করছেন। এটি ব্যবহারের সঠিক কারণ। আপনার উদাহরণ হুবহু একই জিনিসটি করে তবে আপনি যখন কোনও স্পিরিচাল স্ক্যালার প্রসঙ্গে তালিকার পরিবর্তনশীলকে মূল্যায়ন করেন তখন পার্ল কী করে তার উপর নির্ভর করে। সুতরাং, আপনার উদাহরণটির প্রসঙ্গে পার্লের অন্তর্নিহিত আচরণ সম্পর্কে পাঠককে জানতে হবে। আপনি কেবল এক্সপ্রেশনটিতে অন্তর্নিহিত আচরণের আরও একটি স্তর যুক্ত করছেন, এবং পার্ল এর মধ্যে ইতিমধ্যে অত্যধিক অন্তর্নিহিত আচরণ রয়েছে যা আপনাকে কোনও প্রোগ্রামটি বোঝার জন্য যুক্তিযুক্ত করতে হবে to
নাট সি কে

2
@ নাট সিকে, পুনরায় "কেন এটি" কোনও কারণ নয়? আপনি ব্যবহার করছেন scalarকারণ আপনি তালিকাটিকে একটি মজাদার প্রসঙ্গে "চাপিয়ে দিচ্ছেন", আপনি ভুল পাঠ শেখার বিষয়ে আমার বক্তব্যটি প্রমাণ করেছেন। এটি সম্পূর্ণ মিথ্যা। কোনও তালিকা কখনই জোর করে না scalar। (যদি এটি হয়, scalar(@array)এবং scalar(@array[0..$#array])একই জিনিসটি ফিরে আসবে)) কোনও স্কেলার ফিরিয়ে দিতে scalar(@array)বলে @array, যা আপনি ইতিমধ্যে এটি করতে বলেছিলেন my $size=
ইকেগামী

2
বিশ্বাস করুন বা না করুন, বিকাশকারীদের অন্যান্য বিকাশকারীদের দ্বারা লিখিত কোডটি ডিবাগ করতে হবে। এবং বিকাশকারীদের তিন বছর আগে তারা লিখেছিল যে কোডটি ডিবাগ করতে হবে।
নাট সি কে

27

এটি অ্যারেটিকে স্কেলার প্রসঙ্গে জোর করে আকার পেয়েছে, এটির আকার হিসাবে এটি মূল্যায়ন করা হয়:

print scalar @arr;

এটি স্কেলার প্রেক্ষাপটে অ্যারে জোর করার অন্য একটি উপায়, যেহেতু এটি একটি স্কেলার ভেরিয়েবলের জন্য নির্ধারিত করা হয়েছে:

my $arrSize = @arr;

এটি অ্যারের শেষ উপাদানটির সূচক পায়, সুতরাং এটি আসলে আকারের বিয়োগ 1 টি (ধরে নেওয়া সূচকগুলি 0 থেকে শুরু হয় যা পার্লের সাথে সামঞ্জস্যযোগ্য যদিও এটি করা সাধারণত একটি খারাপ ধারণা):

print $#arr;

এই শেষটি অ্যারে আকার পাওয়ার জন্য ব্যবহার করা সত্যই ভাল নয়। আপনি যদি অ্যারের শেষ উপাদানটি পেতে চান তবে এটি কার্যকর হবে:

my $lastElement = $arr[$#arr];

এছাড়াও, আপনি এখানে স্ট্যাক ওভারফ্লোতে দেখতে পাচ্ছেন, এই নির্মাণটি বেশিরভাগ সিনট্যাক্স হাইলাইটার দ্বারা সঠিকভাবে পরিচালিত হয় না ...


2
একটি সিডেনোট: কেবলমাত্র $arr[-1]শেষ উপাদানটি পেতে ব্যবহার করুন । এবং $arr[-2]পেনাল্টিমেট এক পেতে, এবং আরও অনেক কিছু।
tuomassalo

1
@ টিওমাসালো: আমি সম্মত হই যে আপনার পরামর্শটি আরও ভাল পদ্ধতির। পূর্ববর্তী ক্ষেত্রে, $#arrখুব দরকারী বৈশিষ্ট্য নয় এবং এটি অন্য কোনও ভাষায় না থাকার কোনও দুর্ঘটনা নেই।
নেট সি কে

6

দ্বিতীয় উপায়টি ব্যবহার করতে, 1 যুক্ত করুন:

print $#arr + 1; # Second way to print array size

for [0..$#array] { print $array[$_ ] } যদিও উপাদানগুলির সংখ্যা পাওয়ার উদ্দেশ্যটি অ্যারের মাধ্যমে পুনরাবৃত্তি হয় তবে তা সত্যিই ভাল কাজ করে। সুবিধাটি হ'ল আপনি এলিমেন্টটি পাওয়ার পাশাপাশি একটি কাউন্টারও যা প্রান্তিকভাবে তৈরি করা হয়েছে।
ওয়েস্টরক

5

আমরা যদি দ্বিতীয়টিকে কিছুটা পরিবর্তন করি তবে তিনটিই একই ফলাফল দেয়:

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;

5
কি ইতিমধ্যে উল্লেখ করা হয়েছে থেকে এই কিছু ভিন্ন এই উত্তর এবং এই এক?
ডিভনুল

5

উদাহরণ:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2

2

"পার্ল পরিবর্তনশীল ধরনের" বিভাগে এর perlintro ডকুমেন্টেশন রয়েছে

বিশেষ পরিবর্তনশীল $#arrayআপনাকে একটি অ্যারের শেষ উপাদানটির সূচকটি বলে:

print $mixed[$#mixed];       # last element, prints 1.23

$#array + 1অ্যারেতে কয়টি আইটেম রয়েছে তা আপনাকে বলার জন্য আপনাকে প্ররোচিত হতে পারে । বিরক্ত করবেন না। যেমনটি ঘটে, @arrayপার্ল যেখানে স্কেলারের মান ("স্ক্যালারের প্রসঙ্গে") সন্ধানের প্রত্যাশা করে তা ব্যবহার করে আপনাকে অ্যারের উপাদানগুলির সংখ্যা দেবে:

if (@animals < 5) { ... }

Perldata ডকুমেন্টেশন এছাড়াও এই কভার "স্কালে মান" বিভাগে

আপনি যদি স্কেলার প্রসঙ্গে একটি অ্যারের মূল্যায়ন করেন তবে এটি অ্যারের দৈর্ঘ্য প্রদান করে। (মনে রাখবেন যে তালিকার ক্ষেত্রে এটি সত্য নয়, যা সি কমা অপারেটরের মতো শেষ মানটি দেয় না, বা বিল্ট-ইন ফাংশনগুলিও যা তারা ফিরে আসার মতো যা মনে করে তা ফিরিয়ে দেয়)) নীচে সর্বদা সত্য:

scalar(@whatever) == $#whatever + 1;

কিছু প্রোগ্রামার একটি স্পষ্ট রূপান্তর ব্যবহার করতে পছন্দ করে যাতে সন্দেহের কিছু না ছেড়ে যায়:

$element_count = scalar(@whatever);

এর আগে একই বিভাগে একটি অ্যারের শেষ উপাদানটির সূচকটি কীভাবে প্রাপ্ত তা নথিভুক্ত করে।

একটি অ্যারের দৈর্ঘ্য একটি স্কেলারের মান। আপনি যেমন হিসাবে @daysমূল্যায়ন করে অ্যারের দৈর্ঘ্য পেতে পারেন । তবে এটি অ্যারের দৈর্ঘ্য নয়; এটি সর্বশেষ উপাদানটির সাবস্ক্রিপ্ট, যা সাধারণত একটি 0 তম উপাদান থাকে বলে এটি আলাদা মান।$#dayscsh


2

অ্যারের আকার মুদ্রণের বিভিন্ন উপায় রয়েছে। এখানে সকলের অর্থ: আমাদের অ্যারেটি বলতে দিনmy @arr = (3,4);

পদ্ধতি 1: স্কেলার

এটি অ্যারের আকার পাওয়ার সঠিক উপায়।

print scalar @arr;  # prints size, here 2

পদ্ধতি 2: সূচক সংখ্যা

$#arrএকটি অ্যারের শেষ সূচক দেয়। সুতরাং অ্যারে যদি 10 এর আকার হয় তবে এর শেষ সূচক 9 হবে।

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size

0 টি সূচকযুক্ত হিসাবে অ্যারে বিবেচনা করে আমরা এখানে 1 যুক্ত করছি । তবে, যদি এটি তখন শূন্য না হয় তবে এই যুক্তিটি ব্যর্থ হবে

perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

উদাহরণস্বরূপ উপরে 6 টি প্রিন্ট করে, কারণ আমরা এর প্রাথমিক সূচকটি 4 এ সেট করে রেখেছি Now এখন সূচকটি যথাক্রমে 3 এবং 4 উপাদানগুলির সাথে 5 এবং 6 হবে।

পদ্ধতি 3:

যখন একটি অ্যারে স্কেলার প্রসঙ্গে ব্যবহৃত হয়, তখন এটি অ্যারের আকার দেয়

my $size = @arr;
print $size;   # prints size, here 2

আসলে পদ্ধতি 3 এবং পদ্ধতি 1 একই।


2

Perldoc থেকে perldata , যা উদ্ধৃতি নিরাপদ হওয়া উচিত:

নিম্নলিখিতটি সর্বদা সত্য:

scalar(@whatever) == $#whatever + 1;

যতক্ষণ আপনি $ # না করেন যতক্ষণ না ++ যাই হোক না কেন এবং রহস্যজনকভাবে আকার বা আপনার অ্যারের বৃদ্ধি করবেন।

অ্যারে সূচকগুলি 0 দিয়ে শুরু হয়।

এবং

আপনি এটিকে শূন্য তালিকা () নকল করে কিছুতেই নিচে অ্যারে কেটে ফেলতে পারেন। নিম্নলিখিত সমতুল্য:

    @whatever = ();
    $#whatever = -1;

যা আমাকে যা খুঁজছিল তা এনে দেয় যা অ্যারেটি খালি শনাক্ত করতে হয়। আমি এটি খুঁজে পেয়েছি যদি $ # খালি == -1;


1

int(@array)এটিকে তাত্ক্ষণিক হিসাবে আর্গুমেন্ট হিসাবে হুমকি হিসাবে কি ।


0

একটি অ্যারের আকার খুঁজতে scalarকীওয়ার্ডটি ব্যবহার করুন :

print scalar @array;

একটি অ্যারের শেষ সূচকটি জানতে $#(পার্ল ডিফল্ট ভেরিয়েবল) রয়েছে। এটি একটি অ্যারের শেষ সূচক দেয়। 0 থেকে অ্যারে শুরু হওয়ার সাথে সাথে আমরা একটিতে যুক্ত করে অ্যারের আকার পাই $#:

print "$#array+1";

উদাহরণ:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

আউটপুট:

3

3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.