我已经为可重用代码使用了Perl包(Funx.pm)。但我希望它包含一堆标量作为返回值,即
my $SUCCESS = 0;
my $NOFILE = 1;
my $COPYFAIL = 2;
my $APPRUNNING = 3;
...and on and on....是否有办法做到这一点,并且能够只使用变量而不必导入每个变量,也不必使用Funx::何时使用这些变量?
谢谢
发布于 2018-11-22 06:29:29
在开头说这是个坏主意,想象一下如果有人在代码库中的任何地方为$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发布于 2018-11-22 15:52:29
下面是一个导出常量的模块的示例。
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...or
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);
}https://stackoverflow.com/questions/53424299
复制相似问题