গাওক: ফাংশনে অ্যারে পাস করা হচ্ছে


9

জিএনইউ অবাক ৩.১..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

উত্তর:


5

ফাংশন পরামিতিগুলি ফাংশনের স্থানীয়।

awk '
    function foo(x,y) {y=x*x; print "y in function: "y} 
    BEGIN {foo(2); print "y out of function: " y}
'
y in function: 4
y out of function: 

যদি আপনি কোনও ফাংশনে প্যারামিটারগুলির চেয়ে কম মান পাস করেন তবে অতিরিক্ত পরামিতিগুলি খালি। আপনি কখনও কখনও মত সংজ্ঞায়িত ফাংশন দেখতে পাবেন

function foo(a, b, c            d, e, f) {...

যেখানে সাদা স্থানের পরে প্যারামিটারগুলি স্থানীয় ভেরিয়েবল এবং বিন্যাসে কোনও মান নেওয়ার উদ্দেশ্যে নয়।

স্থানীয় অ্যারেগুলির জন্য এটি কাজ করতে পারে না তার কোনও কারণ নেই:

awk '
    function bar(x) {
        split("hello world", x)
        print "in: " x[1]
    }
    BEGIN {
        x[1]="world"
        bar()
        print "out: " x[1]}
'
in: hello
out: world

3

হাবা ডকুমেন্টেশন এটা পরিষ্কার যে অ্যারে রেফারেন্স দ্বারা গৃহীত হয় তোলে, এবং সেখানে কোন প্রায় নথিভুক্ত পথ। gawk4.0.0.1 এর সাথে আচরণটি একই রকম ।

পসিএক্স সেই আচরণটি নির্দিষ্ট করে , তাই আমি আশা করি না যে আপনি awkঅন্যথায় আচরণ করে এমন কোনও বাস্তবায়ন পাবেন ।

আপনার যদি সেই কার্যকারিতাটির প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন perl। স্ক্রিপ্টগুলিতে অনুবাদ করতে perlএকটি সরঞ্জাম ( a2p) নিয়ে আসে ।awkperl

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