标签: perl-module

Perl编程和分发

我是Perl编程的新手.我刚刚读完了Llama的书.到目前为止,我已经用Bash编写了脚本,但我想尝试使用Perl,它比Bash脚本更有优势.

我正在创建一个使用许多标准模块(例如Getopt)的脚本和一些不那么标准的模块(例如PerlMagick)

在某些时候,我想分发我的Perl代码,我希望它可以被那些不了解Perl或编程的人使用.显然标准模块应该始终存在(我使用"使用5.010"在一定程度上保证这一点),但是哪些非标准模块?

我想有两种可能性:1)我应该告诉最终用户安装缺少的模块吗?2)我应该创建一个测试模块的安装脚本,如果它们不存在,那么安装它们吗?如果选择了选项2,我应该下载模块并安装它们吗?或者用我的主要代码分发它们?我只是不确定这些事情的礼节是什么......

非常感谢你的所有建议,本

perl perl-module

5
推荐指数
1
解决办法
1323
查看次数

Perl 5 - 迭代器

我在perl中实现了一个简单的迭代器.我通常使用C#,并且经常使用迭代器和函数式编程.所以我认为在perl中使用一些基础知识会很简单.

问题是,我的性能有些不好,我不希望比forforeach更快,但我认为有人可以给我一些关于如何加快速度的见解.

这是我的包裹的胆量:

package Iterator;
use strict;

#Constructor for Iterator type
sub new {
  my $type = $_[0];
  my $this = {};

  #set default values
  $this->{Array} = @_[1];
  $this->{Index} = 0;
 $this->{Sub} = sub { 
   my @array = @{$this->{Array}};
   return $#array >= $this->{Index} ? $array[$this->{Index}++] : undef;
  };

  #return self
  bless($this, $type);
  return $this;
}

#Iterates next
sub Next {
 return $_[0]->{Sub}->();
}
Run Code Online (Sandbox Code Playgroud)

允许您这样做:

my $iterator = Iterator->new(\@array);
while (defined(my $current = $iterator->Next())) {
  print $current, …
Run Code Online (Sandbox Code Playgroud)

perl iterator functional-programming perl-module

5
推荐指数
4
解决办法
2067
查看次数

在哪里安装gpsbabel所以它适用于GPS :: Babel perl模块?

我很难过,我必须问一个简单的问题,但是为了使用GPS :: Babel perl模块,应该在哪里安装gpsbabel?我似乎无法弄清楚适当的路径,并希望有其他工作的人可以提供帮助.在此先感谢您的帮助!

perl-module babel

5
推荐指数
1
解决办法
496
查看次数

Perl模块加载 - 防止:也许你忘了加载"Bla"?

当你运行时perl -e "Bla->new",你会得到这个众所周知的错误:

Can't locate object method "new" via package "Bla"
(perhaps you forgot to load "Bla"?)
Run Code Online (Sandbox Code Playgroud)

由于我的疏忽,前几天发生在Perl服务器进程中.有多个脚本,其中大多数都有适当的use语句.但是有一个脚本,在做Bla->newsub blub以线123,但缺少一个use Bla在顶部,当它被点击打没有任何使用其他脚本Bla已由服务器进程之前加载,然后砰!

单独测试脚本将是防止这一特定错误的明显方法,但唉,代码依赖于一个巨大的环境.你知道另一种防止这种疏忽的方法吗?

更新

这是一个例子PPI(尽管它的优点)在Perl的观点中有限:

use strict;
use HTTP::Request::Common;

my $req = GET 'http://www.example.com';
$req->headers->push_header( Bla => time );

my $au=Auweia->new;

__END__
PPI::Token::Symbol          '$req'
PPI::Token::Operator        '->'
PPI::Token::Word            'headers'
PPI::Token::Operator        '->'
PPI::Token::Word            'push_header'

PPI::Token::Symbol          '$au'
PPI::Token::Operator        '='
PPI::Token::Word            'Auweia'
PPI::Token::Operator        '->'
PPI::Token::Word            'new'
Run Code Online (Sandbox Code Playgroud)

设置标题并指定Auweia->new解析相同.所以我不确定你如何在这样一个摇摇欲坠的基础上建立起来.我认为问题在于它Auweia也可能是一个子程序; perl.exe …

perl qa perl-module

5
推荐指数
1
解决办法
2906
查看次数

使用Perl将CSV文件从特定行解析到文件末尾

我对Perl很新,需要你的帮助

我有一个xyz.csv包含内容的CSV文件:

这里的level1和er值是字符串名称......不是数字......

level1,er
level2,er2
level3,er3
level4,er4
Run Code Online (Sandbox Code Playgroud)

我使用下面的脚本解析此CSV文件,并在第一次运行时将字段传递给数组

open(my $d, '<', $file) or die "Could not open '$file' $!\n";
while (my $line = <$d>) {
  chomp $line; 
  my @data = split "," , $line; 
  @XYX = ( [ "$data[0]", "$data[1]" ], );
}
Run Code Online (Sandbox Code Playgroud)

对于第二次运行,我从命令提示符获取输入并存储在变量中$val.我的程序应该从存储在变量中的值解析CSV文件,直到它到达文件末尾

例如

我输入level2所以我需要一个脚本从第二行解析到CSV文件的末尾,忽略文件中的值level2,并将这些值(level2to level4)传递给@XYX = (["$data[1]","$data[1]"],);}

level2,er2
level3,er3
level4,er4
Run Code Online (Sandbox Code Playgroud)

我输入level3所以我需要一个脚本从第三行解析到CSV文件的末尾,忽略文件中之前的值level3,并将这些值(level3level4)传递给@XYX = (["$data[0]","$data[1]"],);}

level3,er3
level4,er4
Run Code Online (Sandbox Code Playgroud)

我如何实现这一目标?请提出宝贵的建议.我感谢您的帮助

csv perl perl-module

5
推荐指数
1
解决办法
2416
查看次数

使用 perlbrew 时安装模块

我正在尝试使用 perlbrew 来运行一组 perl 脚本。当我尝试安装这些 perl 脚本的依赖项时,它们被安装到我系统的 perl 版本 (5.18.X),而不是我想要使用的版本 (5.10.1)。我已经尝试了 stackoverflow 上其他线程的一些建议,但没有成功。

这是所发生情况的示例。我将执行以下操作:

perlbrew 使用 perl-5.10.1

perl -v (以 perl-5.10.1 返回)

cpanm Parallel::ForkManager(返回 Parallel::ForkManager 已安装)

当我在 perlbrew 下运行我的脚本时,我得到以下信息:

perl PERLSCRIPT.pl

无法在 @INC 中找到 Parallel/ForkManager.pm (@INC 包含:/home/qwerty/perl5/perlbrew/perls/perl-5.10.1/lib/5.10.1/x86_64-linux-thread-multi /home/ qwerty/perl5/perlbrew/perls/perl-5.10.1/lib/5.10.1 /home/qwerty/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1/x86_64-linux-thread-多 /home/qwerty/perl5/perlbrew/perls/perl-5.10.1/lib/site_perl/5.10.1

任何帮助表示赞赏。如果需要任何其他信息,请告诉我。

系统操作系统:Ubuntu 64位,通过VMware运行(主机是Windows 8.1 pro);

编辑:看来做事perlbrew exec cpanm perl::module有效。但是,如果有人有其他建议,我很乐意听到。

ubuntu perl perl-module perlbrew ubuntu-14.04

5
推荐指数
1
解决办法
1545
查看次数

Perl 使用变量来引用模块会混淆传递参数

我在使用变量引用模块时遇到问题,它似乎混淆了变量的传递:

多多.pm

package TOTO;

use Data::Dumper;

sub print {
       print Dumper(@_);
}
Run Code Online (Sandbox Code Playgroud)

Perl程序

package main;

TOTO::print('Hello World');
print ">>>>>>>>>>>\n";
my $package = 'TOTO';

$package->print('Hello World');
Run Code Online (Sandbox Code Playgroud)

输出是:

$VAR1 = 'Hello World';
>>>>>>>>>>>
$VAR1 = 'TOTO';
$VAR2 = 'Hello World';
Run Code Online (Sandbox Code Playgroud)

关于如何避免TOTO作为第一个变量传递的任何建议?

perl perl-module

5
推荐指数
1
解决办法
846
查看次数

cpanm 安装 Perl 模块的默认路径是什么?

在我使用cpanm在“新”(对我而言)系统上安装一些 Perl 模块之前,我想知道默认情况下它们将安装在哪里。

我没有看到任何类型的试运行选项,这正是我所希望的。

perl -V 包括这个 %ENV 和 @INC 信息:

%ENV:
  PERL5LIB="/home/randall/perl5/lib/perl5"
  PERL_HOMEDIR="1"
  PERL_LOCAL_LIB_ROOT="/home/randall/perl5"
  PERL_MB_OPT="--install_base /home/randall/perl5"
  PERL_MM_OPT="INSTALL_BASE=/home/randall/perl5"
@INC:
  /home/randall/perl5/lib/perl5
  /usr/local/lib64/perl5
  /usr/local/share/perl5
  /usr/lib64/perl5/vendor_perl
  /usr/share/perl5/vendor_perl
  /usr/lib64/perl5
  /usr/share/perl5
Run Code Online (Sandbox Code Playgroud)

这是否定义了行为,还是有其他考虑?具体来说,cpanm 的文档包括:

-l, --local-lib
    Sets the local::lib compatible path to install modules to. You don't
    need to set this if you already configure the shell environment
    variables using local::lib, but this can be used to override that as
    well.
Run Code Online (Sandbox Code Playgroud)

但它并没有指出哪些环境变量是重要的。

default perl-module cpanm

5
推荐指数
1
解决办法
5697
查看次数

无法在 CentOS 7.3 上使用 Yum 安装 CPAN

在尝试使用 Yum 命令 [CentOS 7.3(64 位)] 安装“CPAN”时,出现以下错误:

---> Package glibc.i686 0:2.17-157.el7 will be installed
--> Processing Dependency: glibc-common = 2.17-157.el7 for package: glibc-2.17-157.el7.i686
---> Package kernel-headers.x86_64 0:3.10.0-514.el7 will be installed
---> Package nss-softokn-freebl.i686 0:3.16.2.3-14.4.el7 will be installed
--> Finished Dependency Resolution
Error: Package: glibc-2.17-157.el7.i686 (cent-7_1-os)
           Requires: glibc-common = 2.17-157.el7
           Installed: glibc-common-2.17-157.el7_3.4.x86_64 (@updates_latest)
               glibc-common = 2.17-157.el7_3.4
           Available: glibc-common-2.17-157.el7.x86_64 (cent-7_1-os)
               glibc-common = 2.17-157.el7
Run Code Online (Sandbox Code Playgroud)

另一方面,在运行时:

 yum install glibc-2.17-157.el7.i686
Run Code Online (Sandbox Code Playgroud)

它显示因为我已经更新了包:

Package matching glibc-2.17-157.el7.x86_64 already installed. Checking for update
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?对于许多 Perl 模块会引发相同的错误并需要glibc-2.17-157.el7.i686

下面是一些抛出错误的模块的列表(尽管还有许多其他包抛出相同的错误): …

perl cpan perl-module yum centos7

5
推荐指数
1
解决办法
5257
查看次数

Tty.c:可加载库和 perl 二进制文件不匹配

我将 Ubuntu 从 zesty 升级到了仿生。在这个过程中,perl 从 5.24.1 升级到了 5.26.1。现在,当我尝试安装Expect.

Tty.c: loadable library and perl binaries are mismatched 
Run Code Online (Sandbox Code Playgroud)

我已经重新安装了 IO::Tty 并且说它已正确安装。还有其他模块报告了类似的错误。

这是失败Expect安装的完整输出。

Fetching http://www.cpan.org/authors/id/J/JA/JACOBY/Expect-1.35.tar.gz
-> OK
Unpacking Expect-1.35.tar.gz
Entering Expect-1.35
Checking configure dependencies from META.json
Checking if you have ExtUtils::MakeMaker 6.64 ... Yes (7.24)
Configuring Expect-1.35
Running Makefile.PL
Checking if your kit is complete...
Looks good
Generating a Unix-style Makefile
Writing Makefile for Expect
Writing MYMETA.yml and MYMETA.json
-> OK
Checking dependencies from MYMETA.json ...
Checking if …
Run Code Online (Sandbox Code Playgroud)

linux perl perl-module

5
推荐指数
1
解决办法
1528
查看次数