كيف يمكنني تحديد ما إذا كان علامة Perl تحتوي على رسم خرائط مفتاح بقيمة غير محددة؟

StackOverflow https://stackoverflow.com/questions/2124977

سؤال

أحتاج إلى تحديد ما إذا كان بيرل هوه يحتوي على مفتاح معين ، ولكن سيتم تعيين هذا المفتاح بقيمة UNDEF. على وجه التحديد ، فإن الدافع لهذا هو معرفة ما إذا كانت أعلام منطقية أثناء استخدامها getopt() مع مرجع التجزئة مرت فيه. لقد بحثت بالفعل في كل من هذا الموقع وجوجل ، و exists() و defined() لا يبدو أن الأمر ينطبق على الموقف ، فهم يرون فقط ما إذا كانت القيمة الخاصة بمفتاح معين غير محددة ، فهي لا تتحقق مما إذا كان التجزئة لديه المفتاح بالفعل. إذا كنت RTFM هنا ، فيرجى توجيهني إلى الدليل الذي يفسر هذا.

هل كانت مفيدة؟

المحلول

موجود () والمحدد () لا يبدو أنه قابل للتطبيق على الموقف ، فهم يرون فقط ما إذا كانت القيمة لمفتاح معين غير محددة ، فهي لا تتحقق مما إذا كان التجزئة لديه بالفعل المفتاح

غير صحيح. هذا في الواقع ما defined() لا ، ولكن exists() يفعل بالضبط ما تريد:

my %hash = (
    key1 => 'value',
    key2 => undef,
);

foreach my $key (qw(key1 key2 key3))
{
    print "\$hash{$key} exists: " . (exists $hash{$key} ? "yes" : "no") . "\n";
    print "\$hash{$key} is defined: " . (defined $hash{$key} ? "yes" : "no") . "\n";
}

ينتج عنه:

$hash{key1} exists: yes
$hash{key1} is defined: yes
$hash{key2} exists: yes
$hash{key2} is defined: no
$hash{key3} exists: no
$hash{key3} is defined: no

تتوفر وثائق هاتين وظيفتين في سطر الأوامر على perldoc -f defined و perldoc -f exists (أو اقرأ الوثائق لجميع الطرق في perldoc perlfunc*). وثائق الويب الرسمية موجودة هنا:

*نظرًا لأنك ذكرت RTFM على وجه التحديد وقد لا تكون على دراية بمواقع وثائق Perl ، اسمحوا لي أيضًا بالإشارة إلى أنه يمكنك الحصول على فهرس كامل لجميع Perldocs في perldoc perl او عند http://perldoc.perl.org.

نصائح أخرى

إذا كنت أقرأ سؤالك بشكل صحيح ، أعتقد أنك مرتبك موجود. من الوثائق:

موجود expr

بالنظر إلى تعبير يحدد عنصر التجزئة أو عنصر الصفيف ، يُرجع صحيحًا إذا تم تهيئة العنصر المحدد في التجزئة أو الصفيف ، حتى لو كانت القيمة المقابلة غير محددة.

علي سبيل المثال:

use strict;
use warnings;

my %h = (
    foo => 1,
    bar => undef,
);

for my $k ( qw(foo bar baz) ){
    print $k, "\n" if exists $h{$k} and not defined $h{$k};
}

اجابة قصيرة:

 if ( exists $hash{$key} and not defined $hash{$key} ) {
    ...
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top