با سلام خدمت کاربران گرامی سایت پی وی لرن و کاربرانی که علاقمندان به دوره آموزشی پرل Perl. در جلسه گذشته آموزش کار با subroutine را به صورت جزئی و مفصل به علاقمندان این دوره ارائه کردیم و کاربردها و انواع به معرفی نمودیم. در این جلسه و در ادامه این دوره آموزشی، آموزش کار با References در پرل را به طرفداران پرل ارائه خواهیم کرد.
در ابتدا آموزش کار با References در پرل به معرفی References می پردازیم.
References یک نوع داده اسکالر است که موقعیت اسکالرهای دیگر را که می توانند اسکالر، array و یا hashes شوند را نگه می دارد.
به خاطر ماهیت اسکالر ها، یک References می تواند هر جایی که یک اسکالر به کار رود استفاده شود.
می توان لیستی از References ها را برای سایر لیست ها ایجاد نمود که حاوی References هایی برای hashes هاست و … است.
به همین شکل و منوال است که ساختار داده های تو در تو برای پرل ساخته می شود.
ساخت یک References برای یک متغیر، subroutine، و یا مقدار به وسیله پیشوند سازی آن به وسیله backslash بسیار ساده است.
به مثال زیر توجه کنید.
1 2 3 4 5 | $scalarref = \$foo; $arrayref = \@ARGV; $hashref = \%ENV; $coderef = \&handler; $globref = \*foo; |
نمی توان با استفاده از اپراتور backslash یک مرجع در یک دسته I/O یا (filehandle or dirhandle) ایجاد کرد.
اما برای ایجاد یک References به یک arrray ناشناخته مانند مثال زیر باید از square brackets استفاده کرد.
1 | $arrayref = [1, 2, ['a', 'b', 'c']]; |
به طور مشابه مانند مثال زیر می توان با استفاده از curly brackets یک References به یک hash ناشناخته ایجاد نمود.
1 2 3 4 | $hashref = { 'Adam' => 'Eve', 'Clyde' => 'Bonnie', }; |
علاوه بر این دو مورد می توان برای یک subroutine ناشناخته نیز یک References ساخت و البته از subname هیچ نیز استفاده نکرد.
1 | $coderef = sub { print "Boink!\n" }; |
Dereferencing مقدار را از reference point به موقعیت فعلی باز می گرداند.
برای تبدیل یک reference به Dereferencing بسته به آن که آیا reference به یک اسکالر، array یا hash اشاره می کند می توان از پیشوند $، @ و یا % استفاده نمود.
برای درک بیشتر مسئله به مثال زیر توجه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/perl $var = 10; # Now $r has reference to $var scalar. $r = \$var; # Print value available at the location stored in $r. print "Value of $var is : ", $$r, "\n"; @var = (1, 2, 3); # Now $r has reference to @var array. $r = \@var; # Print values available at the location stored in $r. print "Value of @var is : ", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # Now $r has reference to %var hash. $r = \%var; # Print values available at the location stored in $r. print "Value of %var is : ", %$r, "\n"; |
اجرای کد بالا خروجی به شکل زیر خواهد داشت.
1 2 3 | Value of 10 is : 10 Value of 1 2 3 is : 123 Value of %var is : key220key110 |
اگر در مورد نوع متغیر مطمئن نیستید خوب است بدانید که متغیر از ref استفاده می نماید.
ref اگر argument یک رشته به عنوان reference تعیین شده باشد آن را بازگردانی می نماید.
به عبارت دیگر ref اقدام به بازگردانی false می کند.
1 2 3 4 5 6 | SCALAR ARRAY HASH CODE GLOB REF |
حالا بیاید مثال زیر را امتحان کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/bin/perl $var = 10; $r = \$var; print "Reference type in r : ", ref($r), "\n"; @var = (1, 2, 3); $r = \@var; print "Reference type in r : ", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var; print "Reference type in r : ", ref($r), "\n"; |
اجرای کد بالا خروجی به شکل زیر خواهد داشت.
1 2 3 | Reference type in r : SCALAR Reference type in r : ARRAY Reference type in r : HASH |
یک References دایره ای هنگامی رخ می دهد که دو References دارای یک Reference مرتبط با هم باشند.
بنابرین هنگام ایجاد References ها باید بسیار دقت کنید در غیر این صورت نا خواسته ممکن است یک References دایره ای ایجاد نمایید.
References دایره ای موجب لو رفتن اطلاعات حافظه می شوند.
برای درک بیشتر موضوع به مثال زیر توجه نمایید.
1 2 3 4 5 6 | #!/usr/bin/perl my $foo = 100; $foo = \$foo; print "Value of foo is : ", $$foo, "\n"; |
اجرای کد بالا خروجی به شکل زیر خواهد داشت.
1 | Value of foo is : REF(0x9aae38) |
این اتفاق ممکن است زمانی بی افتد که می خواهید یک signal handler را بسازید.
در این صورت می توانید به وسیله مقدم کردن نام یک تابع با &\ و دایره ای کردن آن reference به سادگی یک reference برای یک تابع ایجاد نمایید.
در این روش لازم است که مقادیر reference را با استفاده از عبارت & پیشوند سازی نمایید.
برای درک بهتر موضوع به مثال زیر توجه نمایید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/usr/bin/perl # Function definition sub PrintHash { my (%hash) = @_; foreach $item (%hash) { print "Item : $item\n"; } } %hash = ('name' => 'Tom', 'age' => 19); # Create a reference to above function. $cref = \&PrintHash; # Function call using reference. &$cref(%hash); |
اجرای کد بالا خروجی به شکل زیر خواهد داشت.
1 2 3 4 | Item : name Item : Tom Item : age Item : 19 |
در این جلسه آموزش کار با References در پرل را ارائه کردیم.
در جلسه بعدی با آموزش فرمت ها در پرل در کنار شما خواهیم بود.
با پی وی لرن همراه باشید.