Как я могу сделать пакет Perl для скаляров? - PullRequest
0 голосов
/ 22 ноября 2018

Я уже использую пакет Perl (Funx.pm) для повторно используемого кода.Но я бы хотел, чтобы в качестве возвращаемых значений было включено несколько скаляров, т.е.использовать Funx :: при их использовании?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Вот пример модуля, который экспортирует константы.

package RPi::Const;

use strict;
use warnings;

our $VERSION = '1.04';

require Exporter;
use base qw( Exporter );
our @EXPORT_OK = ();
our %EXPORT_TAGS = ( all => \@EXPORT_OK );

use constant {
    RPI_MODE_WPI => 0,
    RPI_MODE_GPIO => 1,
    RPI_MODE_GPIO_SYS => 2,
    RPI_MODE_PHYS => 3,
    RPI_MODE_UNINIT => -1,
};

{ # mode

    my @const = qw(
        RPI_MODE_WPI
        RPI_MODE_GPIO
        RPI_MODE_GPIO_SYS
        RPI_MODE_PHYS
        RPI_MODE_UNINIT
    );

    push @EXPORT_OK, @const;
    $EXPORT_TAGS{mode} = \@const;
}

use constant {
    MCP23017_IODIRA     => 0x00,
    MCP23017_IODIRB     => 0x01,
    MCP23017_IPOLA      => 0x02,
    MCP23017_IPOLB      => 0x03,
    MCP23017_GPINTENA   => 0x04,
    MCP23017_GPINTENB   => 0x05,
    MCP23017_DEFVALA    => 0x06,
    MCP23017_DEFVALB    => 0x07,
    MCP23017_INTCONA    => 0x08,
    MCP23017_INTCONB    => 0x09,
    MCP23017_IOCONA     => 0x0A,
    MCP23017_IOCONB     => 0x0B,
    MCP23017_GPPUA      => 0x0C,
    MCP23017_GPPUB      => 0x0D,
    MCP23017_INTFA      => 0x0E,
    MCP23017_INTFB      => 0x0F,
    MCP23017_INTCAPA    => 0x10,
    MCP23017_INTCAPB    => 0x11,
    MCP23017_GPIOA      => 0x12,
    MCP23017_GPIOB      => 0x13,
    MCP23017_OLATA      => 0x14,
    MCP23017_OLATB      => 0x15,

    MCP23017_INPUT      => 1,
    MCP23017_OUTPUT     => 0,
};

{ # MCP23017 GPIO Expander Registers

    my @const = qw(
        MCP23017_IODIRA
        MCP23017_IODIRB
        MCP23017_IPOLA
        MCP23017_IPOLB
        MCP23017_GPINTENA
        MCP23017_GPINTENB
        MCP23017_DEFVALA
        MCP23017_DEFVALB
        MCP23017_INTCONA
        MCP23017_INTCONB
        MCP23017_IOCONA
        MCP23017_IOCONB
        MCP23017_GPPUA
        MCP23017_GPPUB
        MCP23017_INTFA
        MCP23017_INTFB
        MCP23017_INTCAPA
        MCP23017_INTCAPB
        MCP23017_GPIOA
        MCP23017_GPIOB
        MCP23017_OLATA
        MCP23017_OLATB
        MCP23017_INPUT
        MCP23017_OUTPUT
    );

    push @EXPORT_OK, @const;
    $EXPORT_TAGS{mcp23017_registers} = \@const;
}

1;
__END__

В ваших вызывающих скриптах вы можете импортировать каждый пакет (тег), или с помощью тега :all вы можете импортировать всеотдельные группы:

use RPi::Const qw(:mcp23017_registers); # single grouping

... или

use RPi::Const qw(:all); # all groupings

Тогда вы можете использовать любую из импортированных констант:

sub mode {
    my ($self, $pin, $mode) = @_;

    if (! defined $mode){
        my $reg = $pin > 7 ? MCP23017_IODIRB : MCP23017_IODIRA;
        my $bit = _pinBit($pin);
        return getRegisterBit($self->_fd, $reg, $bit);
    }

    _check_mode($mode);

    pinMode($self->_fd, $pin, $mode);
}
0 голосов
/ 22 ноября 2018

Предвосхищая это, говоря, что это плохая идея, представьте, если кто-то устанавливает другое значение на $SUCCESS где-нибудь в базе кода.Использование $Funx::SUCCESS - гораздо лучший способ, он также предоставляет контекст для определения успеха.

our() делает переменную видимой во всех областях, включая пакеты.

package Funx;
our($SUCCESS, $NOFILE, $COPYFAIL, $APPRUNNING);
$SUCCESS         =   0;
$NOFILE      =   1;
$COPYFAIL        =   2;
$APPRUNNING      =   3;

package main;
say($SUCCESS, $Funx::SUCCESS); # both work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...