Я сосредотачиваюсь на решении Inline::Perl5
, которое вы попробовали.
Для вызова на $gz.gzreadline($_)
: похоже, что gzreadline
пытаетсявернуть строку, прочитанную из zip-файла , изменив ее входной аргумент $_
(рассматривается как выходной аргумент, но это не настоящая ссылочная переменная Perl 5 [1] ),но измененное значение не возвращается в сценарий Perl 6.
Вот возможное решение: создайте модуль-обертку в текущем каталоге, например . / MyZlibWrapper.pm :
package MyZlibWrapper;
use strict;
use warnings;
use Compress::Zlib ();
use Exporter qw(import);
our @EXPORT = qw(gzopen);
our $VERSION = 0.01;
sub gzopen {
my ( $fn, $mode ) = @_;
my $gz = Compress::Zlib::gzopen( $fn, $mode );
my $self = {gz => $gz};
return bless $self, __PACKAGE__;
}
sub gzreadline {
my ( $self ) = @_;
my $line = "";
my $res = $self->{gz}->gzreadline($line);
return [$res, $line];
}
sub gzclose {
my ( $self ) = @_;
$self->{gz}->gzclose();
}
1;
Затем используйте Inline::Perl5
на этом модуле оболочки вместо Compress::Zlib
.Например, . / P.p6 :
use v6;
use lib:from<Perl5> '.';
use MyZlibWrapper:from<Perl5>;
my $file = 'data.txt.gz';
my $mode = 'rb';
my $gz = gzopen($file, $mode);
loop {
my ($res, $line) = $gz.gzreadline();
last if $res == 0;
print $line;
}
$gz.gzclose();
[1] В Perl 5 вы можете изменить входной аргумент, который не является ссылкой, и это изменение будет отраженов звонилке.Это делается путем изменения записей в специальной переменной массива @_
.Например: sub quote { $_[0] = "'$_[0]'" } $str = "Hello"; quote($str)
будет указывать $str
, даже если $str
не передается по ссылке.