ما هو الفرق في بيرل عند تمرير متغير في التعبير العادي بين استخدام المتغير $ و $ {متغير}

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

سؤال

وأنا مراجعة بعض ClearCase مشغلات مكتوب في بيرل. وقد لاحظت أن في بعض التعابير العادية، يتم تمرير المتغيرات إما straighforwardly أو مع أسمائهم في الأقواس.

وعلى سبيل المثال، لدي السطر التالي من التعليمات البرمجية في مشغل:

if ($baseline !~ /^${component}_(|.*_)$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/ &&
        $baseline !~ /^${project_root}_$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/)

و$component، $phase، $automateddigit، $project_root كلها متغيرات.

لماذا بعض مرت كما $variable وغيرها مرت كما ${variable} في التعبير العادي؟

هل تأتي من كيفية initialised هم؟

وهنا هي سطر من التعليمات البرمجية initialising لهم:

($project = $ENV{CLEARCASE_PROJECT}) =~ s/\@.*$//;
($component = $ENV{CLEARCASE_COMPONENT}) =~ s/\@.*$//;

($project_root, $phase) = ($project =~ /^(.*)_(R\d+.*)$/);

exit(0) if (! $phase);

$phase .= ".0" if ($phase =~ /^R\d+$/);

$automateddigit = '';

$istream = `cleartool desc -fmt "%[istream]p" project:$ENV{CLEARCASE_PROJECT}`;

$componentlist = `cleartool desc -fmt "%[components]Cp" stream:$ENV{CLEARCASE_STREAM}`;
$componentsnbr = split(',', $componentlist);

if ($componentsnbr > 1) {
    $automateddigit .= '\\.\\d+';
}
هل كانت مفيدة؟

المحلول

إذا قمت بتمرير المتغير كما $ {اسم}، وهذا يفصل بوضوح حيث نهاية اسم المتغير هو، وأين بقية سلسلة مقتبسة تبدأ. على سبيل المثال، في التعليمات البرمجية:

if ($baseline !~ /^${component}_(|.*_)$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/ &&

وبدون المحددات {}:

if ($baseline !~ /^$component_(|.*_)$phase\.\d+(|[a-z]|-\d+|${automateddigit})$/ &&

لاحظ أن العنصر المتغير $ (يمكنك الرجوع إليها في اي من الاتجاهين) سيتم تفسيرها كما component_ $ بسبب زائدة تؤكد في التعبير العادي.

نصائح أخرى

أولا، وهذا ما يسمى سلسلة الاستيفاء. واحد سبب وجيه لاستخدامه في هذه الحالة هو منع $ project_root من أن تفسر على أنها project_root_ $ (لاحظ تسطير زائدة). يجعل صريح اسم المتغير، بدلا من تركها للقواعد الاستيفاء أكثر تعقيدا.

وانظر perldata لمعرفة المزيد عن الاستيفاء، وperlre وperlop على خصوصيات الاستيفاء ضمن مشغلي التعبير العادية.

وكما ذكر أعلاه، انها هناك لتحديد أسماء المتغيرات. الكثير من الأقواس المعقوفة يجعل التعابير العادية صعبة بالفعل أكثر صعوبة. الأقواس المعقوفة لها استخدامات التعبير العادي الخاصة بهم (للحد من عدد المرات نمط مباريات). أود أن أوصي باستخدام التعبير العادي / س معدل، وإعادة كتابة التعبير العادي الخاص بك على النحو التالي:

if ($baseline !~ /^$component    # Start with $component
                   _             # then an underscore
                   (|.*_)        # Then nothing, or anything followed by an underscore
                   $phase        # ...
                   \.\d+         # ...
                   (|            # Then optionally:
                      [a-z]|       # lower alpha
                      -\d+|        # or ...
                      $automateddigit
                   )
                   $/x &&
    $baseline !~ /^$project_root
                   _
                   $phase
                   \.\d+
                   (|
                     [a-z]|
                     -\d+|
                     $automateddigit
                   )$/x)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top