Почему эти две переменные `$ {" _ <$ filename "}` и `$ {" :: _ <$ filename "}` не равны? - PullRequest
1 голос
/ 23 мая 2019

Этот вопрос относится к этому одному.

Вы говорите, что эти два одинаковы:

${ "::_<$filename" }                       # Not allowed under strict.
${ "_<$filename" }     # In main package   # Not allowed under strict.

Но как же тогда возможно следующее?

if( ${ "_<$filename" } ne ${ "::_<$filename" } ) {
    print "MISMATCH\n";
    print ">>${ '_<$filename' }<<\n>>${ '::_<$filename' }<<\n";
}

выход:

MISMATCH
>><<
>><<

это происходит, когда $filename равно /home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm

UPD
с " кавычками как @HåkonHægland рекомендуется

    print "MISMATCH\n";
    print ">>${ \"_<$filename\" }<<\n>>${ \"::_<$filename\" }<<\n";
    Devel::Peek::Dump( ${         "_<$filename"  } );
    Devel::Peek::Dump( ${       "::_<$filename"  } );
    Devel::Peek::Dump( ${     $::{"_<$filename"} } );
    Devel::Peek::Dump( ${ ${'::'}{"_<$filename"} } );

вывод:

MISMATCH
>><<
>>/home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm<<
SV = PV(0xfb84520) at 0xff527a0
  REFCNT = 1
  FLAGS = ()
  PV = 0
SV = PV(0x2e43d80) at 0x2f40400
  REFCNT = 1
  FLAGS = (POK,IsCOW,pPOK)
  PV = 0x2edc4a0 "/home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm"\0
  CUR = 111
  LEN = 113
  COW_REFCNT = 0
SV = PV(0x2e43d80) at 0x2f40400
  REFCNT = 1
  FLAGS = (POK,IsCOW,pPOK)
  PV = 0x2edc4a0 "/home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm"\0
  CUR = 111
  LEN = 113
  COW_REFCNT = 0
SV = PV(0x2e43d80) at 0x2f40400
  REFCNT = 1
  FLAGS = (POK,IsCOW,pPOK)
  PV = 0x2edc4a0 "/home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm"\0
  CUR = 111
  LEN = 113
  COW_REFCNT = 0

Из результатов видно, что переменные темы отличаются:

SV = PV(0xfb84520) at 0xff527a0
SV = PV(0x2e43d80) at 0x2f40400

1 Ответ

0 голосов
/ 23 мая 2019

Благодаря @HåkonHægland.Я пропустил, что :: означает main пакет.

Я был испорчен:

следующее эквивалентно:

${ "::_<$filename" }                       # Not allowed under strict.
${ "_<$filename" }     # In main package   # Not allowed under strict.

Теперь я понимаю, что означает

${ "::_<$filename" }   # This refers to a var in main package
${ "_<$filename" }     # This refers to a var in CURRENT! package
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...