我正在做像这样的传递:
use strict;
use warnings;
sub repl {
local *line = \$_[0]; our $line;
$line = "new value";
}
sub doRepl {
my ($replFunc) = @_;
my $foo = "old value";
$replFunc->($foo);
print $foo; # prints "new value";
}
doRepl(\&repl);
Run Code Online (Sandbox Code Playgroud)
这样做有更清洁的方法吗?
原型不起作用,因为我正在使用函数引用(相信我有一个使用函数引用的充分理由).
我也不想在$_[0]任何地方使用repl它,因为它很难看.
parameters perl perl-module parameter-passing pass-by-reference
来自FMc的更新
我正在对这个问题给予赏金,因为我对同样的问题感到困惑.要重新解释这个问题,如何实现应用程序级选项(适用于整个程序的选项script.pl),而不是适用于单个命令的选项(search在本例中).
原来的问题
如何使用App :: Cmd创建这样的界面
script.pl --config <file> search --options args
Run Code Online (Sandbox Code Playgroud)
?
我可以:
./script.pl search --options args
./script.pl search args
./script.pl search --options
Run Code Online (Sandbox Code Playgroud)
我想要实现的是获取配置文件的选项,如下所示:
./script.pl --config file.conf search --options args
Run Code Online (Sandbox Code Playgroud)
我已经看过cpan 上的App :: Cmd :: Tutorial,但到目前为止我还没有运气好.
似乎CPAN上的一些(很多?)模块部分使用XS在C中实现,并且如果需要可以回退到纯perl实现.虽然这很聪明,但它显然会损害性能,我想知道它发生了所以我可以解决问题.
是否有停止或检测此类后备的一般方法?
有关此行为的示例,请查看(非常方便)Date :: Simple(代码段)
(我的第一篇文章是堆栈溢出,希望我使用正确的格式)
我需要评估在"安全"隔离区中操作64位整数的代码.由于我提供了要评估的脚本和代码,我可以做一个正常的评估,但我想通过使用"安全"来尝试通过无意识的错误使事情更加健壮.
我是否应该期望Math :: Int64在"安全"隔间内正常工作?我在Perl版本,整数位宽和操作系统的不同位数上得到了相互矛盾的结果.(见下文).
所有都在调试器内以相同的方式失败.
我确信我在某个地方做了一些不正确的假设,但无法弄清楚在哪里.
谢谢你提供的所有帮助.
use strict;
use warnings;
use Exporter;
use Safe;
use Math::Int64 qw(int64 hex_to_int64);
#use Math::Int64 ':native_if_available';
my $safe = new Safe 'Root';
$safe->permit( qw(:browse) );
$safe->share( qw/int64 hex_to_int64 my_sprintf/ );
my $X = 0xFF & (hex_to_int64("0xAA12345678") >> 4);
print my_sprintf("X ",$X);
my $Z = evalme('$X = 0xFF & (hex_to_int64("0xAA12345678") >> 4)', $safe);
print my_sprintf("Z ",$Z);
print evalme('my_sprintf("Xe", $X)',$safe);
exit;
sub my_sprintf {
my ($string, $value) = @_;
return sprintf( "Value of %s: …Run Code Online (Sandbox Code Playgroud) 我希望你已经准备好通过我的挫折进行长时间的冒险:
我在Mac OSX上使用Perl 5.10:Snow Leopard,使用XCode 3.2.6.
我想要做的是在程序中使用模块JSON :: XS.
这是我第一次用Perl做过一些事情,所以我查看一些简单的示例程序并试用它们,它们都可以工作.然后我去使用JSON :: XS.我明白了:
Can't locate JSON/XS.pm in @INC (@INC contains: /Library/Perl/Updates/5.10.0 /System/Library/Perl/5.10.0/darwin-thread-multi-2level /System/Library/Perl/5.10.0 /Library/Perl/5.10.0/darwin-thread-multi-2level /Library/Perl/5.10.0 /Network/Library/Perl/5.10.0/darwin-thread-multi-2level /Network/Library/Perl/5.10.0 /Network/Library/Perl /System/Library/Perl/Extras/5.10.0/darwin-thread-multi-2level /System/Library/Perl/Extras/5.10.0 .) at part1.pl line 5.
BEGIN failed--compilation aborted at part1.pl line 5.
Run Code Online (Sandbox Code Playgroud)
我做一些谷歌搜索,并认为它需要安装.同样在我的谷歌搜索中,我发现使用cpanm的重要建议.所以我首先尝试使用cpan(我已经拥有)安装cpanm.
我得到一个很长的打印输出,基本上说不,不行,"成功的机会有限",并且一遍又一遍地失败.它的全部内容太长了,但我觉得有趣的是:
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make test
Can't test without successful make
Running make install
Make had returned bad status, install seems impossible
Could not read '/Users/danielgierl/.cpan/build/ExtUtils-ParseXS-3.15-VSmBrZ/META.yml'. Falling back to …Run Code Online (Sandbox Code Playgroud) perl脚本包含脚本开头的所有模块名称.
例如:
use strict;
use XML::Parser;
use XML::Simple;
use DBI;
use DBD::DB2::Constants;
use POSIX qw( strftime );
use Storable qw(dclone);
use Data::Dumper;
use Carp;
Run Code Online (Sandbox Code Playgroud)
如何将所有模块名称保存在另一个文件中并将文件包含在主perl脚本中?
谢谢.
我可以使用以下代码从Nagios-Report Perl模块打印出Host UP Time百分比:
#!/usr/bin/perl
use strict ;
use Nagios::Report ;
my $x = Nagios::Report->new(q<local_cgi localhost nagiosadmin>)
or die "Can't construct Nagios::Report object." ;
$x->mkreport(
[ qw(HOST_NAME PERCENT_TOTAL_TIME_UP) ],
sub {
my %F = @_; my $u = $F{PERCENT_TOTAL_TIME_UP}; $u =~ s/%//;
},
0,
sub {
my $F = shift @_ ;
}
) ;
$x->debug_dump ;
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能打印出服务时间百分比?我的意思是只输出百分比值.
我尝试了很多选择,但无法做到正确.
我的Windows 7 64bit上的perl版本是5.16.2,我无法安装PAR:Packer.我尝试过活动的perl和草莓perl,两者都有同样的错误.你能给我一些建议吗?以下是我的经验:
我试过ppm install PAR:Packer,版本1.013,但是当我使用pp时,我得到了错误:
Perl lib version (5.16.2) doesn't match executable version (v5.16.0).
Run Code Online (Sandbox Code Playgroud)
我也试过cpan install PAR:Packer,版本1.014.但是我在安装过程中遇到了错误.弹出窗口显示:par.exe has stopped working.然后命令提示符出错:
C:\Perl64\bin\perl.exe -Mblib run_with_inc.pl par.exe -q -B -Oparldyn.exe
system(par.exe -I C:\Users\PAR-Packer-1.014\blib\arch -I C:\Users\PAR-Packer-1.014\blib\lib - IC:/Perl64/site/lib -IC:/Perl64/lib -I. -q -B -Oparldyn.exe) failed:
dmake.exe: Error code 255, while making 'parldyn.exe'
dmake.exe: Error code 255, while making 'subdirs'
Run Code Online (Sandbox Code Playgroud)
我已经广泛搜索了,但由于还没有找到解决方案,所以非常感谢任何帮助,非常感谢!
如果我有一个有方法的模块a,并b与要导出他们我做的:
use Exporter;
our @ISA = qw (Exporter);
our @EXPORT = qw (a b);
Run Code Online (Sandbox Code Playgroud)
我不明白的是这一行:
our @ISA = qw (Exporter);做什么?
我遇到了HTML::Laundry模块问题.以下代码段演示了使用use utf8与否时会发生什么.启用会use utf8导致错误:
Wide character in subroutine entry at /usr/local/share/perl/5.14.2/HTML/Laundry.pm line 329
Run Code Online (Sandbox Code Playgroud)
没有use utf8结果是正确的,但在我的程序的上下文中我需要utf8pragma.
use utf8;
use HTML::Laundry;
use strict;
my $snippet = "<p style=\"line-height: 18px; font-family: Verdana, Arial, Helvetica, sans-serif; color: rgb(153, 153, 153); margin: 0px; padding: 0px;\"><br>Sämtliche Produkte von collec entstehen in Zusammenarbeit mit Schweizer Werkstätten. collec setzt sich dafür ein, dass auch Menschen, die an geschützten Arbeitsplätzen tätig sind, hochwertige Produkte herstellen können. collec macht sich stark …Run Code Online (Sandbox Code Playgroud) perl ×10
perl-module ×10
command-line ×1
cpan ×1
install ×1
macos ×1
module ×1
monitoring ×1
nagios ×1
packer ×1
par ×1
parameters ×1
xs ×1