有多个cpan模块安装程序可用; 我至少知道CPAN.pm(自带perl,)CPANPLUS和cpanminus.
三者有什么区别?
什么情况要求使用一个而不是另一个?
我应该知道其他模块安装程序吗?
我有一个perl脚本,可以将ENV变量设置为指向特定输出,例如$ debug,$ verbose,$ develop等
通常我从命令行运行它们
$ VERBOSE=1 perl myperlscript.pl params
Run Code Online (Sandbox Code Playgroud)
我现在想用nohup来运行它们.使用命令行
$ nohup VERBOSE=1 perl myperlscript.pl params
Run Code Online (Sandbox Code Playgroud)
显然是不对的,因为设置ENV {VERBOSE}的尝试被解释为nohup的一个参数并且我获得了msg
nohup:无法运行命令`VERBOSE = 1':没有这样的文件或目录
这里的语法是什么?我试图在Linux机器上运行它.
我的测试代码是
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main() {
int c = fork();
if (c == 0) while(1);
c = fork();
if (c == 0) while(1);
c = fork();
if (c == 0) while(1);
c = fork();
if (c == 0) while(1);
while(1);
}
Run Code Online (Sandbox Code Playgroud)
所以我有一个父母和4个孩子.当我杀死父母时,孩子们正在使用init作为父母.但如果我(与SIGSTOP)停止其中一个孩子然后杀死父母,孩子们也会被杀死.为什么会这样?
我不知道如何在Perl中做一件事,我觉得我在做一些根本错误的事情.
我正在做一个更大的项目,所以我将任务分成不同的模块.我将模块放入项目目录的"modules /"子目录中,并将此目录添加到PERL5LIB和PERLLIB.
所有这些模块都使用一些配置,保存在主项目目录中的外部文件中 - "../configure.yaml",如果从模块文件的角度来看它.
但是,现在,当我通过"use"使用模块时,模块中的所有相对路径都是从使用这些模块的脚本的当前目录获取的,而不是从模块本身的目录中获取.即使我使用FindBin或其他任何东西.
如何从模块路径加载文件?这甚至可能/可取吗?
我正在尝试将时间戳(仅秒的小数部分)从纳秒(10 ^ -9秒的单位)重新缩放到NTP时间戳的下半部分(单位为2 ^ -32秒).实际上这意味着乘以4.2949673.但我需要在没有浮点数学的情况下完成它,并且不使用大于32位的整数(事实上,我实际上是为8位微控制器编写这个,所以即使32位数学也很昂贵,特别是划分).
我已经提出了一些工作得相当好的算法,但我没有真正的数值方法基础,所以我很欣赏任何有关如何改进它们的建议,或任何其他更准确的算法. /或更快.
uint32_t intts = (ns >> 16) * 281474 + (ns << 16) / 15259 + ns / 67078;
Run Code Online (Sandbox Code Playgroud)
选择前两个常数略微下冲,而不是超过正确的数字,并且根据经验确定最终因子67078以纠正此问题.产生+/- 4 NTP单位的正确值,结果为+/- 1 ns - 可接受,但残差随之变化ns
.我想我可以添加另一个术语.
uint32_t ns2 = (2 * ns) + 1;
uint32_t intts = (ns2 << 1)
+ (ns2 >> 3) + (ns2 >> 6) + (ns2 >> 8) + (ns2 >> 9) + (ns2 >> 10)
+ (ns2 >> 16) + (ns2 >> 18) + (ns2 …
Run Code Online (Sandbox Code Playgroud) 我正在编写一个想要订阅zeromq pubsub套接字的nginx模块,并根据收到的消息更新内存中的数据结构.为了节省带宽,有意义的是只有一个进程应该进行订阅,并且数据结构应该是shm,以便所有进程都可以使用它.对我而言,一个进程应该是主人似乎很自然(因为如果它是一个工人,代码必须以某种方式决定哪个工人).
但是当我ngx_get_connection
从我的init_master
或init_module
回调中打电话时,它会出现段错误,显然是由于ngx_cycle
尚未初始化.谷歌搜索在主进程中工作的插件似乎非常悲观.是否有更好的方法来实现我的目标,即每个服务器与pubsub套接字建立单个传出连接,无论它有多少工作者?
这是一个在工作者上下文中工作的代码示例,但不是来自master:
void *zmq_context = zmq_ctx_new();
void *control_socket = zmq_socket(zmq_context, ZMQ_SUB);
int control_fd;
size_t fdsize = sizeof(int);
ngx_connection_t *control_connection;
zmq_connect(control_socket, "tcp://somewhere:1234");
zmq_setsockopt(control_socket, ZMQ_SUBSCRIBE, "", 0);
zmq_getsockopt(control_socket, ZMQ_FD, &control_fd, &fdsize);
control_connection = ngx_get_connection(control_fd, cycle->log);
control_connection->read->handler = my_read_handler;
control_connection->read->log = cycle->log;
ngx_add_event(control_connection->read, NGX_READ_EVENT, 0);
Run Code Online (Sandbox Code Playgroud)
和其他地方
void my_read_handler (ngx_event_t *ev) {
int events;
size_t events_size = sizeof(events);
zmq_getsockopt(control_socket, ZMQ_EVENTS, &events, &events_size);
while (events & ZMQ_POLLIN) {
/* ...
read …
Run Code Online (Sandbox Code Playgroud) 我想使用UltraEdit正则表达式(perl)将以下文本替换为一堆html文件中的其他文本:
<style type="text/css">
#some-id{}
.some-class{}
//many other css styles follow
</style>
Run Code Online (Sandbox Code Playgroud)
我尝试使用<style type="text/css">.*</style>
但当然它不匹配任何东西,因为点匹配除换行之外的任何字符.我想匹配换行符,换行也许\r\n
或者\n
.
正则表达式应该如何?
非常感谢大家.
任何人都可以告诉我在哪里可以找到编码功能
encode("ram@yahoo.com")==> ram%40yahoo.com
和解码("ram%40yahoo.com")==> ram@yahoo.com
谢谢
我们最近切换到新的JSON2 perl模块.我认为现在所有的一切都被引用了.但我遇到了一些情况,其中一个数字(250
)作为由perl创建的json字符串中的未引用数字返回.
出于好奇: 有谁知道为什么会出现这种情况以及json模块如何决定是否引用一个值?
请考虑以下perl代码:
$schema->txn_begin();
my $r = $schema->resultset('test1')->find({id=>20});
my $n = $r->num;
$r->num($n+1);
print("updating for $$\n");
$r->update();
print("$$ val: ".$r->num."\n");
sleep(4);
$schema->txn_commit();
Run Code Online (Sandbox Code Playgroud)
我期望由于更新受到事务的保护,如果两个进程尝试更新"num"字段,则第二个应该失败并出现一些错误,因为它丢失了竞争.Interbase将此称为"死锁"错误.然而,MySQL会在update()调用上暂停,但在第一个调用commit之后会很乐意继续.然后第二个进程具有num的"old"值,导致增量不正确.注意:
$ perl trans.pl & sleep 1 ; perl trans.pl
[1] 5569
updating for 5569
5569 val: 1015
updating for 5571
5571 val: 1015
[1]+ Done perl trans.pl
Run Code Online (Sandbox Code Playgroud)
两种情况下的结果值都是"1015".这怎么可能是正确的?
有人能告诉我如何从perl访问sqlite3数据库.
代码
use DBI;
use DBD::SQLite;
my $dbh = DBI->connect(
"dbi:SQLite:dbname=/cbilldata/media/database/collector.db","",""
) or die "Cannot connect: $DBI::errstr";
Run Code Online (Sandbox Code Playgroud)
返回错误
DBI connect('dbname =/cbilldata/media/database/collector.db','',...)失败:数据库磁盘映像格式错误./db.pl第7行
无法连接:数据库磁盘映像格式错误. /db.pl第7行.
我负责将Perl脚本从Perl v5.6.1(2001)升级到v5.20.2(2015).我有这两个正则表达式变量:
foreach (@filelist) {
chomp;
my $File = $_;
if ( $File =~ qr/.+/o ) {
if ( $BaseLine ) {
$BaseLineRegExpA = qr/^\Q$BaseLine\E\\/io; #these 2 regexes
$BaseLineRegExpB = qr/^\Q$BaseLine\E;/io; #these 2 regexes
if ( $File =~ /$BaseLineRegExpA/ ) {
#...
} elsif ( (!($File =~ /$BaseLineRegExpB/)) && (!(lc( $File ) eq lc( $BaseLine ) )) ) {
$BaseLine = $File;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我有两个问题:
在老Perl版本中,$BaseLineRegExpA
并$BaseLineRegExpB
得到重新评估每一次$BaseLine
的变化,但在新的Perl,事实并非如此.如何进行更改?我试过了$BaseLineRegExpA
,它仍然没有改变.
在旧的Perl中,$BaseLineRegExpA
evals to:, …
我在寻求你对Perl的帮助.
我目前通过创建一个新对象然后使用它来运行一个函数来使我的代码运行良好,但我想使用更新的Perl编码方式(使用class:Std
和集成BUILD
/ START
函数)
所以现在我的代码看起来像这样,我调用new
一个日志文件的路径,然后运行一个函数:
# Called from another perl script
use MyClass;
my $Obj = MyClass->new('/usr/me/path.log');
$Obj->run();
# My module
package MyClass;
sub new {
shift if ( defined($_[0] eq 'MyClass') );
my %args = validate( @_,{ LogPath => { type => SCALAR, optional => 0 }, } );
my $self;
$self->{plistPath} = $_[1];
return bless $self;
}
sub run {
my $self = shift;
...
...
}
Run Code Online (Sandbox Code Playgroud)
而我想拥有的是这样的事情:
use Class::Std
sub BUILD …
Run Code Online (Sandbox Code Playgroud)