Согласно Fine Source, Archive :: Tar :: File удаляет старшие биты из режима.
Вы можете попробовать следующее магическое заклинание в начале вашего сценария (перед чем-либо
мог ссылаться на Archive :: Tar) и посмотреть, не нарушит ли это:
use Archive::Tar::Constant ();
BEGIN {
local $SIG{__WARN__} = sub{};
*Archive::Tar::Constant::STRIP_MODE = sub(){ sub {shift} };
}
...
use Archive::Tar;
...
Краткое объяснение: STRIP_MODE - это константа, которая содержит подпрограмму, которую можно передать в необработанном режиме, и возвращает режим, который должен быть сохранен. Обычно он установлен на
sub { shift() & 0777 }
Поскольку это константа, импортированная из Archive :: Tar :: Constant в Archive :: Tar :: File и используемая там, все, что ей задано, будет встроено в Archive :: Tar :: File при компиляции , Таким образом, чтобы изменить его, необходимо изменить константу до того, как она будет встроена, то есть до того, как будет загружен Archive :: Tar :: File.
N.B. Поскольку изменение встраиваемой константы подвержено ошибкам (изменение после того, как станет слишком поздно, чтобы иметь какой-либо эффект), обычно оно выдает серьезное предупреждение, которое нельзя отключить обычными средствами.