我是Perl编程的新手.我刚刚读完了Llama的书.到目前为止,我已经用Bash编写了脚本,但我想尝试使用Perl,它比Bash脚本更有优势.
我正在创建一个使用许多标准模块(例如Getopt)的脚本和一些不那么标准的模块(例如PerlMagick)
在某些时候,我想分发我的Perl代码,我希望它可以被那些不了解Perl或编程的人使用.显然标准模块应该始终存在(我使用"使用5.010"在一定程度上保证这一点),但是哪些非标准模块?
我想有两种可能性:1)我应该告诉最终用户安装缺少的模块吗?2)我应该创建一个测试模块的安装脚本,如果它们不存在,那么安装它们吗?如果选择了选项2,我应该下载模块并安装它们吗?或者用我的主要代码分发它们?我只是不确定这些事情的礼节是什么......
非常感谢你的所有建议,本
我在perl中实现了一个简单的迭代器.我通常使用C#,并且经常使用迭代器和函数式编程.所以我认为在perl中使用一些基础知识会很简单.
问题是,我的性能有些不好,我不希望比for或foreach更快,但我认为有人可以给我一些关于如何加快速度的见解.
这是我的包裹的胆量:
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) 我很难过,我必须问一个简单的问题,但是为了使用GPS :: Babel perl模块,应该在哪里安装gpsbabel?我似乎无法弄清楚适当的路径,并希望有其他工作的人可以提供帮助.在此先感谢您的帮助!
当你运行时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->new中sub 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很新,需要你的帮助
我有一个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,并将这些值(level3和level4)传递给@XYX = (["$data[0]","$data[1]"],);}
level3,er3
level4,er4
Run Code Online (Sandbox Code Playgroud)
我如何实现这一目标?请提出宝贵的建议.我感谢您的帮助
我正在尝试使用 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有效。但是,如果有人有其他建议,我很乐意听到。
我在使用变量引用模块时遇到问题,它似乎混淆了变量的传递:
package TOTO;
use Data::Dumper;
sub print {
print Dumper(@_);
}
Run Code Online (Sandbox Code Playgroud)
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作为第一个变量传递的任何建议?
在我使用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 的文档包括:
Run Code Online (Sandbox Code Playgroud)-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.
但它并没有指出哪些环境变量是重要的。
在尝试使用 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。
下面是一些抛出错误的模块的列表(尽管还有许多其他包抛出相同的错误): …
我将 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)