نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی

پرل: عبارات و عملیات. A2.3.4.18 منطقی AND، OR و XOR

اصطلاحاتدر PERL، مانند سایر زبان های برنامه نویسی، آنها ترکیبی از متغیرها، ثابت ها و عملیات هستند که نتیجه معنی داری می دهند. این نتیجه می تواند یک اسکالر، یک آرایه یا یک آرایه انجمنی باشد.

تمام عملیات PERL به موارد زیر تقسیم می شوند:

عملیات I/O در مقاله توضیح داده شده است. Perl: توصیف کننده فایل"، عملیات با عبارات با قاعده — "پرل: عبارات منظم"، بخش "عملیات با عبارات منظم".

عملیات مقایسه

عملیات مقایسهدو عملوند را با هم مقایسه کنید و بسته به نتیجه این مقایسه 1 یا 0 را برگردانید. PERL شامل دو مجموعه از عملگرهای مقایسه است: برای مقایسه اعداد و برای مقایسه رشته ها. عملیات گروه اول ابتدا عملوندها را به عدد تبدیل کرده و سپس آنها را با هم مقایسه می کنند. عملیات گروه دوم عملوندها را به رشته تبدیل می کند و آنها را با آنها مقایسه می کند نظم واژگانی. اگر دستورالعمل استفاده از محلی مشخص شده باشد، مقایسه زمان مطابق با منطقه انجام می شود.

مقایسه اعدادمقایسه رشته هانامشرح
آ< b a lt b کمتر 1 اگر عملوند چپ از عملوند راست کمتر باشد.
a > b a gt b بیشتر 1 اگر عملوند چپ بزرگتر از عملوند راست باشد.
آ<= b a le b بیشتر نه 1 اگر عملوند چپ کمتر یا مساوی با عملوند راست باشد.
a => ب a ge b نه کمتر اگر عملوند چپ بزرگتر یا مساوی با عملوند راست باشد.
a == ب a eq b برابر است 1 اگر عملوند چپ با عملوند راست برابر باشد.
a!= ب a ne b نا برابر 1 اگر عملوند چپ با عملوند راست برابر نباشد.
آ<=>ب a cmp b مقایسه -1 اگر عملوند چپ کمتر از عملوند راست باشد. 0 اگر مساوی باشند؛ 1 اگر عملوند چپ بزرگتر از عملوند راست باشد.

مثال بعدی

$a = 299;
$b = 30;
اگر ($a< $b)
{
چاپ "عدد $a کمتر از عدد $b\n است"؛
}
اگر ($a lt $b)
{
چاپ "رشته $a کمتر از رشته $b\n است";
}

این پیام را نشان می دهد: خط 299 کمتر از خط 30 است.

عملیات بولی

PERL شامل دو مجموعه است عملیات منطقی ، که در نتیجه یکسان هستند، اما اولویت متفاوتی دارند. لطفاً توجه داشته باشید که نتایج عملیات AND و OR با نتایج پذیرفته شده در سایر زبان های برنامه نویسی متفاوت است.

عملگرهای and , or , xor و not کمترین اولویت را در بین تمام عملگرهای PERL دارند. این به آنها اجازه می دهد تا در سمت راست عبارات بدون پرانتز اضافی استفاده شوند، مانند این:

HANDLE، "file.dat" را باز کنید یا "Error: $!\n" را باز کنید.

با استفاده از عملیات || در این مثال به پرانتز نیاز دارد:

Open(HANDLE، "file.dat") || die "خطا: $!\n";

عملیات بیت

عملیات بیتبرای عملوندهایی که به عنوان نشان داده شده اند اعمال می شود اعداد باینری(یعنی به صورت رشته های بیتی) و مقداری را که نتیجه عملیات را نشان می دهد برمی گرداند.

عملنامشرح
a&b به صورت بیتی و اگر موقعیت های متناظر هر دو عملوند 1 باشد در هر موقعیت بیت 1 برمی گرداند.
یک | ب بیتی OR اگر موقعیت متناظر حداقل یک عملوند 1 باشد در هر موقعیت بیت 1 برمی گرداند.
a^b XOR بیتی اگر موقعیت متناظر یک عملوند دقیقاً 1 باشد در هر موقعیت بیت 1 برمی گرداند.
~ a به صورت بیتی نه عملیات یکنواخت هر موقعیت بیت عملوند را معکوس می کند.
آ<< b جابجایی به چپ تغییر می کند نمایش باینریعملوند سمت چپ با تعداد بیت های مشخص شده توسط عملوند دوم.
a >> b به راست تغییر دهید نمایش دودویی عملوند چپ را با تعداد بیت های مشخص شده توسط عملوند دوم به راست منتقل می کند.

عملیات Shift فقط برای عملوندهای عددی اعمال می شود، اما بقیه عملیات بیتهم برای اعداد و هم برای رشته ها اعمال می شود. اگر یکی از عملوندهای یک بیت یک عدد باشد، هر دو عملوند به اعداد صحیح تبدیل می شوند. اگر هر دو عملوند رشته ای باشند، به رشته هایی با طول یکسان تبدیل می شوند و این عمل روی هر بیت از رشته های حاصل انجام می شود. این به ما اجازه می دهد تا عملیات بیت را برای عملوندهایی با هر طولی اعمال کنیم. در این عملیات | | و ^ رشته کوتاه‌تر را با بیت‌های صفر به سمت راست قرار دهید، و عملیات & رشته طولانی‌تر را برای تناسب با رشته کوتاه‌تر کوتاه می‌کند. ما می توانیم به صراحت نوع عملیات را با استفاده از نقل قول برای رشته ها یا 0+ برای اعداد مشخص کنیم. مثال ها:

چاپ 1.9 | 2 شماره 3 (عملوند شناور به عدد صحیح کوتاه شده است)
چاپ 150 | "105"؛ # 255 (0x96 | 0x69 برابر است با 0xFF)
چاپ "150" | "105"؛ # "155" (در اسکی)
a = 150 دلار؛
$b = "105";
چاپ 0+$a | 0+$b; # عملوند عددی
چاپ "$a" | "$b"; # عملوند رشته

دستورالعمل های کنترل حسابی بر اجرای عملیات بیت تاثیر می گذارد. به طور پیش فرض، اعداد صحیح بدون علامت در نظر گرفته می شوند، بنابراین عملیات شیفت سمت راست، بیت های مرتبه بالای نتیجه را با صفر پر می کند و عملیات ~0 بزرگترین عدد صحیح مثبت را برمی گرداند. دستور استفاده از عدد صحیح باعث می شود اعداد صحیح به عنوان اعداد علامت دار تفسیر شوند. بنابراین، در محدوده خود، عملیات شیفت سمت راست، بیت های بالای نتیجه را با بیت علامت عدد پر می کند و عملیات ~0 عدد -1 را برمی گرداند.

عملیات Unary

unary plus

unary plus(+) عملوند خود را برمی گرداند. تنها کاربرد معنی دار این عملگر جدا کردن نام تابع از آرگومان های پرانتز شده آن است. این مثال را در نظر بگیرید:

چاپ (10 + 20) / 10;

برخلاف انتظار، این عبارت عدد 3 را چاپ نمی کند، بلکه عدد 30 را چاپ می کند. دلیل این امر این است که پرانتزهای اطراف آرگومان های تابع بالاترین اولویت را در PERL دارند، یعنی چاپ (10 + 20) قبل از تقسیم بر 10 اجرا می شود. نتیجه حاصل می شود. با استفاده از یک به علاوه unary در جلوی پرانتز، که اولویت آنها را کاهش می دهد:

چاپ +(10 + 20) / 10;

منهای یکنواخت

منهای یکنواخت(-) علامت عملوند عددی را معکوس می کند. اگر عملوند یک رشته باشد، نتیجه زیر برگردانده می شود:

  • اگر رشته با کاراکتر "+" یا "-" شروع شود، در نتیجه این کاراکتر با نویسه مقابل جایگزین می شود.
  • در غیر این صورت، الحاق کاراکتر "-" و رشته اصلی برگردانده می شود.

به طور خاص، ساختارهای -word و "-word" معادل هستند.

یک لینک ایجاد کنید

افزایش و کاهش

عملیات ++ و -- به ترتیب عملیات نامیده می شوند افزایشو کاهش. افزایش مقدار یک متغیر عددی را 1 افزایش می دهد. اگر به عنوان پیشوند (++a) استفاده شود، پس از افزایش 1 مقدار عملوند را برمی گرداند. اگر به عنوان پسوند (a++) استفاده شود، سپس مقدار عملوند را قبل از افزایش 1 برمی‌گرداند. اگر عملوند افزایشی یک متغیر رشته‌ای باشد که با الگوی /^**$/ مطابقت دارد، آنگاه رشته با نویسه به نویسه افزایش می‌یابد. مثال ها:

چاپ ++ ($x = "99"); # "یکصد"
print ++ ($x = "a0"); # "a1"
print ++($x = "Az"); #"با"
print ++ ($x = "zz"); # "آآآ"

کاهش فقط برای متغیرهای عددی اعمال می شود و مقدار متغیر را با 1 کاهش می دهد. اگر به عنوان پیشوند (--a) استفاده شود، پس از کاهش آن به میزان 1، مقدار عملوند را برمی گرداند. اگر به عنوان پسوند استفاده شود ( a--)، سپس عملوند مقدار را قبل از کاهش 1 برمی گرداند. مثال ها:

چاپ --($x = 99); #98
چاپ (($x = 99)--); #99
چاپ --($x = "a0"); # -یک

نام عملیات یکنواخت

عملیات افزایشی

دو تا هستند عملیات افزایشیروی اعداد (جمع و تفریق) و یکی روی رشته ها (الحاق).

چاپ "1" + "2"؛ #3
چاپ "1". "2"؛ # "12"

عملیات ضربی

چهار تا هست عملیات ضربیروی اعداد (ضرب، تقسیم، باقیمانده مدول و توان) و یک روی رشته ها (تکرار).

عملنامشرح
الف*ب ضرب حاصل ضرب دو عملوند عددی را برمی‌گرداند.
الف/ب بخش ضریب دو عملوند عددی را برمی‌گرداند.
a % b باقیمانده مدول پس از تقسیم عملوند چپ بر عملوند راست، باقیمانده عدد صحیح را برمی‌گرداند. اعداد شناور قبل از عملیات به اعداد صحیح گرد می شوند. اگر b منفی باشد، نتیجه نیز منفی است.
الف**ب توانمندی a را به توان b برمی گرداند.
a x b تکرار عملوند سمت چپ باید یک رشته یا لیست باشد، عملوند سمت راست باید یک عدد باشد. عملوند a را بارهای تکرار شده برمی گرداند.

چاپ "-" x 80; # رشته ای از منفی ها را چاپ می کند
@ones = (1) x 5; # @ones = (1، 1، 1، 1، 1)
@ones = (2) x @ones; # @ones = (2، 2، 2، 2، 2)

عملیات واگذاری

عملیات واگذارینتیجه عملیات را که توسط عملوند سمت راست و خود عملیات مشخص می شود به عملوند چپ اختصاص دهید. عملگر انتساب اولیه a = b است، به این معنی که: مقدار عملوند b را به متغیر a اختصاص دهید. همانطور که در جدول زیر نشان داده شده است، همه عملگرهای تخصیص دیگر مختص عملگرهای دیگر هستند.

عملمعنی
a += b a = a + b
a - = ب a = a - b
a.= ب a = a. ب
a *= ب a = a * b
a /= b a = a / b
a %= b a = a % b
a x= b a = a x b
a **= ب a=a**b
آ<<= b a = a<< b
a >>= ب a = a >> b
a &= b a = a&b
a |= ب a = a | ب
a ^= b a=a^b
a &&= b a = a && b
a ||= ب a = a || ب

عملگر انتساب عملوند سمت چپ خود را برمی گرداند و بنابراین می تواند در سمت چپ عملگر انتساب بعدی استفاده شود. برای مثال

($a += 2) *= 3;

معادل

$a += 2;
$a *= 3;

تخصیص یک لیست به یک لیست، لیستی از متغیرهایی را که مقادیر به آنها اختصاص داده شده است، برمی گرداند. تخصیص یک لیست به یک اسکالر تعداد عناصر موجود در آن لیست را برمی گرداند.

عملیات q

در اکثر زبان های برنامه نویسی، از نقل قول برای تشکیل ثابت های رشته ای استفاده می شود. با این حال، در PERL آنها عملیاتی هستند که درون یابی رشته و تطبیق الگو را فراهم می کنند. ما چنین عملیاتی را نام خواهیم برد عملیات q(از جانب کلمه انگلیسینقل قول، یعنی نقل قول). PERL شامل دو مجموعه از عملیات q است که در جدول زیر فهرست شده است.

نقل قول هاعملیات qمعنیدرون یابی
"" q() مقدار ثابت نه
"" qq() مقدار ثابت آره
`` qx() تیم بله (اگر جداکننده ها "" نباشند)
qw() فهرست واژه نه
qr() عبارت منظم بله (اگر جداکننده ها "" نباشند)
// m() تطبیق الگو بله (اگر جداکننده ها "" نباشند)
s()() تعویض بله (اگر جداکننده ها "" نباشند)
tr()() نویسه‌گردانی فقط سکانس های فرار

در اینجا، به جای براکت ()، می توانید از هر کاراکتری که یک حرف، عدد یا فاصله یا جداکننده جفت نیست استفاده کنید: ()،، ()،<>. نمونه‌هایی از استفاده از ساختارهای q برای ایجاد ثابت‌های رشته‌ای ارائه شده است بند 6.2.3.2; برای استفاده از آنها در عبارات منظم، نگاه کنید به بند 6.4.6 .

سایر عملیات

دزدی کردن

عمل آدرس زداییبه نظر می رسد:

عملیات الزام آور

اکثر عملیات روی عبارات منظم با متغیر ویژه $_ کار می کنند. برای تطبیق الگو رشته های دلخواهاستفاده می شود عملیات پیوند دادن، که شبیه به:

الف =~ با !~ ب

که در آن a هر عبارت رشته ای است و b الگویی برای مطابقت، جایگزینی یا ترجمه است. عملگر =~ اگر مطابقت، جایگزینی یا نویسه‌گردانی موفقیت‌آمیز بود، true را برمی‌گرداند و در غیر این صورت false. عملیات !~ نفی منطقی نتیجه =~ را برمی گرداند. برای مثال هایی از نحوه استفاده از این عملیات، نگاه کنید بند 6.4.6 .

تنظیم محدوده

عمل تنظیم محدودهبه نظر می رسد:

آنها در واقع دو عملیات متفاوت بسته به زمینه هستند. در زمینه لیست، این عملیات فهرستی از مقادیر (a+1...b) را برمی گرداند. برای رشته ها، محدوده با استفاده از افزایش، مثلا:

Foreach (1..10)
{
# حلقه 10 بار
}
@a = @a[$#a-4 .. $#a]; # پنج عنصر آخر را برش می دهد
@a = ("abc".."abe"); # @a = ("abc"، "abd"، "abe")

در زمینه اسکالر، این عملیات مانند یک ماشه عمل می کند که دو حالت دارد و true یا false را برمی گرداند. هر یک از عملیات.. حالت خود را ذخیره می کند. تا زمانی که عملوند چپ آن نادرست باشد، نادرست است. هنگامی که عملوند چپ درست شد، این عمل تا زمانی که عملوند سمت راست نادرست باشد، صادق است. پس از اینکه عملوند سمت راست درست شد، این عملیات دوباره false را برمی گرداند.

نتیجه تا تماس بعدی این عملیات نادرست نمی شود. عملیات.. می‌تواند عملوند درست را آزمایش کند و همزمان با ارزیابی درست، نادرست شود، اما زمانی که true را برگرداند. اگر بخواهیم تا زمان فراخوانی بعدی عملوند مناسب را ارزیابی نکند، باید از فرم استفاده کنیم

در غیر این صورت، عملیات .. و ... یکسان است. عملوند سمت راست ارزیابی نمی شود در حالی که عملیات نادرست است و عملوند چپ ارزیابی نمی شود در حالی که عملیات درست است. مقدار بازگشتی توسط این عملیات است خط خالیدر حالت نادرست و اعداد صحیح متوالی که از 1 در حالت درست شروع می شوند. شماره دنباله برای محدوده جدید بازنشانی می شود. به آخرین شمارهمحدوده، رشته "E0" اضافه می شود. اگر هر یک از عملوندها ثابت باشد، به طور ضمنی با متغیر ویژه $ مقایسه می شود. (شامل شماره خط فعلیفایل کنونی). مثال زیر باز می شود فایل داده شدهو خطوط آن را یک تا پنج چاپ می کند.

باز کردن HANDLE، "filename.ext"؛
در حالی که ( )
{
چاپ اگر (1..5);
}

عملیات مشروط

عملیات مشروطیک عملیات سه تایی است که به نظر می رسد:

تست؟ value1: value2

که در آن test، value1 و value2 هر عبارتی هستند. اگر تست درست باشد، عملیات مقدار1 را برمی‌گرداند، در غیر این صورت مقدار2 را برمی‌گرداند. مثال:

Printf "%d%s دیگر دارم.\n"، $n، ($n == 1) ? "g" : (($n< 5) ? "га" : "зей");

این عملگر می تواند در سمت چپ یک عملگر انتساب استفاده شود اگر هر دو مقدار 1 و مقدار 2 متغیر باشند، به عنوان مثال:

($test ? $a: $b) = $c;

کاما عملیات

کاما عملیاتباعث ارزیابی متوالی مقادیر دو عبارت می شود و دومی آنها را برمی گرداند. به نظر می رسد:

Expr1، expr2

که در آن expr1 و expr2 هر عبارتی هستند. در لیست ها، کاما به عنوان جداکننده بین آیتم های لیست عمل می کند.

PERL دارای یک مترادف برای این عملیات فرم است

expr1 => expr2

این فرم معمولاً برای عناصر لیست جفت شده استفاده می شود، به عنوان مثال، هنگام تنظیم اولیه آرایه های انجمنی. همچنین، اگر عملوند سمت چپ عملگر => یک کلمه باشد، به عنوان یک رشته تفسیر می شود (به زیر مراجعه کنید). بند 6.2.7)

ترتیب عملیات ها

هنگام ارزیابی عبارات، PERL را در نظر می گیرد اولویت عملیات: ابتدا عملیات با اولویت بالاتر انجام می شود. برای تغییر ترتیب عملیات، استفاده کنید پرانتز: عبارت محصور در آنها بالاترین اولویت را دارد. جدول زیر تمام عملگرهای زبان PERL را به ترتیب تقدم نزولی فهرست می کند. عملیات واقع در همان ردیف جدول دارای اولویت یکسان هستند و همانطور که در جدول نشان داده شده است یا از چپ به راست یا از راست به چپ انجام می شود.

عملانجمنی
شرایط و فهرست ها ترک کرد
-> ترک کرد
++ -- خیر
** درست
! ~ \ + (یوناری) - (یوناری) درست
=~ !~ ترک کرد
* / ٪ ایکس ترک کرد
+ - . ترک کرد
<< >> ترک کرد
به نام عملیات واحد خیر
< > <= >= lt gt le ge خیر
== != <=>eq ne cmp خیر
& ترک کرد
| ^ ترک کرد
&& ترک کرد
|| ترک کرد
.. ... خیر
?: درست
= op= درست
, => ترک کرد
نه درست
و ترک کرد
یا xor ترک کرد

روش های مختلفی برای مقایسه اشیاء در پرل وجود دارد. می توانید برابری مقادیر را با استفاده از عملگر infix === بررسی کنید. برای اشیای تغییرناپذیر (که مقادیر آنها را نمی توان تغییر داد، لفظ. به عنوان مثال، 7 تحت اللفظی همیشه 7 خواهد بود) مقایسه معمولیارزش های. به عنوان مثال "hello"==="hello" همیشه درست است زیرا هر دو رشته تغییرناپذیر هستند و مقدار یکسانی دارند.

برای اشیاء قابل تغییر، === هویت آنها را مقایسه می کند. === اگر آرگومان های آن نام مستعار همان شی باشند، true را برمی گرداند. یا دو شیء یکسان هستند اگر یک شیء باشند. حتی اگر هر دو آرایه @a و b@ حاوی باشند همان مقادیر، اگر ظروف آنها اشیاء متفاوتی باشند، هویت های متفاوتی خواهند داشت و در مقایسه با === یکسان نخواهند بود:

من @a = 1، 2، 3; my @b = 1, 2, 3; بگو @a === @a; #1 بگو @a === @b; # 0 # هویت مورد استفاده در اینجا 3 === 3; # 1 بگویید "a" === "a"; # 1 my $a = "a"; بگویید $a === "a"; #یک

اگر دو شی از یک نوع و ساختار باشند، عملگر eqv True را برمی‌گرداند. بنابراین برای @a و b@ در مثال، @a eqv @b درست است زیرا @a و b@ دارای مقادیر یکسانی هستند. از طرف دیگر، "2" eqv 2 False را برمی گرداند، زیرا آرگومان سمت چپ یک رشته و در سمت راست یک عدد است، بنابراین آنها انواع مختلفی دارند.

همانطور که == آرگومان های خود را به اعداد تبدیل می کند، عملگر eq infix برابری رشته ها را مقایسه می کند و در صورت لزوم آرگومان ها را به رشته ها تبدیل می کند.

اگر $greeting eq "سلام" باشد ( بگویید "خوش آمدید"؛ )

سایر عملگرها رشته ها را از نظر لغوی مقایسه می کنند.

در واقع یک فرم راحت تر برای !==، که به نوبه خود الحاق عملگر متا است! و عملگر infix == . همین توضیح در مورد ne و!eq نیز صدق می کند.

عملگرهای مقایسه سه طرفه دو عملوند را می گیرند و برمی گردانند Order::Increase اگر عملوند سمت چپ کمتر باشد، Order::Same اگر مساوی باشد، Order::Decrease اگر عملوند سمت راست کمتر باشد (Order::Increase , Order ::همان و ترتیب: :کاهش تعداد هستند؛ ببینید). برای مقایسه عددی، از عملگر استفاده کنید<=>و برای رشته ها پا است (از انگلیسی l esser, e qual, g reater). عملگر cmp infix نیز یک عملگر مقایسه است که سه نتیجه مقایسه را برمی‌گرداند. ویژگی آن این است که بستگی به نوع استدلال دارد: اعداد را به عنوان مقایسه می کند<=>، رشته ها به عنوان پا و (مثلا) جفت ها ابتدا کلیدها و سپس مقادیر (در صورت مساوی بودن کلیدها) را با هم مقایسه می کنند.

بگو 10<=>5 # +1 بگو 10 پا 5; # زیرا "1" lt "5" می گویند "ab" پای "a"; # +1، مقایسه واژگانی

یک کاربرد معمولی از عملگرهای مقایسه سه طرفه ذکر شده مرتب سازی است. متد .sort در لیست ها بلوک یا تابعی را دریافت می کند که دو آرگومان آن را مقایسه می کند و اگر آرگومان ها مساوی باشند کمتر از 0 و اگر آرگومان اول بزرگتر از آرگومان دوم باشد، مقادیر منفی را برمی گرداند. سپس از این نتایج در مرتب سازی برای تشکیل نتیجه استفاده می شود.

بگو ~ .مرتب سازی؛ # خروجی: انتزاعی عینی بگو ~ .sort: -> $a, $b ( uc($a) leg uc($b) ); # خروجی: بتن انتزاعی

مرتب‌سازی پیش‌فرض به حروف بزرگ و کوچک حساس است، یعنی. کاراکترهای بزرگ "بزرگتر" از کاراکترهای کوچک هستند. مثال از مرتب‌سازی بدون حساس به حروف بزرگ و کوچک استفاده می‌کند.

عملگرهای مختلف مقایسه، آرگومان های خود را قبل از مقایسه آن ها به انواع خاصی می اندازند. این زمانی مفید است که مقایسه خاصی مورد نیاز است اما انواع پارامترها ناشناخته هستند. Perl 6 یک عملگر ویژه را ارائه می دهد که امکان مقایسه "کار درست را انجام دهید" با استفاده از ~~، عملگر مقایسه "هوشمند" را فراهم می کند.

اگر $pints-drunk ~~ 8 (بگویید «به خانه برو، به اندازه کافی خوردی!»؛ ) اگر $country ~~ «سوئد» (بگویید «کوفته با انگور بری و گوزن سیب زمینی، لطفاً.») مگر اینکه $group-size ~~ 2..4 (بگویید "برای رزرو این تور باید بین 2 تا 4 نفر داشته باشید.";)

اپراتور تطبیق هوشمند بسته به نوع مقدار سمت راست همیشه تصمیم می گیرد که چه نوع مقایسه ای انجام دهد. در مثال های قبلی، این مقایسه ها به ترتیب مقایسه عددی، رشته ای و محدوده بود. این فصل عملکرد عملگرهای مقایسه را نشان می‌دهد: اعداد - == و رشته‌ها معادله. با این حال، عملگری برای مقایسه محدوده‌ها وجود ندارد. این بخشی از قدرت تطبیق "هوشمند" است: انواع پیچیده تر به شما امکان می دهد ایده های غیر معمول را با ترکیب مقایسه با دیگران پیاده سازی کنید.

تطبیق هوشمند با فراخوانی متد ACCEPTS در عملوند سمت راست و ارسال عملوند چپ به عنوان آرگومان کار می کند. عبارت $answer ~~ 42 به فراخوانی 42.ACCEPTS($answer) خلاصه می شود. این اطلاعات با خواندن فصل های بعدی در مورد کلاس ها و روش ها مفید خواهد بود. شما نیز چیزهایی را بنویسید که می‌توانند با اجرای روش ACCEPTS تطبیق "هوشمند" را انجام دهند تا "آنطور که باید کار کند".

برای مقایسه داده‌های اسکالر یا مقادیر متغیرهای اسکالر، پرل مجموعه‌ای از عملیات دودویی را ارائه می‌کند که روابط مساوی، بزرگ‌تر، بزرگ‌تر یا مساوی و غیره را بین عملوندهای خود محاسبه می‌کند، به همین دلیل این گروه از عملیات نیز نامیده می‌شود. عملیات رابطه ای پرل از عملیات های مختلفی برای مقایسه داده های عددی و داده های رشته ای استفاده می کند. همه آنها در جدول ارائه شده است. 4.1.

جدول 4.1. عملیات رابطه

عمل عددی رشته معنی
برابری == معادله اگر عملوندها برابر باشند درست است، در غیر این صورت نادرست است
نابرابری != نه اگر عملوندها برابر نباشند درست است، در غیر این صورت نادرست است
کمتر < lt اگر عملوند چپ کمتر از عملوند راست باشد صحیح است، در غیر این صورت نادرست است
بیشتر > gt اگر عملوند چپ بزرگتر از راست باشد درست است، در غیر این صورت نادرست است
کمتر یا مساوی <= له اگر عملوند چپ بزرگتر یا مساوی با عملوند راست باشد صحیح است، در غیر این صورت نادرست است
بیشتر یا برابر >= GE اگر عملوند سمت راست بزرگتر یا مساوی با سمت چپ باشد صحیح است، در غیر این صورت نادرست است
مقایسه <=> cmt 0 اگر عملوندها برابر باشند
1 اگر عملوند چپ بزرگتر از راست باشد
-1 اگر عملوند راست بزرگتر از چپ باشد

نتیجه عملیات رابطه ای (به جز آخرین مقایسه) True، مقدار 1 یا False، رشته خالی "" است.

اظهار نظر
مقدار true در عملیات حسابی به عنوان عدد 1 و در عملیات رشته به عنوان رشته "1" تفسیر می شود. مقدار نادرست در عملیات حسابی به عنوان عدد 0 و در عملیات رشته به عنوان یک رشته خالی " " تفسیر می شود.

عملیات نسبت عددی

عملیات رابطه ای عددی روی داده های عددی اعمال می شود و یک یا هر دو عملوند را می توان با رشته ای حاوی یک عدد اعشاری معتبر به دست داد. اگر هر یک از عملوندهای یک عملیات رابطه‌ای عددی روی رشته‌ای تنظیم شود که محتوای آن یک عدد اعشاری معتبر را نشان نمی‌دهد، مقدار آن روی o تنظیم می‌شود و هشداری درباره استفاده نادرست از عملوند در عملیات رابطه‌ای عددی نمایش داده می‌شود. اگر حالت نمایش هشدار مترجم پرل فعال باشد). معنای عملیات رابطه ای برای داده های عددی با عملیات ریاضی معمول مقایسه اعداد مطابقت دارد (مثال 4.7).

123 > 89; # نتیجه: 1 (درست)

123 < 89; # Результат: "" (ложь)

123 <= 89; # Результат: "" (ложь)

89 <= 89; # Результат: 1 (истина)

23 >= 89; # نتیجه: "" (نادرست)

23 <=>89; # نتیجه: -1 (عملوند راست بزرگتر از چپ)

89 <=>23; # نتیجه: 1 (عملوند راست بزرگتر از چپ)

استفاده از عملیات مقایسه عددی دشوار نیست، با این حال، هنگام مقایسه برای برابری اعداد ممیز شناور اعشاری، ممکن است اثرات گرد کردن ظاهر شود که با تعداد محدودی از ارقام قابل توجه در مانتیس مربوط به نمایش اعداد واقعی در رایانه و منجر به " نادرست"، از دیدگاه کاربر، عملیات مقایسه . مثال 4.8 وضعیت مشابهی را نشان می دهد.

#! peri-w
$z = 0.7;

$zz = 10+0.7-10; # متغیر $zz حاوی عدد 0.7 است

# اگر $z و $zz مساوی هستند رشته "z برابر با zz" را چاپ کنید چاپ "z برابر با zz\n" اگر ($z == $zz);

وقتی می‌خواهیم مثال 4.8 را اجرا کنیم، با تعجب متوجه می‌شویم که برنامه ما چیزی را چاپ نمی‌کند. موضوع چیه؟ پاسخ در عملگر محاسبه مقدار متغیر $zz نهفته است. هنگام انجام عملیات حسابی، خطاهای گرد کردن به مقدار 0.699999999999999 منجر می شود (شما می توانید دستور چاپ متغیر $zz را وارد کنید و این را ببینید)، اگرچه نزدیک به 0.7 است، اما دقیقاً با آن برابر نیست. بنابراین، عملیات مقایسه به درستی انجام شد!

مشاوره
از عمل مقایسه برای برابری اعداد واقعی استفاده نکنید، ممکن است نتیجه آن با آنچه از دیدگاه ریاضیات انتظار می رود مطابقت نداشته باشد. اگر باید برابری دو عدد واقعی را بررسی کنید، بهتر است قدر مطلق تفاوت آنها را با یک عدد بسیار کوچک (بسته به دقت مورد نیاز) مقایسه کنید:

abs ($a-$b)<= 0.00000001; # Проверка равенства

عملیات رابطه رشته ای

مقایسه داده‌های رشته‌ای بر اساس ترتیب آنها مطابق جدول کد اسکی است، یعنی کاراکتری با کد اسکی پایین‌تر مقدم بر کاراکتری با کد بالاتر است. رشته ها کاراکتر به کاراکتر از چپ به راست مقایسه می شوند. این بدان معناست که اگر کاراکترهای اول رشته‌ها با هم برابر باشند، کاراکترهای دوم با هم مقایسه می‌شوند و اگر با هم برابر باشند، سومین کاراکترها مقایسه می‌شوند و غیره. علاوه بر این، اگر طول‌های رشته‌ها متفاوت باشد، تعداد کاراکترهای از دست رفته است. برای برابری با کد o به انتهای رشته کوتاهتر اضافه می شود. لازم به ذکر است که برخلاف برخی از زبان های برنامه نویسی دیگر، کاراکترهای فضای خالی انتهایی Perl هنگام مقایسه رشته ها مهم هستند. مثال 4-9 مقایسه رشته ای را نشان می دهد که قوانین فوق را نشان می دهد.

«الف» آن «الف»؛ # نتیجه: درست (کد "A" - \101، کد "a" - \141)
"a" آن "aa";
# با کد \000 که کمتر از کد \141 است
# کاراکتر دوم "a" از رشته عملوند سمت راست)
"a" It "a"; # نتیجه: true (کاراکتر به رشته "a" اضافه می شود
# با کد \000 که کمتر از کد \040 است
# فضای انتهایی رشته عملوند سمت راست)
"12" آن "9"; # نتیجه: درست (کد "1" - \061، کد "9" - \071)
"9" معادل 09"؛ # نتیجه: نادرست (کد " " - \040، کد "O" - \060)

بیایید به دو عمل مقایسه لفظی رشته آخر توجه کنیم. محتویات عملوندهای آنها را می توان به اعداد صحیح تبدیل کرد و بنابراین همان عملیات نسبت عددی برای آنها اعمال می شود. با این حال، نتیجه آنها به طور قابل توجهی با نتیجه انجام عملیات رشته بر روی رابطه متفاوت خواهد بود. هنگام استفاده از عملیات< в предпоследнем выражении результат будет Ложь, а если в последнем выражении применить операцию ==, то результат будет Истина. Об этом всегда следует помнить, так как Perl автоматически преобразует символьные данные в числовые там, где это необходимо.

این بخش بر روی عبارات شرطی و حلقه ها تمرکز خواهد کرد.

اظهارات مشروط

مثل همیشه، بیایید بلافاصله با مثال هایی شروع کنیم.

$a = shift ;
اگر ($a > 10 ) (
چاپ "a > 10 \n";
}

برنامه نویسان در زبان های C مانند باید به طرز دردناکی با این ساختار آشنا باشند، بنابراین در اینجا چیز زیادی برای اظهار نظر وجود ندارد. اجازه دهید فقط بگویم که برخلاف C، بریس های فرفری را نمی توان در اینجا حذف کرد. به طور دقیق تر، راهی وجود دارد، اما در زیر بیشتر در مورد آن وجود دارد. ساختارهای if-else و if-else-if-… در پرل به شکل زیر هستند:

$a = shift ;
اگر ($a > 10 ) (
چاپ "a > 10 \n";
) دیگر (
چاپ "الف<= 10\n";
}

اگر ($a > 0 ) (
#کاری بکنید
) elif ($a == 0 ) (
#کاری بکنید
) دیگر (
#کار دیگه ای انجام بده
}

به طور کلی، همه چیز همانطور است که ما انتظار داریم با یک استثنا. در Perl "اگر دیگری" وجود ندارد - به جای آن باید از elsif استفاده شود. السیف را می توان چندین بار تکرار کرد، در غیر این صورت اختیاری است، بریس های فرفری را نمی توان حذف کرد.

بر خلاف سایر زبان های برنامه نویسی، Perl یک عبارت Unless را نیز ارائه می دهد. دو قطعه کد زیر همین کار را انجام می دهند:

مگر اینکه ($a == 0 ) (
# "... مگر اینکه a صفر باشد"
...
}

اگر ($a != 0 ) (
#همین
# ...
}

مگر اینکه بتوان در ترکیب با elsif و else استفاده کرد، اما در Perl "elsunless" وجود ندارد.

پرل این توانایی را دارد که در صورت صحیح بودن یک شرط فقط یک خط کد اجرا شود، مقدار کد را کاهش می دهد. مثال های زیر همین کار را می کنند:


اگر ($a > $b ) (
خروج 1 ;
}


مگر اینکه ($b == $c ) (
خروجی 2؛
}

# اگر شرط درست است - اسکریپت را با کد 1 خاتمه دهید
خروج 1 اگر ($a > $b ) ;
# اگر b == c، اجرای اسکریپت را ادامه دهید
خروج 2 مگر اینکه ($b == $c ) ;

در این مورد، براکت های مثال آخر را می توان حذف کرد:

# اگر شرط درست است - اسکریپت را با کد 1 خاتمه دهید
خروج از 1 اگر $a > $b ;

اگر در حال نوشتن به زبان جاوا/PHP یا یک زبان مشابه C هستید، این ساختار به احتمال زیاد برای شما غیرعادی خواهد بود، اما در عمل واقعا راحت است. از این گذشته ، در روسی معمولاً می گوییم "برنامه را اگر ... کامل کنید" و نه "اگر ... ، پس ...".

درست مانند C/C++ و PHP، پرل هم دارد اپراتور سه تایی؟:. شبیه ساز if-else، فقط در داخل عبارات کار می کند:

اگر ($a > $b ) (
$a = $a / $b ;
) دیگر (
$a = $b / $a ;
}

# کد مشابه با استفاده از عملگر "علامت سوال".
# یک خط کد به جای پنج
$a = $a > $b ? $a / $b: $b / $a ;

همچنین می خواهم چند کلمه در مورد عملگرهای مقایسه بگویم. اپراتورهای مقایسهدر زبان پرل به دو گروه تقسیم می شوند - تولید مقایسه اعداد و مقایسه رشته ها.

همانطور که به یاد دارید، اسکالرها در پرل را می توان به عنوان رشته یا اعداد تفسیر کرد. به عنوان مثال، عدد 123 بزرگتر از عدد 45 است، اما رشته "123" از رشته "45" کوچکتر است. به همین دلیل است که چندین گروه از اپراتورهای مقایسه را در نظر گرفت. مقایسه رشته ها در پرل مانند سایر زبان های برنامه نویسی مدرن انجام می شود، بنابراین امیدوارم در اینجا سوالی وجود نداشته باشد.

برای، foreach، while/تا، do..while/until حلقه ها

حلقه for برای همه برنامه نویسان به خوبی شناخته شده است:

# رشته "0 1 2 3 4" را چاپ کنید
برای ($i = 0 ؛ $i< 5 ; $i ++ ) {
چاپ "$i" ;
}

در پرانتز که با نقطه ویرگول از هم جدا شده اند نوشته می شود:

  1. کدی که باید قبل از شروع حلقه اجرا شود.
  2. شرایط در حال آزمایش قبل از شروع(و نه در پایان، همانطور که بسیاری از مردم فکر می کنند) از هر تکرار. اگر نادرست باشد، حلقه خاتمه می یابد.
  3. کدی که باید بعد از هر بار تکرار اجرا شود.

همانطور که در مورد عبارات شرطی، مهاربندهای فرفری را نمی توان در حلقه ها حذف کرد (همچنین یک نماد ویژه برای این وجود دارد - به زیر مراجعه کنید).

حلقه foreach باید برای برنامه نویسان PHP آشنا باشد:

@arr = (0 , 1 , 2 , 3 , 4 ) ;
# رشته "0 1 2 3 4" را چاپ کنید
foreach $i (@arr ) (
چاپ "$i" ;
}

بدنه حلقه foreach برای هر عنصر آرایه مشخص شده در پرانتز اجرا می شود. یکی از ویژگی های مهم foreach در متغیر $i است کپی نشدهعنصر آرایه @arr، همانطور که بسیاری از مردم فکر می کنند. متغیر $i در بدنه حلقه است خود عنصر آرایه. بنابراین، کد زیر مقدار هر عنصر در آرایه @arr را افزایش می دهد:

$i = 19880508 ;
foreach $i (@arr ) (
$i++;
}
# $i هنوز 19880508 است

همچنین می توانید از foreach برای کار با هش ها استفاده کنید:

% هش = (
aaa => 1،
bbb => 2،
) ;
# تابع keys یک آرایه حاوی همه کلیدهای هش را برمی گرداند
foreach $k (کلیدهای %hash ) (
چاپ "$k => $hash($k) \n";
}

پرل برای حلقههر یکشکل کوتاهی دارد:

اگر فراموش کردید که عملگر qw چه می کند،
# برگردید به قسمت اول "مبانی برنامه نویسی پرل"
برای $i (qw/1 2 3/ ) (
چاپ "$i" ;
}

یعنی در واقع به جای foreach می توانید به سادگی برای همه جا بنویسید. پرل این را با حلقه for واقعی اشتباه نمی گیرد، زیرا دومی به نقطه ویرگول و غیره نیاز دارد.

در حالی که حلقه‌های تا و do دقیقاً مانند C++ یا Pascal/Delphi کار می‌کنند:

# خروجی "1 2 3 4 5" به چهار روش مختلف

$i = 0 ;
در حالی که ($i< 5 ) { # تا زمانی که $i کمتر از پنج باشد
چاپ ++ $i . ""؛
}
چاپ" \n"; # خط جدید

$i = 0 ;
تا ($i == 5 ) ( # تا اینکه $i برابر با پنج شود
چاپ ++ $i . ""؛
}
چاپ" \n";

$i = 0 ;
انجام دادن(
چاپ ++ $i . ""؛
) در حالی که ($i< 5 ) ; # در انتهای حلقه چک کنید
چاپ" \n";

$i = 0 ;
انجام دادن(
چاپ ++ $i . ""؛
) تا ($i == 5 ) ;
چاپ" \n";

بر اساس قیاس با دستورات if و unless، یک شکل کوتاه شده برای نوشتن حلقه ها وجود دارد:

$i = 0 ;
چاپ ++ $i . در حالی که ($i< 5 ) ;
چاپ" \n";

$i = 0 ;
چاپ ++ $i . " " تا ($i == 5 ) ;
چاپ" \n";

چاپ "$_" برای (qw/1 2 3 4 5/ ) ; # شما همچنین می توانید foreach (qw/1 2 3 4 5/)؛
چاپ" \n";

به آخرین حلقه foreach توجه کنید. ما به یاد داریم که این یک خلاصه برای foreach است، نه یک حلقه for، درست است؟ اتفاقاً دومی سابقه کوتاهی ندارد. بنابراین، نام متغیر در اینجا نشان داده نشده است که به کمک آن به عناصر آرایه دسترسی خواهیم داشت. نمی توان آن را در کوتاه نویسی foreach استفاده کرد. در این مورد، از یک متغیر ویژه - $_ استفاده می شود. مثال زیر نیز کاملاً کار می کند:

برای (qw/1 2 3 4/ ) (
چاپ "$_" ;
}

به هر حال، می توان آن را به صورت زیر بازنویسی کرد.

و ما یاد گرفتیم که چگونه اعداد و رشته ها در حال پرواز به یکدیگر تبدیل می شوند. حتی یک نگاه هم به آن انداختیم بیان شرطی اگر، اما هنوز نحوه مقایسه دو اسکالر را نیاموخته اند. در مورد آن به آن پرداخته خواهد شددر این قسمت

اگر دو متغیر $x و $y داشته باشیم، آیا می توانیم آنها را با هم مقایسه کنیم؟ آیا 1، 1.0 و 1.00 برابر هستند؟ در مورد "1.00" چطور؟ کدام بزرگتر است - "فو" یا "بار"؟

دو مجموعه از عملگرهای مقایسه

پرل دو مجموعه از عملگرهای مقایسه دارد. درست مانند عملگرهای دودویی جمع (+)، الحاق (.) و تکرار (x) که قبلاً مطالعه کردیم، در اینجا نیز عملگر تعیین می کند که عملوندها چگونه رفتار می کنند و چگونه با هم مقایسه می شوند.

این دو مجموعه از عملگرها عبارتند از:

مقدار رشته عددی == eq برابر است!= ne برابر نیست< lt меньше >GT بیشتر<= le меньше или равно >= ge بزرگتر یا مساوی است

عملگرهای سمت چپ مقایسه می کنند مقادیر عددیو در سمت راست (در ستون وسط) مقادیر را بر اساس جدول ASCII یا محلی فعلی مقایسه کنید.

بیایید به چند نمونه نگاه کنیم:

سخت استفاده کنید استفاده از هشدارها؛ استفاده از 5.010; اگر (12.0 == 12) ( بگویید "درست"؛ ) در غیر این صورت ( بگویید "FALSE"؛ )

در این ساده ترین حالت، Perl TRUE را چاپ می کند زیرا عملگر == دو عدد را مقایسه می کند، بنابراین Perl اهمیتی نمی دهد که آنها به صورت اعداد صحیح نوشته شوند یا شناور.

در مقایسه بعدی، وضعیت کمی جالب تر است.

"12.0" == 12

این عبارت نیز درست است، زیرا عملگر == Perl یک رشته را به عدد تبدیل می کند.

2 < 3 истинно, так как < сравнивает два числа. 2 lt 3 также истинно, ведь 2 находистя перед 3 в جدول ASCII. 12 > 3 واضح است که درست است. 12 gt 3 FALSE برمی گردد

این ممکن است در نگاه اول برای برخی شگفت‌انگیز به نظر برسد، اما اگر به آن فکر کنید، پرل رشته‌ها را کاراکتر به کاراکتر مقایسه می‌کند. بنابراین "1" و "3" را مقایسه می کند، و از آنجایی که آنها متفاوت هستند و "1" قبل از "3" در جدول ASCII قرار می گیرد، پرل در این مرحله تصمیم می گیرد که مقدار رشته 12 از مقدار رشته 3 کمتر باشد.

شما همیشه باید مطمئن باشید که ارزش را دقیقاً همانطور که می خواهید مقایسه می کنید!

"foo" == "bar" درست خواهد بود

همچنین اگر اخطارهای(!) با استفاده از هشدارهای استفاده فعال شوند، اخطاری صادر می کند. دلیل آن این است که ما از دو رشته به عنوان اعداد در مقایسه عددی == استفاده می کنیم. همانطور که در قسمت قبل ذکر شد، پرل از سمت چپ به یک رشته نگاه می کند و آن را به عددی که در آنجا پیدا می کند تبدیل می کند. از آنجایی که هر دو رشته با حروف شروع می شوند، آنها به 0 تبدیل می شوند. 0 == 0، بنابراین عبارت درست است.

از طرف دیگر:

"foo" eq "bar" نادرست است

بنابراین شما همیشه باید مطمئن باشید که ارزش را دقیقاً همانطور که می خواهید مقایسه می کنید!

در هنگام مقایسه نیز همین اتفاق خواهد افتاد

"foo" == "" درست خواهد بود

"foo "eq"" نادرست خواهد بود

نتایج این جدول ممکن است مفید باشد:

12.0 == 12 TRUE "12.0" == 12 TRUE "12.0" معادل 12 FALSE 2< 3 ИСТИНА 2 lt 3 ИСТИНА 12 >3 TRUE 12 gt 3 FALSE! (توجه، ممکن است در نگاه اول مشخص نباشد) "foo" == "" درست است! (اگر از پراگما "هشدار" استفاده شود، یک هشدار ایجاد می کند) "foo" معادله "" FALSE "foo" == "bar" TRUE! (در صورت استفاده از پراگما "هشدارها" اخطار ایجاد می کند) "foo" eq "bar" FALSE

و در نهایت، مثالی که در آن می‌توانید در دام دریافت مقداری ورودی از کاربر بیفتید و خط جدید را با دقت قطع کنید تا بررسی کنید که آیا رشته خالی است.

سخت استفاده کنید استفاده از هشدارها؛ استفاده از 5.010; چاپ "ورودی: "; نام $ من = ; chomp $name; if ($name == "") (# اشتباه است! در اینجا به جای == از eq استفاده کنید! بگویید "TRUE"؛ ) other ( بگویید "FALSE"; )

اگر این اسکریپت را اجرا کنیم و "abc" را تایپ کنیم، یک پاسخ TRUE دریافت می کنیم، زیرا perl فکر می کرد "abc" همان یک رشته خالی است.

برترین مقالات مرتبط