这是我遇到的Apache/Perl问题.
我在perl CGI应用程序中使用CPAN模块.它是Spreadsheet :: ParseExcel
我已经用tar.gz文件安装了cpan模块.
我已经安装了依赖项.
但是,我确实以非root用户身份执行了此操作.包含这些文件的库位于用户文件夹/ home/user/lib下
现在,我已在此框中成功配置了Apache2.html目录是/ var/www/html,cgi文件夹是/ var/www/html/cgi-bin.我已经验证它们有效,因为该文件夹中不需要特殊模块的所有脚本都可以在我的firefox浏览器中运行,即.你好世界,数据转储,简单形式.
但是,当我尝试运行使用"Spreadsheet :: ParseExcel"的脚本时,我得到的错误是在@INC中找不到该模块.但是,我在添加库的脚本开头有一个"use lib"语句.
脚本可以在PUTTY中运行而不会出现问题.只有从浏览器运行脚本时我才会遇到问题.
这个Web应用程序写在另一个盒子上,并在该盒子上正常工作.因为我当然在那里发展.我将Apache2放在我的个人Ubuntu机器上,并在这里安装了Web应用程序和模块,它可以在我的本地机器上运行.
我已经将"chmod -R a + rx"设置为用户库文件夹,所以我认为Apache可以访问该文件夹,除非父目录的设置阻止了它?我不必在/ home/user文件夹上运行它,或者更糟的是/ home文件夹,是吗?
有关这个问题的任何见解?
谢谢大家的时间!
我的OS-Distribution提供了rpm-package"perl-obexftp",它安装了Modul"OBEXFTP".这些是文件:
/usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/OBEXFTP.pm
/usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/auto/OBEXFTP
/usr /lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/auto/OBEXFTP/.packlist
/usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/auto/OBEXFTP/ OBEXFTP.bs
/usr/lib/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi/auto/OBEXFTP/OBEXFTP.so
/var/adm/perl-modules/obexftp
我现在正在使用我从源代码构建的Perl.有没有一种简单的方法可以使这个OBEXFTP模块可以访问我的Perlinstallation?
我正在尝试设置一个依赖于几个 Perl 模块的应用程序,但是我要安装到的服务器没有 Internet 连接。我通过 ppd 文件阅读了有关离线模块安装的信息,但是我必须一一解决所有依赖项..考虑到我没有直接的互联网连接,这更加乏味。
我希望找到一个解决方案,在我的 PC 上安装 ActivePerl 并安装我想要的所有库,然后将目录复制粘贴到我的服务器。如果只是修复一些环境变量的问题,那就没问题了。只想知道要修改的最终变量列表。不确定是否必须在要运行的计算机上安装 perl 库?(一个是 32 位平台,另一个是 64 位,但是服务器已经运行了各种 32 位应用程序,所以我希望这不是一个大问题)为了获得最佳兼容性,我计划在两个系统上都安装 ActivePerl 并合并库目录相同。
在perl中,我经常需要运行子进程,向它发送一些输入,然后读取它的输出.有许多模块可以执行此操作,但它们似乎都要求您传入预先存在的变量,然后由函数修改以包含文件句柄.以下是IPC :: Open3概要中的一个示例:
my ($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
'some cmd and args', 'optarg', ...);
Run Code Online (Sandbox Code Playgroud)
当我不得不一遍又一遍地做这种模式时,这种模式会变得有点烦人,特别是因为它涉及一堆我需要记住或查找的位置参数.是否有任何模块提供一个功能(让我们称之为myopen3),如下所示?
my ($wtr, $rdr, $err) = myopen3('some cmd and args', 'optarg', ...);
Run Code Online (Sandbox Code Playgroud)
或者它可以返回相关句柄的哈希或hashref:
my $process = myopen3('some cmd and args', 'optarg', ...);
$process->{STDIN}->print("Some input");
my $output = $process->{STDOUT}->readline;
Run Code Online (Sandbox Code Playgroud)
这样的功能的优点是,myopen3被称为以完全相同的方式内置的system(尽管不希望一些怪癖)避免,并且在返回散列或hashref,位置参数的情况下,和返回值.(另外,如果模块作者后来决定也返回pid和有关进程的其他信息,那么可以在保持向后兼容性的同时完成.)
我实际上自己实现了这个(使用简单的OO接口),但如果CPAN模块存在同样的事情,我宁愿不依赖我自己的自定义模块.
我到目前为止发现的最接近是IPC :: RunSession ::简单,它与返回的对象reader和writer方法.但是,该reader方法合并子进程的STDOUT和STDERR,而我希望选择将它们分开.
我想在我的Perl程序中启用/禁用使用模块Smart :: Comments的注释.我通过提供--verbose开关作为命令行选项列表的一部分,玩弄了这样做的想法.当设置此开关时,我正在考虑启用Smart :: Comment模块,如下所示:
#!/usr/bin/perl
use Getopt::Long;
use Smart::Comments;
my $verbose = 0;
GetOptions ('verbose' => \$verbose);
if (! $verbose) {
eval "no Smart::Comments";
}
### verbose state: $verbose
Run Code Online (Sandbox Code Playgroud)
然而,这对我不起作用.它似乎与Smart :: Comments本身的工作方式有关,所以我怀疑我试图用eval"no ..."位来禁用模块的方式.有人可以给我一些指导吗?
我已经下载了草莓PERL并在Winxp sp3上用CGI Perl Apache编写了一个应用程序.我使用的其中一个库(由其他人编写)使用XML :: LibXML.当我加载页面时,它给出了内部服务器错误.从Apache错误日志中我可以看到此错误:
无法为模块XML :: LibXML加载'C:/strawberry/perl/site/lib/auto/XML/LibXML/LibXML.dll':load_file:指定的模块无法可以在C:/strawberry/perl/lib/DynaLoader.pm第190行找到
.C:/strawberry/perl/site/lib/auto/XML/LibXML/LibXML.dll存在所有权限.此库也适用于Linux.如果我删除所有需要LibXML的代码,我的应用程序也可以正常工作.
任何人都可以告诉我何时可以在这里发布问题.
我正在尝试根据包含一系列IP地址的文件创建IP地址范围.我正在尝试创建的范围是那些不在文件中的范围.例如,如果我有以下IP地址:
129.32.0.1
27.45.2.2
129.32.0.2
65.18.2.4
Run Code Online (Sandbox Code Playgroud)
输出应该是 0.0.0.0-27.45.2.1,27.45.2.3-65.18.2.3,65.18.2.5-129.32.0.0,129.32.0.3-255.255.255.255
我目前所做的是从输入文件中提取IP并将它们存储到已排序的数组中(升序).
#!/usr/bin/perl -w
use strict;
use Sort::Key::IPv4 qw(ipv4sort);
my $list = 'C:\Desktop\IPs.txt';
my $ipRange;
my @ips;
my $i = 0;
# Get IP Addresses into array
open(FILE, $list);
while (<FILE>) {
chomp($_);
$ips[$i] = ($_);
++$i;
}
# Sort IP Addresses
my @sorted = ipv4sort @ips;
# Create IP Ranges
Run Code Online (Sandbox Code Playgroud)
我希望CPAN上有一些可以帮助我的东西.我已经看到模块可以确定IP地址是否在一个范围内,但还没有看到任何可以分割范围的模块.
在Windows中,安装了Perl模块C:/Perl64/site/lib/.Ubuntu系统中的相应位置是什么?
伙计们真的很困惑如何使用我刚安装在Perl中的模块.
我在Perl中安装了Corelist模块.我想显示Perl 5.006附带的所有模块.但是通过使用我不理解的代码有一个暗示:
my %modules = %{ $Module::CoreList::version{5.006} };
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
#! usr/bin/perl
use warnings;
use strict;
my %modules = %{$Module::CoreList::version{5.006}};
print %modules;
Run Code Online (Sandbox Code Playgroud)
它给出了这个错误:Module::CoreList::version used only once.我也尝试过
use Module::CoreList;仍然没有运气
我是一名 Perl 新手,正在开发一个相当长的模块,我想将其拆分为多个文件,以便于维护和组织。现在看起来像这样
#ABC.pm
package ABC;
use strict;
use warnings;
my $var1;
my $var2;
sub func1 {
#some operations on a $var
}
sub func2 {
#some operations on a $var
}
return 1;
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像
#ABC_Part_1.pm
package ABC;
use strict;
use warnings;
my $var1;
my $var2;
sub func1 {
#some operations on a $var
}
return 1;
Run Code Online (Sandbox Code Playgroud)
#ABC_Part_2.pm
package ABC;
use strict;
use warnings;
sub func2 {
#some operations on a $var
}
return 1;
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是让变量在单独的文件中可见。我尝试使用“我们的”来声明它们,但随后我必须使用我不想做的范围解析运算符。我想将它们视为模块文件中的局部变量,但将它们隐藏到调用脚本中。我还想在调用脚本中只包含一个,例如
#!/usr/bin/env perl
#script.pl
use …Run Code Online (Sandbox Code Playgroud) perl ×10
perl-module ×10
activeperl ×1
apache ×1
cgi ×1
cgi-bin ×1
coding-style ×1
filehandle ×1
installation ×1
ip-address ×1
module ×1
subprocess ×1
ubuntu ×1
xml-libxml ×1