জিএনইউ অবাক ৩.১..6 এর সাথে আটকে থাকুন এবং মনে করুন যে আমি এর অ্যারে বাগগুলি নিয়ে কাজ করেছি তবে এখনও -০০-লাইনের অ্যাডক প্রোগ্রামে স্কোপ সমস্যাটির মতো দেখতে এমনটি রয়েছে। আমার ত্রুটিটি খুঁজে পেতে বিশদভাবে অ্যারে স্কোপটি বোঝার দরকার verify
এই উদাহরণস্বরূপ অ্যাডক কোড দেওয়া ...
function foo(ga) {
ga[1] = "global result"
}
garray[1] = "global"
foo(garray)
print garray[1]
মুদ্রণ করবে ...
global result
যেহেতু অ্যারেগুলি সর্বদা রেফারেন্স অনুসারে ফাংশনে প্রেরণ করা হয়, তারপরে সমস্ত অ্যারে সর্বদা বিশ্বব্যাপী are স্থানীয় অ্যারে তৈরি করার কোনও উপায় নেই। এটা কি সঠিক? স্পষ্টভাবে এটি বলে যে দস্তাবেজগুলি সন্ধান করতে অক্ষম হয়েছেন।
যেহেতু আমি ডিবাগ করছি, এবং ৩.১..6 নিজেই এই অঞ্চলে বাগগুলি জেনে গেছে, তাই অবাকের বাগগুলি কোথায় ছেড়ে যায় এবং আমার শুরু হয় তা নির্ধারণের চেষ্টা করছি।
পরিপূরক: কেন [g] তখন ফাংশনের অভ্যন্তরে কাজ করে?
প্রথমত, সাথে ফাংশনে অ্যারে পাস foo(ga)
করা আসলে অপ্রয়োজনীয়। garray[]
ফাংশনের ভিতরে যেমন এটি অ্যাক্সেস করুন । এটি করার ক্ষেত্রে কোনও পরিমাপযোগ্য পারফরম্যান্স জরিমানা নেই এবং এটি ডিবাগিং এবং ত্রুটি প্রতিবেদন করতে সহায়তা করে।
ব্যবহারে foo(ga)
, ga[]
এটি বিশ্বব্যাপী অ্যারের প্রতিশব্দ garray[]
। এর স্থানীয় অনুলিপি হওয়ার পরিবর্তে garray[]
এটি কেবলমাত্র একটি পয়েন্টার garray[]
, বরং প্রতীকী লিঙ্কটি কোনও ফাইলের পয়েন্টার এবং সুতরাং একই ফাইল (বা অ্যারে) একাধিক নামের অধীনে অ্যাক্সেস করা যায়।
পরিপূরক: গ্লেন জ্যাকম্যানের উত্তরের ব্যাখ্যা
যখন কোনও ফাংশনের বাইরে তৈরি অ্যারেগুলি ফাংশনটির জন্য বৈশ্বিক হয় এবং এটিতে প্রেরণ করা যায় বা কেবল এটির মধ্যে উল্লেখ করা যেতে পারে তবে কোনও ফাংশনের অভ্যন্তরে তৈরি অ্যারেগুলি অবশ্যই ফাংশনে স্থানীয় থাকে এবং এর বাইরে দৃশ্যমান হয় না। মিঃ জ্যাকম্যানের উদাহরণটি সংশোধন করা এটিকে চিত্রিত করে ...
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: " x[1]
print "y[1] inside: " y[1]
}
BEGIN {
x[1]="goodbye"
print "x[1] before: " x[1]
print "y[1] before: " y[1]
bar(x)
print "x[1] after: " x[1]
print "y[1] after: " y[1]
}
'
x[1] before: goodbye
y[1] before:
x[1] inside: goodbye
y[1] inside: hello
x[1] after: goodbye
y[1] after:
নোট করুন যে আমরা কেবল x[]
অ্যারে (আসলে এটিতে কেবলমাত্র একটি পয়েন্টার) দিয়ে যাচ্ছি bar()
। y[]
অ্যারে এমনকি বিদ্যমান নয় যতক্ষণ না আমরা ফাংশন ভিতরে পেতে।
তবে, যদি আমরা এটি ফাংশনের বাইরে কিছু y[]
না দিয়ে bar()
যুক্তি তালিকায় অন্তর্ভুক্ত করে ঘোষণা করি তবে এটি কল করার পরে দৃশ্যমান হবে bar(x,y)
...
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: " x[1]
print "y[1] inside: " y[1]
}
BEGIN {
x[1]="goodbye"
print "x[1] before: " x[1]
print "y[1] before: " y[1]
bar(x,y)
print "x[1] after: " x[1]
print "y[1] after: " y[1]
}
'
x[1] before: goodbye
y[1] before:
x[1] inside: goodbye
y[1] inside: hello
x[1] after: goodbye
y[1] after: hello
পরিশেষে, আমরা তৈরি করে y[]
ফাংশন বাহিরে অ্যারে এবং সঙ্গে এটি পাস bar(x,y)
, split()
ফাংশন প্রতিস্থাপন যে অ্যারে এর উপাদানের ভিতরে নিয়োগ ...
awk '
function bar(x,y) {
split("hello world", y)
print "x[1] inside: " x[1]
print "y[1] inside: " y[1]
}
BEGIN {
x[1]="goodbye"
y[1]="howdy"
print "x[1] before: " x[1]
print "y[1] before: " y[1]
bar(x,y)
print "x[1] after: " x[1]
print "y[1] after: " y[1]
}
'
x[1] before: goodbye
y[1] before: howdy
x[1] inside: goodbye
y[1] inside: hello
x[1] after: goodbye
y[1] after: hello