Это ошибка Perl в интерпретации? - PullRequest
2 голосов
/ 05 июля 2011
 11 package C;
 12 $_ = 5;
 13 print "$_\n$C::_\n$::_\n";

output:

5

5

Как мы знаем, $_ - это суперглобальная переменная в Perl, но почему присвоение first этой переменной приведет к присвоению $::_ одновременно?

ОБНОВЛЕНИЕ

package C;
$_ = 5;
print "$_\n$C::_\n$::_\n";
package main;
print "####in main::\n";
$_ = 2;
print "$_\n$::_\n";
package A;
our $_ = 1;
$_ = 4;
print "####in A::\n";
print "$_\n$::_\n$A::_\n";
print "####in B::\n";
package B;
$_ = 3;
print "| $_ | \n
        |$::_ | \n
        |$B::_\n";

в последнем print, вы можете видеть, что $_ и $::_ различны.

| 3 |

        |2 |

        |

Ответы [ 4 ]

5 голосов
/ 05 июля 2011

$_ хранится в упаковке main.Также, если имя пакета опущено, предполагается пакет main.То есть $::_ эквивалентно $main::_ (а также $main'_).

Что касается вашего обновления: $_ должно быть $main::_.Но после our, $_ теперь смотрит на $A::_.Это похоже на ошибку в Perl 5.8.8.

4 голосов
/ 05 июля 2011

Строка $_ = 3; обрабатывается как $A::_ = 3; вместо $::_ = 3.Кажется, это ошибка в версии 5.8.8.

При запуске в отладчике строка

our $_ = 1;

создает переменную пакета $A::_, как это видно в отладчике.

  DB<5> V :: _
$_ = 2
@_ = (
   0  0
   1  '_'
   2  *main::_
   3  0
   4  '-1'
)

  DB<6> V A:: _
$_ = 1

следующая строка $_ = 4; изменяет $A::_.

При выполнении строки $_ = 3; устанавливается переменная пакета $A::_.Это тоже глючит.Он должен получить доступ $::_.Это вывод отладчика в тот момент:

  DB<7> V :: _
$_ = 2
@_ = (
   0  0
   1  '_'
   2  *main::_
   3  0
   4  '-1'
)

  DB<8> V A:: _
$_ = 3

Я надеюсь, что это показывает, что происходит.

3 голосов
/ 05 июля 2011

По умолчанию, $_ - это сокращение от $::_, как вы уже продемонстрировали.

Однако в своей части кода в своем обновлении вы изменили то, что $_ означаетсоздание лексического имени $_.Эта лексика используется в случае, о котором вы спрашиваете.

our $x создает лексическую переменную $x, связанную с $x текущего пакета, за исключением «суперглобальных».Для «суперглобальных» новая переменная ассоциируется с «суперглобальными».

>perl5140 -le"package PA; our $x='A'; package PB; $x='B'; print $PA::x;"
B

>perl5140 -le"package PA; our $_='A'; package PB; $_='B'; print $::_;"
B

Кажется, что исключение не существовало в 5.8.

Кстати, выпонимаете, что 5.8 и 5.10 официально закончились?

2 голосов
/ 05 июля 2011

::foo эквивалентно main::foo, а main:: - это место, где хранятся переменные пунктуации как $_.

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