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

Этот вопрос принадлежит этому и этому

@ ikegami говорит:


Мы установили, что следующее возвращаетПерейдите к символу в корневом / главном пространстве имен, имя которого создается с помощью "_<$filename"

$::{ "_<$filename" }

Мы также установили, что следующие ссылки ссылаются на скаляр в корне / основном имени, имя которого создается с помощью "_<$filename":

${ $::{ "_<$filename" } }

И, наконец, мы также установили, что ниже приводится символическая ссылка, которая ссылается на тот же скаляр:

${ "::_<$filename" }

При отладке моего приложения я пишу следующеекод в отладчике:

DB::say "EXISTS";
defined ${ 'main::' }{ "_<$filename" }? DB::say "YES" : DB::say "NO";
defined ${ "::_<$filename" }? DB::say "YES" : DB::say "NO";
if( ${ 'main::' }{ "_<$filename" } ne ${ "::_<$filename" } ) {
    print "MISMATCH\n";
    print "$filename\n";
    print ${ 'main::' }{ "_<$filename" }, "\n",
        defined ${ 'main::' }{ "_<$filename" }, "\n",
        ${ "::_<$filename" }, "\n",
        defined ${ "::_<$filename" }, "\n";
    Devel::Peek::Dump( ${ ${ 'main::' }{ "_<$filename" } } );
    Devel::Peek::Dump( ${       "::_<$filename"  } );
    Devel::Peek::Dump( ${     $::{"_<$filename"} } );
    Devel::Peek::Dump( ${ ${'::'}{"_<$filename"} } );
}

Вывод:

EXISTS
YES
NO
MISMATCH
Specio::Constraint::Simple->_optimized_constraint
*main::_<Specio::Constraint::Simple->_optimized_constraint
1


SV = PV(0x14f6a30) at 0x184b200
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x1849990 "Specio::Constraint::Simple->_optimized_constraint"\0
  CUR = 49
  LEN = 51
SV = PV(0xe1f5f50) at 0xe5b9438
  REFCNT = 1
  FLAGS = ()
  PV = 0
SV = PV(0x14f6a30) at 0x184b200
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x1849990 "Specio::Constraint::Simple->_optimized_constraint"\0
  CUR = 49
  LEN = 51
SV = PV(0x14f6a30) at 0x184b200
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x1849990 "Specio::Constraint::Simple->_optimized_constraint"\0
  CUR = 49
  LEN = 51

ВНИМАНИЕ: когда $filename равно Specio::Constraint::Simple->_optimized_constraint переменные различны :

$::{ "_<$filename" }      # SV = PV(0xe1f5f50) at 0xe5b9438
${ $::{ "_<$filename" } } # SV = PV(0x14f6a30) at 0x184b200

но здесь (см. Раздел UPD), когда $filename равно /home/kes/work/projects/tucha/monkeyman/app/maitre_d/../..//local/lib/perl5/Specio/Constraint/Role/Interface.pm переменные одинаковы :

$::{ "_<$filename" }             # SV = PV(0x2e43d80) at 0x2f40400
${ $::{ "_<$filename" } }        # SV = PV(0x2e43d80) at 0x2f40400

1 Ответ

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

Это потому, что ваша переменная $filename содержит двойные двоеточия, поэтому при использовании в качестве части символической ссылки эти двойные двоеточия будут интерпретироваться как разделители пространства имен.Проезд непосредственно через таблицу символов (stash) не интерпретирует их как разделители, так как пространства имен различаются по иерархии физической памяти.Таким образом, для доступа к переменным, имена символов которых могут содержать двойные двоеточия, необходим прямой доступ к тайнику.Обычно я бы порекомендовал Package :: Stash для таких операций с тайником, но он запрещает доступ к именам символов, содержащим двойные двоеточия, потому что их невозможно использовать в качестве переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...