local($?) в блоках END. Почему имеет значение, какое значение ему присвоено?

На работе мы столкнулись с ошибкой при взаимодействии с дочерними процессами в деструкторе объекта и в итоге проследили ее до $? переменная перезаписывается во время вызовов ожидания. Это происходит после вызова exit(), поэтому $? дополнительно означал код возврата нашей программы в операционную систему.

В частности, perldoc говорил об ошибке такого рода:

Внутри подпрограммы END $? содержит значение, которое будет передано в exit(). Вы можете изменить $? в подпрограмме END, чтобы изменить статус выхода вашей программы.

Мы не хотим, чтобы это произошло, поэтому мы ставим local $?=$?; внутри каждого блока END. Но теперь программы возвращают успех ОС, фактически терпя неудачу в заданной задаче.

Мне удалось разбить его на два примера программ. Тот, который работает по назначению, и тот, который терпит неудачу. Это происходит как в v5.8.8, так и в v5.10.1 для x86_64-linux-thread-multi.

Программа A: (возвращает 0 операционной системе)

END{ local $?=$?; }
exit(100);

Программа B: (возвращает операционной системе 100)

END{ local $?=$?>>8; }
exit(100);

Почему так важно, какое значение было присвоено local $? в конце блока?


person jakebman    schedule 21.02.2013    source источник
comment
Да, это не кажется правильным. 5.16.1 тоже так себя ведет   -  person ikegami    schedule 21.02.2013


Ответы (1)


Похоже на ошибку в Perl. По-видимому, самоназначение $? в local нарушено:

% perl -wle '$? = 123; print "before: $?"; local $? = $?; print "after: $?"'    
before: 123
after: 0

Но эта версия работает нормально:

% perl -wle '$? = 123; print "before: $?"; local $? = $? + 0; print "after: $?"'
before: 123
after: 123

Довольно странно.

Отчет об ошибке отправлен .

person melpomene    schedule 21.02.2013
comment
Добавлена ​​ссылка на отчет об ошибке, который кто-то (вы?) подал. - person ikegami; 21.02.2013