标签: perl-module

如何在不安装新Perl的情况下安装或升级最新Perl中的CPAN模块?

我想安装一个Perl模块(在本例中为FindBin),但由于它包含在Perl 5.10.1发行版中,所以cpan想为我安装Perl 5.10.有没有办法只安装模块cpan

我能看到的唯一选择是直接从源代码安装,这看起来有点粗糙,因为没有单独的软件包(例如Makefile.PL,等等),只是裸.pm文件.

由于这是一个只有一个文件的小模块,在这种情况下它是可行的,但如果我想安装一个更大的包呢?

编辑:这是从原来的问题有点一边,但说话的模块的一般问题被包装以Perl分布:我发现,"独立" FindBin(版本1.49)有一个语法错误,所以我取回1.50版本出来的Perl 5.10.1发行版...但是由于模块现在作为Perl 5.10的一部分在CPAN上列出,我无法找到描述此delta中更改/修复内容的CHANGES文件.我是否应该进入开发者存储库来提取这些信息是否合理?)


编辑2.好的,这是一个更好的例子.在Perl 5.8.8上我有1.04版本的Carp.但是,我看到Perl 5.10.1与1.11版打包在一起.有没有办法让CPAN为我安装最新版本的Carp而不会拖延所有的Perl 5.10.1?除了perl 5.10.1安装之外,我甚至找不到CPAN上Carp模块的链接.

perl installer cpan distribution perl-module

8
推荐指数
1
解决办法
2141
查看次数

Perl模块用法

我想在/ usr/local/lib/perl中创建自己的Perl模块

我有环境变量PERL5LIB设置:

$ env | grep PERL
PERL5LIB=/usr/local/lib/perl
Run Code Online (Sandbox Code Playgroud)

如果我创建一个模块:$ PERL5LIB/My/ModuleTest.pm

$ ./test.pl 
Can't locate object method "new" via package "My::ModuleTest" (perhaps you forgot to load "My::ModuleTest"?) at ./test.pl line 8.
Run Code Online (Sandbox Code Playgroud)

test.pl:

#!/usr/bin/perl

use strict;
use warnings;
use My::ModuleTest;

my $test = new My::ModuleTest;
print $test->check;
Run Code Online (Sandbox Code Playgroud)

ModuleTest.pm:

package ModuleTest;

use strict;
use warnings;

sub new {
        my $class = shift;
        my ($opts)= @_;
        my $self = {};
        $self->{test} = "Hello World";

        return bless $self, $class;
}
sub check {
        my …
Run Code Online (Sandbox Code Playgroud)

perl perl-module

8
推荐指数
1
解决办法
1701
查看次数

模块子程序中的包变量范围

如何更改模块使用的包中的变量值,以便该模块中的子例程可以使用它?

这是我的测试用例:

testmodule.pm:

package testmodule;

use strict;
use warnings;
require Exporter;

our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);

@ISA = qw(Exporter);
@EXPORT = qw(testsub);

my $greeting = "hello testmodule";
my $var2;

sub testsub {
    printf "__PACKAGE__: %s\n", __PACKAGE__;
    printf "\$main::greeting: %s\n", $main::greeting;
    printf "\$greeting: %s\n", $greeting;
    printf "\$testmodule::greeting: %s\n", $testmodule::greeting;
    printf "\$var2: %s\n", $var2;
} # End testsub
1;
Run Code Online (Sandbox Code Playgroud)

testscript.pl:

#!/usr/bin/perl -w
use strict;
use warnings;
use testmodule;

our $greeting = "hello main";
my $var2 = "my var2 in testscript";

$testmodule::greeting …
Run Code Online (Sandbox Code Playgroud)

perl perl-module

8
推荐指数
2
解决办法
2万
查看次数

Perl one liner提取多线图案

我在文件中有一个模式如下,它可以/不能跨越多行:

 abcd25
 ef_gh
 ( fg*_h
 hj_b*
 hj ) {
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

perl -nle'打印时m/^\s*(\ w +)\ s +(\ w +?)\ s*(([\ w-0-9,*\s] ))\ s {/ gm'

我不知道这里的标志是什么意思,但我所做的只是regex为模式写一个并将其插入模式空间.如果模式在一行中,则匹配良好:

abcd25 ef_gh ( fg*_h hj_b* hj ) {
Run Code Online (Sandbox Code Playgroud)

但仅在多线情况下失败!

我昨天开始使用perl,但语法太混乱了.因此,正如我们的SO伙伴之一所建议的那样,我写了一个regex并将其插入到他提供的代码中.

我希望perl在这种情况下,和尚可以帮助我.欢迎替代解决方案.

输入文件 :

 abcd25
 ef_gh
 ( fg*_h
 hj_b*
 hj ) {

 abcd25
 ef_gh
 fg*_h
 hj_b*
 hj ) {

 jhijdsiokdù ()lmolmlxjk;
 abcd25 ef_gh ( fg*_h hj_b* hj ) {
Run Code Online (Sandbox Code Playgroud)

预期产量:

 abcd25
 ef_gh
 ( fg*_h
 hj_b*
 hj ) {
 abcd25 ef_gh …
Run Code Online (Sandbox Code Playgroud)

bash perl awk sed perl-module

8
推荐指数
2
解决办法
9880
查看次数

使用和要求之间的差异(我列出了差异,需要知道还有什么)

我甚至从perldoc和读到了解释StackOverflow.但有一点混乱.

  1. use通常在编译时加载模块,而require在运行时加载模块
  2. use只调用内置的导入功能,而require需要单独调用导入模块

    BEGIN {
        require ModuleName;
        ModuleName->import;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. require 如果我们想偶尔加载更大的模块,则使用

  4. use在早期状态抛出异常,而require在遇到问题时抛出异常
  5. 随着use我们可以有选择地加载的程序不是所有的,但很少像

    use Module qw(foo bar) # it will load foo and bar only
    
    Run Code Online (Sandbox Code Playgroud)

它也可能require吗?

Beisdes是有之间的另一个差异userequire

很多关于谷歌的讨论,但我只理解上述这些要点.
请帮我其他点.

perl perl-module

8
推荐指数
2
解决办法
2万
查看次数

如果未加载@ISA中的包,则会多次发出相同的警告

在重构我的一些perl代码时,我注意到以下的strang行为.
考虑这个小样本脚本:

#!/usr/bin/perl -w

package test;
use strict;
my $obj = bless( {}, __PACKAGE__);
our @ISA = qw( missing );

exit(0)
Run Code Online (Sandbox Code Playgroud)

预期的警告

Can't locate package missing for @test::ISA at test.pl line 8
Run Code Online (Sandbox Code Playgroud)

出现三次而不是一次.此警告的另外两个触发器是什么?这三个都是指exit(0).
gentoo linux上的perl-version 5.12.4.

谢谢.

perl perl-module

8
推荐指数
1
解决办法
146
查看次数

未定义的子程序调用

我试图在Perl中使用简单的模块:

火焰/ Text.pm:

package Flame::Text;
sub words { … }
1;
Run Code Online (Sandbox Code Playgroud)

火焰/ Query.pm:

package Flame::Query;
use Flame::Text qw(words);
sub parse_query { words(shift); }
parse_query 'hi';
1;
Run Code Online (Sandbox Code Playgroud)

为什么我收到以下错误消息?

&Flame::Query::words在Flame/Query.pm第3行调用的未定义子例程.

以下工作正常:

package Flame::Query;
use Flame::Text;
sub parse_query { Flame::Text::words(shift); }
parse_query 'hi';
1;
Run Code Online (Sandbox Code Playgroud)

perl perl-module

8
推荐指数
2
解决办法
2万
查看次数

如何从Perl XS模块调用不同C源文件中的函数?

我正在用Perl构建一个XS扩展.我有两个文件:

  1. AC头文件(.h)
  2. AC源文件(.c)

目前我所做的是将所有C文件代码Model=放在XS文件之前并在之后包装我想要的函数Model=.

compliation没有问题,我可以从perl调用特定的函数.

但我想将.xs文件与C文件分开.

我希望.xs文件只包含wrap函数,这些函数将调用.c文件上的函数,但是当我这样做并运行dmake命令时,我得到错误代码129未定义引用'parse.c'文件.

我尝试使用C和OBJECT属性包含.c文件用于WriteMakerFile并仍然得到一个错误,任何想法如何将xs文件拆分为2个一个c文件和其他包含c函数的xs,它们是.c文件的一部分使用ExtUtils :: MakeMaker.

例子将不胜感激.

perl perl-module perl-xs

8
推荐指数
1
解决办法
616
查看次数

从Perl模块导出所有常量(只读变量)的最有效方法是什么

我正在寻找从我的单独模块中导出所有常量的最有效和可读的方法,该模块仅用于存储常量.
例如

use strict;
use warnings;

use Readonly;

Readonly our $MY_CONSTANT1         => 'constant1';
Readonly our $MY_CONSTANT2    => 'constant2'; 
....
Readonly our $MY_CONSTANT20    => 'constant20';
Run Code Online (Sandbox Code Playgroud)

所以我有很多变量,并将它们全部列在我们的内部@EXPORT = qw( MY_CONSTANT1.... );
它会很痛苦.是否有任何优雅的方式导出所有常量,在我的情况下,Readonly变量(强制导出所有,不使用@EXPORT_OK).

perl constants perl-module perl-exporter

8
推荐指数
2
解决办法
566
查看次数

在Test :: More中,是否有可能在末尾测试exit()的子程序?

我有一个模块,我用一些实用函数编写.

其中一个函数只是一个用法语句(由用户@zdim推荐)

use 5.008_008;
use strict;
use warnings;

# Function Name:        'usage'
# Function Inputs:      'none'
# Function Returns:     'none'
# Function Description: 'Prints usage on STDERR, for when invalid options are passed'
sub usage ## no critic qw(RequireArgUnpacking)
{
    require File::Basename;
    my $PROG = File::Basename::basename($0);
    for (@_)
    {
        print {*STDERR} $_;
    }
    print {*STDERR} "Try $PROG --help for more information.\n";
    exit 1;
}
Run Code Online (Sandbox Code Playgroud)

我知道子程序按预期工作,并且它很容易测试,但是...对于覆盖率报告,我想将它包含在我的单元测试中.有没有办法测试它Test::More

perl unit-testing perl-module

8
推荐指数
2
解决办法
173
查看次数