تطبیق ساده – انجمن DEV

کمی بیش از ده سال پیش، زمانی که Perl 5.18 به تاریخ انتشار نزدیک می شد، من match::simple را منتشر کردم. این بیشتر در پاسخ به اپراتور smartmatch بود (~~
) منسوخ شدن، اما همچنین راه حلی برای قوانین فوق العاده مخفیانه برای نحوه عملکرد اپراتور smartmatch.
match::simple در نظر گرفته شده بود که … ساده تر باشد. این اپراتور کمی بد بو به نظر می رسد زیرا از ترفندهای هوشمندانه ای برای جعل کردن یک اپراتور infix استفاده می کند:
use match::simple;
if ( $this |M| $that ) {
...;
}
برای کسانی که سینتکس infix را دوست ندارند، یک تابع معمولی نیز ارائه شده است:
use match::simple 'match';
if ( match $this, $that ) {
...;
}
رفتار آن همیشه توسط عملوند سمت راست تعیین می شد. داده شده:
$a |M| $b
- اگر
$b
undef است،$a
فقط در صورتی منطبق است که آن نیز undef باشد. - اگر
$b
هر مقدار غیر مرجع دیگری است، مانند برابری رشته عمل می کند (eq
) اپراتور. - اگر
$b
یک regexp است، مانند regexp binding (=~
) اپراتور. - اگر
$b
یک کدنویس است،$a
مطابقت دارد اگر$b->($a)
واقعی را برمی گرداند. - اگر
$b
یک شی است،$a
مطابقت دارد اگر$b->MATCH($a)
درست یا$a ~~ $b
استفاده كردن~~
اضافه بار اپراتور - اگر
$b
یک آرایه است،$a
مطابقت دارد اگر$a |M| $_
برای هر عنصر از@{$b}
. - اگر
$b
هر چیز دیگری است، اپراتور croaks.
اینها ساده، معقول و قابل پیش بینی به نظر می رسیدند. بله، نوعی تطبیق عددی خوب بود، اما من به دلیل ابهام رشته های عددی آن را رد کردم.
به علاوه، زیرا اگر واقعاً به تطبیق عددی نیاز دارید، میدانستم که میتوانید عدد را در یک coderef قرار دهید:
if ( $a |M| sub { $b == shift } ) {
...;
}
Type::Tiny همیشه با match::Simple سازگار بوده است. شما می توانید استفاده کنید:
use match::simple;
use Types::Standard -types;
if ( $value |M| ArrayRef ) {
...;
}
elsif ( $value |M| HashRef ) {
...;
}
به هر حال، سریع به جلو تا کنون، و Perl 5.38 در حال حاضر منتشر شده است، که در نهایت اپراتور منسوخ شده اسمارت مچ را حذف می کند. خوشبختانه یکی از ویژگیهای جدیدی که ارائه میکند به اپراتورهای infix واقعی تعریف شده توسط کاربر اجازه میدهد!
معرفی نحو::اپراتور::مطابقت!
use Syntax::Operator::Matches;
if ( $this matches $that ) {
...;
}
این دقیقاً از همان منطق match::simple استفاده می کند – منطقی که از سال 2013 منجمد شده است، اما در نهایت نحو زیبایی دارد.
شما می توانید کارهای خوبی انجام دهید مانند:
use Syntax::Operator::Matches;
use Types::Standard -types;
if ( $value matches ArrayRef[Int] ) {
...;
}
elsif ( $value matches Str|Undef ) {
...;
}
برخی از آنها فقط یک بسته بندی در اطراف match:: ساده هستند، اما سایر بخشها صرفاً در XS اتفاق میافتند، بنابراین بسیار سریعتر عمل میکنند.
اگر به دنبال چیزی برای جایگزینی smartmatch در کد خود هستید، Syntax::Operator::Matches را در نظر بگیرید. اگر به سازگاری با عقب نیاز دارید، match::simple هنوز اینجاست و قرار نیست ناپدید شود.