Как включить функцию сортировки в модуле? - PullRequest
0 голосов
/ 26 октября 2018

Как включить пользовательскую функцию сортировки в модуль?

Например, если я создаю следующий скрипт (test.pl):

#!/usr/bin/perl

use 5.022;
use warnings;
use diagnostics;
use utf8;
use open qw(:std :utf8);
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

sub mysort {
    return $a cmp $b;
}

my @list = ('a', 'd', 'b', 'c');
say join "\n", sort mysort @list;

Он работает нормально.Однако, когда я разделяю их на test.pl:

#!/usr/bin/perl

use 5.022;
use warnings;
use diagnostics;
use utf8;
use open qw(:std :utf8);
binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

use my::module;

my @list = ('a', 'd', 'b', 'c');
say join "\n", sort mysort @list;

и my / module.pm:

package my::module;
use 5.022;
use warnings;
use diagnostics;
use utf8;
use open qw(:std :utf8);
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';

BEGIN {
    my @exp = 'mysort';
    require Exporter;
    our $VERSION   = 1.00;
    our @ISA       = 'Exporter';
    our @EXPORT = @exp;
    our @EXPORT_OK = @exp;
}

sub mysort {
    return $a cmp $b;
}

1;

, я получаю следующее сообщение об ошибке: Использование неинициализированного значения $ my:: module :: a в сравнении строк (cmp) в строке my / module.pm 20 (# 1) (W не инициализирован) Неопределенное значение использовалось так, как если бы оно уже было определено.Это интерпретировалось как "" или 0, но, возможно, это было ошибкой.Чтобы подавить это предупреждение, присвойте переменным определенное значение.

To help you figure out what was undefined, perl will try to tell you
the name of the variable (if any) that was undefined.  In some cases
it cannot do this, so it also tells you what operation you used the
undefined value in.  Note, however, that perl optimizes your program
and the operation displayed in the warning may not necessarily appear
literally in your program.  For example, "that $foo" is usually
optimized into "that " . $foo, and the warning will refer to the
concatenation (.) operator, even though there is no . in
your program.

Использование неинициализированного значения $ my :: module :: b в сравнении строк (cmp) в строке my / module.pm 20 (# 1))

Есть ли способ экспортировать переменные $ a и $ b в модуль?

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Если вы по какой-то причине не хотите добавлять прототип ($$) на mysort (хотя я не могу найти хороший пример такого желания), как в ответе @Ujin, вы также можете использовать caller для получения имени пакета вызывающего абонента (при условии, что вызывающий абонент всегда sort):

sub mysort {
    my $pkg = caller;
    {
        no strict 'refs';
        return ${"${pkg}::a"} cmp ${"${pkg}::b"};
    }
}
0 голосов
/ 26 октября 2018

$a и $b являются глобальными переменными пакета.Есть несколько вариантов доступа к ним в mysort, но все они довольно плохие.

Вы также можете использовать прототипный вариант:

sub mysort($$) {
    my ($a, $b) = @_;
    return $a cmp $b;
}

Но согласно документации этот вариантпомедленнее.http://perldoc.perl.org/functions/sort.html

...