Все структуры данных в Perl поддержки магии, а не только SV
s (несмотря на название) и специально для хэшей и массивов это является основой для вещей, как tie
механизм или тому подобное fieldhash
, который реализует аналог слабых литературы в уровень хэш-записей.
Поскольку директива OUTPUT
указывает, какие аргументы, по-видимому, будут изменены корпусом C XSUB, и переменная, содержащая заданную магию, может быть передана, установка значения в соответствии с типовой картой без вызова обработчика набора может привести к непоследовательности поведение.
use Scalar::Util qw(weaken);
my $foo;
my $ref = \$foo;
weaken($ref);
В качестве примера магии, weaken
вычитает счетчик ссылок $foo
, и добавляет магию указывая обратно $ref
так, что он очищается, когда $foo
получает мусора.
Кроме того, он также добавляет набор магии $ref
, чтобы разрушить эту спину, ссылающийся, в противном случае, когда $foo
разрушается, $ref
не будет очищен, даже если в данный момент он уже не указывает на $foo
.
Если вы используете $ реф в качестве аргумента, он получает псевдонимы в стеке (поэтому $_[0]
is assignable):
modifies_arguments($ref);
sub modifies_arguments {
$_[0] = "blah"; # set magic is invoked to tear down the back referencing
}
Если modifies_arguments
является чистым Perl это легко понять, почему это необходимо, но Разумеется, те же предположения о правильности должны иметь место для XSUB, поэтому OUTPUT
используется, чтобы отметить, какие аргументы будут иметь свое значение, установленное в значение переменной аргумента уровня C в конце тела функции, и установили срабатывание магии.
Это не относится к RETVAL
, так как это не технически назначение, а скорее толкание нового SV в стек, и любое заданное волшебство будет обработано после возвращения функции по присваиванию op (если оно есть).
Спасибо за разъяснение этого! Как насчет цитированного текста в скобках: * '", необходимых для параметров хэша или элемента массива, которые должны быть созданы, если они не существовали "' *? Что это значит? Означает ли это, что маска 'set' не применяется к скалярам или чему-то еще? –
'my @array; modifies_arguments ($ array [42]) 'будет только создавать элемент массива, когда он фактически изменен, ср. autovivification. Если массив магический, то это будет включать в себя набор магии на самом массиве. Тем не менее, это относится и к скалярам, как в приведенном выше примере $ ref. – nothingmuch