জ্যাশ অ্যারের প্রথম উপাদানটি 0 এর পরিবর্তে 1 দ্বারা সূচকযুক্ত হওয়ার কোনও কারণ আছে?


27

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

আমি নিশ্চিত যে Zsh ব্যতীত অন্যান্য ভাষাগুলির সাথে অ্যারেগুলির সাথে একইরকম আচরণ করার কথা শুনেছি; এটি আমার পক্ষে ঠিক আছে, যেমন এটি সমান সুবিধাজনক।
তবে, যেমন আগে প্রকাশিত এবং বহুল ব্যবহৃত শেল স্ক্রিপ্টিং ভাষা যেমন ksh এবং bash সব 0 ব্যবহার করে, কেন কেউ এই সাধারণ "স্ট্যান্ডার্ড" পরিবর্তন করতে পছন্দ করবে?

আমার প্রশ্নের আমার তাত্ক্ষণিক উত্তর হবে "অবশ্যই না";
তারপরে, শাঁসগুলির সম্পর্কে কিছুটা "একচেটিয়া বৈশিষ্ট্য" সম্পর্কে আমি যে ব্যাখ্যাটিই ভাবতে পারি তা হ'ল " তারা কেবল তাদের শীতল শেলটি দেখানোর জন্য এটি করেছে "।

আমি যদিও জেডএস বা এর ইতিহাসের অনেক কিছুই জানি না এবং এ সম্পর্কে আমার তুচ্ছ তত্ত্বটি কোনও অর্থ বোধ করে না বলে উচ্চতর সম্ভাবনা রয়েছে।

এর কি কোন ব্যাখ্যা আছে? নাকি এটি ব্যক্তিগত স্বাদ থেকে বেরিয়ে এসেছে?



Reasonতিহাসিক কারণে, সম্ভবত এটি এসেছে csh, যা এক-ভিত্তিক অ্যারে সূচকও ব্যবহার করেছিল।
cuonglm

3
আজকাল, sh একটি মানক ভাষা (বাস্তবায়ন নয়) যার বিভিন্ন সম্ভাব্য দোভাষী রয়েছে। শ ভাষার জন্য বাশ, কেএসএস এবং যশ সমর্থন অ্যারেগুলির মতো সেই অনুবাদকের কিছু, কিন্তু তারা জিসিসি-র মতো ভাষার অংশ নয়, স্ট্যান্ডার্ড সি ভাষার সংকলক স্ট্যান্ডার্ড সি ভাষার উপর এক্সটেনশানকে সমর্থন করে। এবং ঠিক সি এর মতো, "শ" দোভাষীর কোনও "অফিসিয়াল" বাস্তবায়ন নেই।
স্টাফেন চেজেলাস


4
কিছুটা বিষয় বন্ধ হতে পারে তবে প্রাসঙ্গিক। রোমানরা শূন্যের পরিবর্তে এক থেকে শুরু করে অন্তর্ভুক্তিমূলক গণনা ব্যবহার করেছিল tomorrow পরশু পরের দিনটি আমাদের কাছে "দু'দিন এগিয়ে" তাদের কাছে ছিল "তিন দিন এগিয়ে"। তারা আজ শূন্য নয়, এক হিসাবে গণনা করেছে। ফলস্বরূপ যখন তাদের মিশরীয় জ্যোতির্বিজ্ঞানীরা প্রতি চতুর্থ বছরে একটি লিপ দিবসের প্রস্তাব দিয়েছিলেন, রোমানরা প্রকৃতপক্ষে খ্রিস্টপূর্ব ৪৫ খ্রিস্টাব্দে প্রতি তৃতীয় বছরে এটি চালু করেছিল। ত্রুটিটি সংশোধন করতে খ্রিস্টপূর্ব 12 অবধি সময় লেগেছে।
হ্যারি ওয়েস্টন

উত্তর:


32
  • ভার্চুয়ালি সমস্ত শেল অ্যারে (বোর্ন, সিএসএস, টিসিএস, ফিশ, আরসি, এস, যশ) ১ থেকে শুরু হবে। ksh একমাত্র ব্যতিক্রম যা আমি জানি (বাশ কেবল অনুলিপি করা ksh)।
  • একবারে সর্বাধিক ব্যাখ্যা ভাষা (তাড়াতাড়ি 90s): awk, tclঅন্তত এবং সরঞ্জাম সাধারণত শেল থেকে ব্যবহৃত ( cut -f1-3, head -n 3, sort -k1,3, cal 1 2015, comm -1) 1. এ শুরু sed, ed, vi1 নম্বর থেকে তাদের লাইন ...
  • zsh বোর্ন শেল এবং সিএসএসের সেরা নেয়। বোর্ন শেল অ্যারে $@শুরু 1 থেকে। Zsh এর পরিচালনা $@( বাউর্নের মতো) বা $argv( সিএসএসের মতো) এর সাথে সামঞ্জস্যপূর্ণ । উদাহরণস্বরূপ আপনাকে প্রথম অবস্থানিক পরামিতি দেয় না এমন kshজায়গায় এটি কতটা বিভ্রান্তিকর তা দেখুন ${@:0:1}
  • একটি শেল একটি প্রোগ্রামিং ভাষা হওয়ার আগে একটি ব্যবহারকারী সরঞ্জাম user বেশিরভাগ ব্যবহারকারীর মধ্যে প্রথম উপাদানটি থাকা উচিত তা বোঝায় $a[1]। এর অর্থ এটিও হ'ল উপাদানগুলির সংখ্যা শেষ ইনডিসের সমান (zsh তে যেমন ksh ব্যতীত অন্যান্য শেলের মতো, অ্যারেগুলি খুব কম নয় )।
  • a[1]প্রথম উপাদানটি a[-1]শেষের সাথে সামঞ্জস্যপূর্ণ ।

আইএমও এর পরিবর্তে প্রশ্নটি হওয়া উচিত: ডেভিড কর্নের অ্যারেগুলি 0 থেকে শুরু করার জন্য কীসের মাথায় ?ুকেছে?


7
এটি মানব ভাষাগুলিতে একটি ত্রুটিযুক্ত যে সংখ্যাটি এক-ভিত্তিক, এবং লক্ষণীয় নির্মলতা যে বেশিরভাগ প্রোগ্রামিং ভাষাগুলি সেই উত্তরাধিকারকে তাদের নকশার বাইরে রাখতে পরিচালিত হয়েছিল। সমস্ত দুঃখজনক যে শূন্য-ভিত্তিক সূচকে কার্যত আদর্শ হিসাবে প্রতিষ্ঠিত হওয়ার পরে , অনেকগুলি "ব্যবহারকারী-ভিত্তিক" ভাষাগুলি পিছনের দিকে ফিরে এসেছে, আবারও ভুল , এক-ভিত্তিক সূচক ব্যবহার করে "সরল" হওয়ার চেষ্টা করছে । - এটি বলেছিল: সংখ্যাসূচক সূচকগুলি সম্পূর্ণরূপে এড়ানো থেকে ইন্ডেক্সিং বিভ্রান্তি এড়ানোর সর্বোত্তম উপায়।
বাম দিকের বাইরে

এখানে পড়া: "দৈর্ঘ্য N এর ক্রম নিয়ে কাজ করার সময়, সাবস্ক্রিপ্ট দ্বারা যে উপাদানগুলি আমরা আলাদা করতে চাই, ... ক) ফলন, সাবস্ক্রিপ্ট 1 দিয়ে শুরু করার সাথে সাথে, সাবস্ক্রিপ্টের পরিসর 1 ≤ i <এন + 1; দিয়ে শুরু হবে 0, তবে, সুন্দর পরিসীমা 0 ≤ i <N. "দেয় । TROLL বা বোকা কিনা তা জানেন না তবে আপনি অ্যারেতে 1 দিয়ে শুরু হওয়া সাবস্ক্রিপ্টগুলির জন্য "1 ≤ i ≤ N" ব্যবহার করতে পারেন। অ্যারে স্ক্যানের শেষে সেই +1 লাগানোর দরকার নেই এবং দৃষ্টিকোণের কোনওটিই প্রমাণ করে না যে 1 বা 0 দিয়ে সূচকগুলি শুরু করা আরও ভাল।

1
আপনি হয় ন্যায়সঙ্গত করতে পারেন যে 0 মানব জ্ঞানের পরে যুক্ত করা হয়েছিল, এবং এটি কোনওরকমভাবে সেই সময়ের জিনিসগুলিকে গোলমাল করেছিল। theguardian.com/notesandqueries/query/0,5753,-1358,00.html - আবার দেখার বিষয় মাত্র :)

3
বোর্ন শেল অ্যারে $ @ 0 থেকে শুরু হয় (1 নয়) $ 0 হল আপনি যে প্রোগ্রামটি চালাচ্ছেন তার নাম। আপনার তৃতীয় পয়েন্টটি ঠিক করা উচিত
এডওয়ার্ড টরভাল্ডস

2
@ এডওয়ার্টরওয়াল্ডস, $0না কোনও অবস্থানগত পরামিতি নয়। এটি অংশ নয় $@"$@"হয় "$1" "$2" ...। যখন ফাংশনগুলির কথা আসে, অনেকগুলি শেলের মধ্যে, আপনি দেখতে পাবেন যে "$@"এটি ফাংশনের আর্গুমেন্টগুলি রয়েছে, যখন $0স্ক্রিপ্টের পথ অবধি থাকে (বা শেল আর্গভ [0] যখন স্ক্রিপ্টটি চালাচ্ছেন না)
স্টাফেন চেজেলাস

7

আমি মনে করি এটির সবচেয়ে প্রশংসনীয় উত্তর হ'ল অন্তর্নির্মিত বিপরীত অ্যারে zsh

আপনার যদি 4 টি উপাদান সহ একটি অ্যারে থাকে, বলুন myvar=(1 2 3 4)এবং আপনি এটি চতুর্থ উপাদানটি অ্যাক্সেস করতে চান print $myvar[4], তাই না?

তবে, আপনি যদি এমন একটি লুপ তৈরি করতে চান যা এই অ্যারের অভ্যন্তরের উপাদানগুলি পিছন দিকে তালিকাভুক্ত করে, তবে এটি কেবল নেতিবাচক সূচকগুলি ব্যবহার করার বিষয়:

print $myvar[-1]   # will print 4
print $myvar[-2]   # will print 3
print $myvar[-3]   # will print 2
print $myvar[-4]   # will print 1

এটি শূন্য থেকে শুরু করার পরে বোঝানো উচিত, কোনও উপাদান নেই বলে আপনি সেই উপাদানগুলির একটিতে পৌঁছাতে পারবেন না -0

এর পিছনে দ্বিতীয় কারণটি সম্ভবত zsh এর ভেরিয়েবল সম্পর্কিত সি কোড ব্যবহার করছে intবা double intঅ্যারে সূচকগুলি সংজ্ঞায়িত করবে এবং যেহেতু এটি নেতিবাচক সংখ্যার উপস্থাপনের জন্য টু কমপ্লিমেন্ট ব্যবহার করে সেখানে প্রতিনিধিত্ব করার কোনও উপায় নেই -0( স্বাক্ষরিত শূন্য ), যেমন আপনি ভাসাতে করতে পারেন পয়েন্ট ভেরিয়েবল।

আপনি যদি 0 থেকে শুরু করে সূচকগুলিতে সত্যিই অভ্যস্ত হন তবে আমি আপনাকে এটি KSH_ARRAYSঠিক করার জন্য বিকল্পটি ব্যবহার করার পরামর্শ দিচ্ছি ।

এবং @ কুওংলম মন্তব্যের হুক গ্রহণ করে এর cshউপর প্রয়োগ করা বৈশিষ্ট্যগুলি এখানেzsh ব্যাখ্যা করা হয়েছে । এটি কোনও historicalতিহাসিক কারণ বলে মনে হচ্ছে না তবে যাঁরা ব্যবহার করছেন তাদের জন্য একটি দুর্দান্ত কাজের পরিবেশ সরবরাহের উপায় tocsh


3
তারপরে, এটি আপনাকে একই সাথে প্রথম এবং শেষ অ্যারে আইটেমগুলিতে অ্যাক্সেস করা উচিত, অ্যারে স্ক্যান করার সমস্ত যুক্তি ভঙ্গ করে;) এমনকি ব্ল্যাকহোল তৈরি করতে পারে। LOL

3
জন্য ২0 সূচীবদ্ধ অ্যারে প্রতিস্থাপন -সঙ্গে ~
মাইকজার্ভ

1
@ এমএফএক্সএক্স - আমি কথা বলছিলাম bash। আমি মনে করি এটি সিনট্যাক্স চিনির হিসাবে সেট উপাদানগুলির জন্য নেতিবাচক সূচকগুলি পরিচালনা করে তবে অন্যথায় এটি করে না। মনে করতে পারছি না আমার দৃষ্টিকোণ থেকে, লোকদের কেবল একটি ডিরেক্টরি তৈরি করা উচিত এবং যে সমস্ত শেল অবস্থায় এটি স্টাফিং করা হয় তার জন্য ফাইলগুলি ব্যবহার করা উচিত। আপনি যে কোনও উপায়ে পছন্দ করুন সেই উপাদানগুলিকে সূচক করতে পারেন।
মাইকজার্ভ

1
~বাইনারি বিপরীত হয়। ~0হয় -1। (সমস্ত বিট উল্টানো, নেতিবাচক সংখ্যাগুলি কীভাবে সাধারণত বিট-ওয়াইন উপস্থাপিত হয় তার উপর নির্ভর করে)। একটি আনসেট অ্যারে বা ইনডিসের 0, a [0], a [-0], a [-1] এবং একটি [~ 0] এর এক উপাদান সহ একটি অ্যারে আপনাকে একটি কাঠির মতো অ্যারেতে একই জিনিস দেবে।
স্টাফেন চেজেলাস

1
@ স্টাফেনচাজেলাস - হ্যাঁ, আমি মনে করি ~কখন -indexকাজ হয়নি তখন এটিকে পরিচালনা করার কথা মনে আছে । আমি অনুমান করি সম্ভবত আমি যা করেছি তা ছিল ~-index। হাঁ। এটা ঠিক শোনাচ্ছে। হ্যাঁ! এবং অবশ্যই এটি আনসেট উপাদানগুলির জন্যও কাজ করে। সুতরাং আমি অনুমান করি যে উপরের মন্তব্যটি হওয়া উচিত - 0-ইনডেক্সেড অ্যারেগুলির জন্য ~ । আমার ধারণা এটি খুব সহজেই -1 অংশটি পরিচালনা করেছে। আমি জানিনা. এই মুহুর্তে এটি আমার স্মৃতি
সর্বাগ্রে ঝাঁপিয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.