首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为标量制作Perl包?

如何为标量制作Perl包?
EN

Stack Overflow用户
提问于 2018-11-22 05:18:06
回答 2查看 75关注 0票数 0

我已经为可重用代码使用了Perl包(Funx.pm)。但我希望它包含一堆标量作为返回值,即

代码语言:javascript
复制
my $SUCCESS         =   0;
my $NOFILE      =   1;
my $COPYFAIL        =   2;
my $APPRUNNING      =   3;
...and on and on....

是否有办法做到这一点,并且能够只使用变量而不必导入每个变量,也不必使用Funx::何时使用这些变量?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-22 06:29:29

在开头说这是个坏主意,想象一下如果有人在代码库中的任何地方为$SUCCESS设置了不同的值。使用$Funx::SUCCESS是一个更好的方法,它还提供了关于什么是成功的上下文。

our()使变量在所有作用域上可见,包括跨包。

代码语言:javascript
复制
package Funx;
our($SUCCESS, $NOFILE, $COPYFAIL, $APPRUNNING);
$SUCCESS         =   0;
$NOFILE      =   1;
$COPYFAIL        =   2;
$APPRUNNING      =   3;

package main;
say($SUCCESS, $Funx::SUCCESS); # both work
票数 2
EN

Stack Overflow用户

发布于 2018-11-22 15:52:29

下面是一个导出常量的模块的示例。

代码语言:javascript
复制
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标记,您可以导入所有单独的组:

代码语言:javascript
复制
use RPi::Const qw(:mcp23017_registers); # single grouping

...or

代码语言:javascript
复制
use RPi::Const qw(:all); # all groupings

然后可以使用任何导入的常量:

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53424299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档