perlbrew是一个在您的系统上管理Perl的多个安装的工具,可以很容易地,比如快速运行一套针对许多不同版本的Perl的测试脚本.
PHP有什么类似的吗?现在,当我想更改我的系统使用的PHP版本时,我将进入构建目录以获取我想要的版本并运行make install.
在示例中:
#include <stdio.h>
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Run Code Online (Sandbox Code Playgroud)
我不太明白.putchar()会把角色放出来,但为什么在EOF之后它会把所有的角色都放出来,它在哪里记住所有这些角色?谢谢.
我有一个模块,将针对几种不同的操作系统和配置.有时,一些C代码可以使这个模块的任务更容易一些,所以我有一些C函数,我想绑定代码.我不具备绑定C函数-我不能保证最终用户甚至有一个C编译器,例如,它通常不是优雅地故障转移到完成同样的事情的纯Perl的方式有问题 - 但如果我可以从Perl脚本调用C函数,那就太好了.
还在我这儿?这是另一个棘手的部分.几乎所有的C代码都是特定于系统的 - 为Windows编写的函数不能在Linux上编译,反之亦然,而在Solaris上执行类似操作的函数看起来会完全不同.
#include <some/Windows/headerfile.h>
int foo_for_Windows_c(int a,double b)
{
do_windows_stuff();
return 42;
}
Run Code Online (Sandbox Code Playgroud)
#include <path/to/linux/headerfile.h>
int foo_for_linux_c(int a,double b)
{
do_linux_stuff(7);
return 42;
}
Run Code Online (Sandbox Code Playgroud)
此外,即使对于同一系统的本机代码,也可能只能在任何特定配置上编译其中一些.
#include <some/headerfile/that/might/not/even/exist.h>
int bar_for_solaris_c(int a,double b)
{
call_solaris_library_that_might_be_installed_here(11);
return 19;
}
Run Code Online (Sandbox Code Playgroud)
但理想情况下,我们仍然可以使用可以使用该配置进行编译的C函数.所以我的问题是:
如何有条件地编译C函数(只编译适合当前值的代码$^O)?
如何单独编译C函数(某些函数可能无法编译,但我们仍然想使用那些函数)?
我可以在构建时(最终用户安装模块时)或在运行时(Inline::C例如)进行此操作吗?哪种方式更好?
我如何判断哪些函数已成功编译并可从Perl中使用?
所有的想法赞赏!
更新:感谢所有回复的人.所以这就是我做的:
我考虑了一个与语句Inline::C内部
运行时绑定的方案eval,但最终确定了子类化Module::Build
和自定义ACTION_build方法:
my $builderclass = Module::Build->subclass(
class => 'My::Custom::Builder',
code => <<'__CUSTOM_BUILD_CODE__,',
sub ACTION_build {
use File::Copy;
my …Run Code Online (Sandbox Code Playgroud) 我想做同样的事情
open MYFILE, ">", "data.txt";
print MYFILE "Bob\n";
Run Code Online (Sandbox Code Playgroud)
而是在类变量中
sub _init_tmp_db
{
my ($self) = @_;
open $$self{tmp_db_fh}, ">", "data.txt";
print $$self{tmp_db_fh} "Bob\n";
}
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误:'字符串找到了运营商预期的附近"Bob \n"'
我该怎么办?
我正在解析一些数据并组织它,现在我需要在变量中捕获它.
在此之前我从未使用过printf或sprintf.
我以这样的方式使用printf来组织数据:
printf("%-30s %18s %18s\n", "$a", "$b", "$c\n");
Run Code Online (Sandbox Code Playgroud)
现在我有一个存储字符串的变量,我想将有组织的数据附加到变量$ result.
我试过类似的东西
$result.printf("%-30s %18s %18s\n", "$a", "$b", "$c\n");
Run Code Online (Sandbox Code Playgroud)
它不起作用.我也试过sprintf.
有任何想法吗?
谢谢,S
我尝试编写一个扩展方法来接收ulong并返回一个字符串,该字符串以十六进制格式表示提供的值,没有前导零.我对我提出的建议并不满意......使用标准.NET库是不是更好的方法呢?
public static string ToHexString(this ulong ouid)
{
string temp = BitConverter.ToString(BitConverter.GetBytes(ouid).Reverse().ToArray()).Replace("-", "");
while (temp.Substring(0, 1) == "0")
{
temp = temp.Substring(1);
}
return "0x" + temp;
}
Run Code Online (Sandbox Code Playgroud) 我的错误如下
当你在/usr/lib/perl5/site_perl/5.8.6/Parallel/ForkManager.pm第463行的子进程中时,无法启动另一个进程.
我的代码中有问题的部分如下,在我的代码下面是forkmanager失败的子例程,我无法弄清楚原因.没有forkmanager,我可以运行得很好.
my $pm = new Parallel::ForkManager($MAX_PROCESSES);
for (0..$SCOUNT)
{
my $pid = $pm->start and next;
my %shash = ();
%shash =
( ID => "$SREF->[$_]->[0]",
typeID => "$SREF->[$_]->[1]",
extIP => "$SREF->[$_]->[2]",
intIP => "$SREF->[$_]->[3]",
NAME => "$SREF->[$_]->[4]",
buTYPE => "NULL"
);
if ($shash{typeID} =~ /^(4|16|17|25|27|28|42|49|50|51|54|58|60|63|19)$/){$shash{buTYPE} = 'LINUX DEDICATED';}
if ($shash{typeID} =~ /^(11|14|22|32|34|36|37|46)$/) {$shash{buTYPE} = 'LINUX FULL';}
if ($shash{typeID} =~ /^(44)$/) {$shash{buTYPE} = 'EMAIL MARKETER';}
if ($shash{typeID} =~ /^(43)$/) {$shash{buTYPE} = 'TYip1';}
if ($shash{typeID} =~ /^(45)$/) {$shash{buTYPE} = 'DDDOMAINS';} …Run Code Online (Sandbox Code Playgroud) 我想运行一个代码,如果文件存在则继续检查文件是否退出,然后检查文件的MD5与之前的MD5.如果有一些变化,那么它会执行一些代码.但是每次我为同一个文件调用hexdigest时,perl MD%似乎都在变化.MD5每次都会改变吗?
我最初有
$md5 = Digest::MD5->new;
Run Code Online (Sandbox Code Playgroud)
之前 while(1)
如果不是这样做,还有什么可以实现我的意图吗?谢谢
while(1)
{
if(!(-e $config_file)){
next;
}else{
$md5 = Digest::MD5->new;
$md5->addpath($config_file);
print "<->";
print $md5->hexdigest;
$value=($digest eq $md5->hexdigest ? 1 : 0);
if($value==1)
{
next;
}else
{
$digest=$md5->hexdigest;
}
}
}
Run Code Online (Sandbox Code Playgroud) 从如何为Perl系统调用指定超时限制?
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ($@) {
die unless $@ eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}
Run Code Online (Sandbox Code Playgroud)
如果发生超时,应该sub { die "alarm\n" }; 导致进程结束.我想我无法理解die.这个http://www.cs.cf.ac.uk/Dave/PERL/node111.html说"die()函数用于退出脚本并显示一条消息供用户阅读".但是,对于上面的脚本,脚本将处理#timed out中的代码.sysread继续工作.我有一个睡眠时间为30秒的perl脚本,而不是sysread.我的超时设置为10秒.正如预期的那样,执行#timed out中的代码,但脚本继续睡眠.任何输入都被赞赏
use strict;
use warnings;
use Data::Dumper;
my %h;
my $undef = undef;
$h{''}='test2';
$h{$undef} = 'test';
print Dumper (\%h);
Run Code Online (Sandbox Code Playgroud)
创建以下输出:
$VAR1 = {
'' => 'test'
};
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我有Perl 5.12.3.
谢谢你的时间.