আমি জানি my
পার্ল কি আছে। এটি একটি পরিবর্তনশীল সংজ্ঞায়িত করে যা কেবলমাত্র ব্লকের স্কোপে যেখানে এটি সংজ্ঞায়িত হয় সেখানে বিদ্যমান। কি করে our
?
কীভাবে our
আলাদা my
?
আমি জানি my
পার্ল কি আছে। এটি একটি পরিবর্তনশীল সংজ্ঞায়িত করে যা কেবলমাত্র ব্লকের স্কোপে যেখানে এটি সংজ্ঞায়িত হয় সেখানে বিদ্যমান। কি করে our
?
কীভাবে our
আলাদা my
?
উত্তর:
দুর্দান্ত প্রশ্ন: কীভাবে our
আলাদা হয় my
এবং কী করে our
?
সংক্ষেপে:
পার্ল 5-এর পরে উপলব্ধ, প্যাকেজবিহীন my
ভেরিয়েবলগুলি ঘোষণার একটি উপায় , তা হ'ল:
$package_name::variable
।অন্যদিকে, our
ভেরিয়েবলগুলি প্যাকেজ ভেরিয়েবল এবং এইভাবে স্বয়ংক্রিয়ভাবে:
$package_name::variable
।এর সাথে একটি ভেরিয়েবল our
ঘোষণার মাধ্যমে use strict
টাইপ সতর্কতা বা সংকলন-সময় ত্রুটি না পেয়ে ভেরিয়েবলগুলি এগুলি ব্যবহার করার জন্য আপনাকে পূর্বনির্ধারিত করার অনুমতি দেয় । পার্ল ৫..6 সাল থেকে এটি অপ্রচলিতটিকে প্রতিস্থাপন করেছে use vars
, যা কেবল ফাইল-স্কোপড ছিল এবং লেসিকালি স্কোপ করা হয়নি our
।
উদাহরণস্বরূপ, পরিবর্তনশীল জন্য নিয়মমাফিক, যোগ্যতাসম্পন্ন নাম $x
ভিতরে package main
হয় $main::x
। ডিক্লেয়ারিং our $x
আপনাকে $x
ঘোষণার সুযোগে, দণ্ড ছাড়াই খালি পরিবর্তনশীল (অর্থাত্ ফলস্বরূপ ত্রুটি ব্যতীত) ব্যবহার করার অনুমতি দেয় , যখন স্ক্রিপ্টটি ব্যবহার করেuse strict
বা use strict "vars"
। সুযোগটি এক, বা দুটি, বা আরও বেশি প্যাকেজ বা একটি ছোট ব্লক হতে পারে।
local
ভেরিয়েবল তৈরি করে না। এটি কোনওভাবেই my
এবং সম্পর্কিত our
নয়। local
অস্থায়ীভাবে ভেরিয়েবলের মান ব্যাক আপ করে এবং এর বর্তমান মান সাফ করে।
our
ভেরিয়েবলগুলি প্যাকেজ ভেরিয়েবল নয়। এগুলি গ্লোবালি-স্কোপড নয়, লেক্সিকালি-স্কোপড ভেরিয়েবলগুলি কেবল my
ভেরিয়েবলের মতো । আপনি দেখতে পারেন যে নিম্নলিখিত প্রোগ্রামে: package Foo; our $x = 123; package Bar; say $x;
। আপনি যদি কোনও প্যাকেজ ভেরিয়েবল "ডিক্লেয়ার" করতে চান তবে আপনার ব্যবহার করা দরকার use vars qw( $x );
। our $x;
একটি সংক্ষিপ্ত-স্কোপযুক্ত ভেরিয়েবল ঘোষণা করে যা প্যাকেজটি our
সংকলিত হয়েছিল তার একই নামযুক্ত ভেরিয়েবলের সাথে যুক্ত হয় ।
কার্টম্যান এবং ওলাফুরের পার্লমঙ্কস এবং পার্লডোক লিঙ্কগুলি একটি দুর্দান্ত রেফারেন্স - নীচে আমার ক্র্যাকটি সংক্ষেপে দেওয়া হল:
my
ভেরিয়েবলগুলি বর্ণিতভাবে {}
একই ফাইলে বা এর মধ্যে না থাকলে একই ব্লকের মধ্যে সংজ্ঞায়িত হয় {}
। তারা একই লেজিকাল স্কোপ / ব্লকের বাইরে সংজ্ঞায়িত প্যাকেজগুলি / সাব্রোটাইনগুলি থেকে অ্যাক্সেসযোগ্য নয়।
our
ভেরিয়েবলগুলি একটি প্যাকেজ / ফাইলের মধ্যে বিভক্ত হয় এবং যে কোনও কোড থেকে use
বা অ্যাক্সেসযোগ্য require
যে প্যাকেজ / ফাইল - নাম বিরোধগুলি যথাযথ নেমস্পেস প্রিভেন্ড করে প্যাকেজগুলির মধ্যে সমাধান করা হয়।
কেবল এটিকে গোল করার জন্য, local
ভেরিয়েবলগুলি "গতিশীল" স্কোপযুক্ত হয়, my
ভেরিয়েবলগুলির থেকে পৃথক হয় যেগুলি একই ব্লকের মধ্যে ডাকা সাব্রোটাইনগুলি থেকেও অ্যাক্সেসযোগ্য।
my
ভেরিয়েবলের জন্য +1 হ'ল লাইনিকভাবে স্কোপ করা হয় [...] একই ফাইলের মধ্যে না থাকলে {}
"। ধন্যবাদ আমার জন্য এটি দরকারী ছিল।
একটি উদাহরণ:
use strict;
for (1 .. 2){
# Both variables are lexically scoped to the block.
our ($o); # Belongs to 'main' package.
my ($m); # Does not belong to a package.
# The variables differ with respect to newness.
$o ++;
$m ++;
print __PACKAGE__, " >> o=$o m=$m\n"; # $m is always 1.
# The package has changed, but we still have direct,
# unqualified access to both variables, because the
# lexical scope has not changed.
package Fubb;
print __PACKAGE__, " >> o=$o m=$m\n";
}
# The our() and my() variables differ with respect to privacy.
# We can still access the variable declared with our(), provided
# that we fully qualify its name, but the variable declared
# with my() is unavailable.
print __PACKAGE__, " >> main::o=$main::o\n"; # 2
print __PACKAGE__, " >> main::m=$main::m\n"; # Undefined.
# Attempts to access the variables directly won't compile.
# print __PACKAGE__, " >> o=$o\n";
# print __PACKAGE__, " >> m=$m\n";
# Variables declared with use vars() are like those declared
# with our(): belong to a package; not private; and not new.
# However, their scoping is package-based rather than lexical.
for (1 .. 9){
use vars qw($uv);
$uv ++;
}
# Even though we are outside the lexical scope where the
# use vars() variable was declared, we have direct access
# because the package has not changed.
print __PACKAGE__, " >> uv=$uv\n";
# And we can access it from another package.
package Bubb;
print __PACKAGE__, " >> main::uv=$main::uv\n";
স্কোপিংয়ের সাথে মোকাবিলা করা পার্ল স্কোপিং বিধিগুলির একটি ভাল ওভারভিউ is এটি যথেষ্ট পুরানো our
যা পাঠ্যের মূল অংশে আলোচনা করা হয়নি। এটি শেষে নোটস বিভাগে সম্বোধন করা হয়েছে ।
নিবন্ধটি প্যাকেজ ভেরিয়েবল এবং ডায়নামিক স্কোপ এবং কীভাবে লেক্সিকাল ভেরিয়েবল এবং লেক্সিকাল স্কোপ থেকে পৃথক রয়েছে সে সম্পর্কে আলোচনা করে।
my
স্থানীয় ভেরিয়েবলের জন্য ব্যবহৃত হয়, যেখানে our
বৈশ্বিক চলকগুলির জন্য ব্যবহৃত হয়।
পার্লের ভেরিয়েবল স্কোপিংয়ে আরও পড়ুন : মূল বিষয়গুলি ।
${^Potato}
বিশ্বব্যাপী। এটি যেখানে আপনি এটি ব্যবহার না করে একই পরিবর্তনশীলকে বোঝায়।
আমি কখনই পার্লের লেজিক্যাল ডিক্লারেশন সম্পর্কে কিছু সমস্যার মুখোমুখি হয়েছি যা আমাকে গোলমেলে ফেলেছিল, যা এই প্রশ্নের সাথেও সম্পর্কিত, তাই আমি এখানে আমার সংক্ষিপ্তসারটি এখানে যুক্ত করছি:
1. সংজ্ঞা বা ঘোষণা?
local $var = 42;
print "var: $var\n";
আউটপুট হয় var: 42
। তবে আমরা local $var = 42;
কোনও সংজ্ঞা বা ঘোষণা কিনা তা বলতে পারিনি couldn't তবে এটি সম্পর্কে:
use strict;
use warnings;
local $var = 42;
print "var: $var\n";
দ্বিতীয় প্রোগ্রামটি একটি ত্রুটি ফেলবে:
Global symbol "$var" requires explicit package name.
$var
সংজ্ঞায়িত হয় না, যার অর্থ local $var;
কেবল একটি ঘোষণা! local
কোনও ভেরিয়েবল ঘোষণা করার আগে , নিশ্চিত হয়ে নিন যে এটি আগে বৈশ্বিক চলক হিসাবে সংজ্ঞায়িত হয়েছে।
তবে কেন এই ব্যর্থ হবে না?
use strict;
use warnings;
local $a = 42;
print "var: $a\n";
আউটপুট হল: var: 42
।
কারণ $a
, পাশাপাশি $b
, পার্লে একটি বৈশ্বিক পরিবর্তনশীল পূর্ব-সংজ্ঞায়িত। সাজানোর কাজ মনে আছে ?
2. লেক্সিকাল বা গ্লোবাল?
পার্ল ব্যবহার শুরু করার আগে আমি একজন সি প্রোগ্রামার ছিলাম, সুতরাং লেক্সিকাল এবং গ্লোবাল ভেরিয়েবলের ধারণাটি আমার কাছে সোজা মনে হয়: এটি কেবল সিতে অটো এবং বাহ্যিক ভেরিয়েবলের সাথে মিলে যায় তবে ছোট পার্থক্য রয়েছে:
সি-তে, একটি বাহ্যিক ভেরিয়েবল হ'ল যে কোনও ফাংশন ব্লকের বাইরে সংজ্ঞায়িত একটি চলক। অন্যদিকে, একটি স্বয়ংক্রিয় চলক একটি ফাংশন ব্লকের ভিতরে সংজ্ঞায়িত একটি চলক। এটার মত:
int global;
int main(void) {
int local;
}
পার্ল থাকাকালীন জিনিসগুলি সূক্ষ্ম:
sub main {
$var = 42;
}
&main;
print "var: $var\n";
আউটপুট হয় var: 42
। $var
এটি একটি ফাংশন ব্লকে সংজ্ঞায়িত হলেও গ্লোবাল ভেরিয়েবল! আসলে পার্লে, কোনও পরিবর্তনশীল ডিফল্টরূপে গ্লোবাল হিসাবে ঘোষিত হয়।
পাঠটি সর্বদা use strict; use warnings;
একটি পার্ল প্রোগ্রামের শুরুতে যুক্ত করা হয়, যা প্রোগ্রামারকে লেসিকাল ভেরিয়েবলকে স্পষ্টভাবে ঘোষণা করতে বাধ্য করে, যাতে আমরা কিছুটা ভুলের কারণে মঞ্জুর না হয়ে যাই granted
Perldoc আমাদের একটি ভাল সংজ্ঞা হয়েছে।
আমার বিপরীতে, যা উভয়ই চলকের জন্য সঞ্চয়স্থান বরাদ্দ করে এবং বর্তমান স্কোপের মধ্যে ব্যবহারের জন্য সেই স্টোরেজটির সাথে একটি সাধারণ নামকে সংযুক্ত করে, বর্তমান স্কোপের মধ্যে ব্যবহারের জন্য, আমাদের বর্তমান প্যাকেজে প্যাকেজ ভেরিয়েবলের সাথে একটি সাধারণ নামকে সংযুক্ত করে। অন্য কথায়, আমাদের আমাদের মতো স্কোপিংয়ের নিয়ম রয়েছে তবে অগত্যা কোনও পরিবর্তনশীল তৈরি করে না।
এটি কেবল কিছুটা প্রশ্নের সাথে সম্পর্কিত, তবে আমি কেবলমাত্র একটি (আমার কাছে) পার্ল সিনট্যাক্সের একটি অস্পষ্ট বিটটি আবিষ্কার করেছি যা আপনি "আমাদের" (প্যাকেজ) ভেরিয়েবলগুলির সাথে ব্যবহার করতে পারেন যা আপনি "আমার" (স্থানীয়) সাথে ব্যবহার করতে পারবেন না ভেরিয়েবল।
#!/usr/bin/perl
our $foo = "BAR";
print $foo . "\n";
${"foo"} = "BAZ";
print $foo . "\n";
আউটপুট:
BAR
BAZ
আপনি 'আমাদের' কে 'আমার' তে পরিবর্তন করলে এটি কাজ করবে না।
perl -e "my $foo = 'bar'; print $foo; ${foo} = 'baz'; pr int $foo"
আউটপুট: barbaz
perl -e "my $foo = 'bar'; print $foo; ${"foo"} = 'baz'; print $foo"
আউটপুট: barbaz
perl -e "my $foo = 'bar'; print $foo; ${\"foo\"} = 'baz'; print $foo"
আউটপুট: barbar
সুতরাং আমার পরীক্ষায় আমি একই ফাঁদে পড়ে গিয়েছিলাম। $ oo foo $ $ foo এর সমান, বন্ধনী ব্যবহারের সময় বন্ধনীগুলি কার্যকর হয়। $ f "foo" actually আসলে $ main :: {} পর্যন্ত চেহারা যা মূল প্রতীক টেবিল, যেমন কেবল প্যাকেজ স্কোপযুক্ত ভেরিয়েবল থাকে contains
perl -e "package test; our $foo = 'bar'; print $foo; ${\"foo\"} = 'baz'; print $foo"
কাজ, যেমন এই প্রসঙ্গে $ f "foo" now এখন test {"পরীক্ষা :: foo" to এর সমান} অ্যাডভান্সড পার্ল প্রোগ্রামিং বইয়ের মতো সিম্বল টেবিল এবং গ্লোবগুলির কিছু তথ্য রয়েছে। আমার আগের ভুলের জন্য দুঃখিত
print "package is: " . __PACKAGE__ . "\n";
our $test = 1;
print "trying to print global var from main package: $test\n";
package Changed;
{
my $test = 10;
my $test1 = 11;
print "trying to print local vars from a closed block: $test, $test1\n";
}
&Check_global;
sub Check_global {
print "trying to print global var from a function: $test\n";
}
print "package is: " . __PACKAGE__ . "\n";
print "trying to print global var outside the func and from \"Changed\" package: $test\n";
print "trying to print local var outside the block $test1\n";
এটি আউটপুট দেবে:
package is: main
trying to print global var from main package: 1
trying to print local vars from a closed block: 10, 11
trying to print global var from a function: 1
package is: Changed
trying to print global var outside the func and from "Changed" package: 1
trying to print local var outside the block
স্ক্রিপ্টটি চালানোর চেষ্টা করার সময় "কড়া ব্যবহার করুন" ব্যবহার করে এই ব্যর্থতা পাবেন:
Global symbol "$test1" requires explicit package name at ./check_global.pl line 24.
Execution of ./check_global.pl aborted due to compilation errors.
নিম্নলিখিত প্রোগ্রামটি ব্যবহার করার চেষ্টা করুন:
#!/usr/local/bin/perl
use feature ':5.10';
#use warnings;
package a;
{
my $b = 100;
our $a = 10;
print "$a \n";
print "$b \n";
}
package b;
#my $b = 200;
#our $a = 20 ;
print "in package b value of my b $a::b \n";
print "in package b value of our a $a::a \n";
#!/usr/bin/perl -l
use strict;
# if string below commented out, prints 'lol' , if the string enabled, prints 'eeeeeeeee'
#my $lol = 'eeeeeeeeeee' ;
# no errors or warnings at any case, despite of 'strict'
our $lol = eval {$lol} || 'lol' ;
print $lol;
our
আর my
আলাদা কেন ? এই উদাহরণটি এটি কীভাবে দেখায়?
আসুন আমরা ভাবি যে একজন দোভাষী আসলে কী তা: এটি কোডের একটি অংশ যা মেমরির মধ্যে মূল্যবোধ সঞ্চয় করে এবং কোনও প্রোগ্রামের নির্দেশিকাগুলিকে সেই প্রোগ্রামগুলিতে নির্দেশ দেয় যা তাদের নামের দ্বারা সেই মানগুলিকে অ্যাক্সেস করে দেয় যা এই নির্দেশাবলীর অভ্যন্তরে নির্দিষ্ট করা আছে। সুতরাং, দোভাষীর বড় কাজ হ'ল অনুবাদকরা যে মূল্যবোধগুলি সঞ্চয় করে সেগুলি অ্যাক্সেস করতে সেই নির্দেশাবলীতে আমাদের কীভাবে নামগুলি ব্যবহার করা উচিত তার নিয়মকে গঠন করা।
"আমার" এর মুখোমুখি হওয়ার সময়, দোভাষীটি একটি লেজিকাল ভেরিয়েবল তৈরি করে: একটি নামযুক্ত মান যা দোভাষী কেবল একটি ব্লক কার্যকর করতে গিয়ে কেবল অ্যাক্সেস করতে পারে এবং কেবল সেই সিনট্যাকটিক ব্লকের মধ্যে থেকে। "আমাদের" এর মুখোমুখি হওয়ার সময়, দোভাষী একটি প্যাকেজ ভেরিয়েবলের একটি লেজিক্যাল ওরফে তৈরি করে: এটি একটি নামকে বেঁধে রাখে, যা অনুবাদককে তখন থেকে একটি লেজিকাল ভেরিয়েবলের নাম হিসাবে প্রক্রিয়া করার কথা বলা হয়, ব্লকটি শেষ না হওয়া অবধি প্যাকেজের মান হিসাবে একই নামের সাথে পরিবর্তনশীল।
এর প্রভাবটি আপনি এরপরে ভান করতে পারেন যে আপনি একটি লেজিকাল ভেরিয়েবল ব্যবহার করছেন এবং প্যাকেজ ভেরিয়েবলের সম্পূর্ণ যোগ্যতার জন্য 'কঠোরভাবে ব্যবহার করুন' এর নিয়মগুলি বাইপাস করতে পারেন। যেহেতু ইন্টারপ্রেটার প্যাকেজ ভেরিয়েবলগুলি প্রথমবার ব্যবহার করার পরে স্বয়ংক্রিয়ভাবে তৈরি করে, তাই "আমাদের" ব্যবহারের পার্শ্ব প্রতিক্রিয়াটিও হতে পারে যে দোভাষা একটি প্যাকেজ ভেরিয়েবলও তৈরি করে। এক্ষেত্রে দুটি জিনিস তৈরি করা হয়েছে: একটি প্যাকেজ ভেরিয়েবল, যা দোভাষী যেকোন জায়গা থেকে অ্যাক্সেস করতে পারে, তবে 'ইউজ স্ট্রাইক' (এর প্যাকেজের নাম এবং দুটি কোলনের নাম সহ প্রিপেন্ড করা হয়েছে) এবং এর লেক্সিক্যাল ওরফে অনুরোধ অনুসারে যথাযথভাবে মনোনীত করা হবে ।
সূত্র: