小编Art*_*rtM的帖子

为什么Perl 5.14使用(0 + GvGP(gv) - > gp_cv)定义GvGC?

我正在做一些与mod_perl-Apache-Perl兼容性相关的研究.最近我尝试使用Perl 5.14.2构建mod_perl 2.0.4.编译阶段提前终止并出现错误:

modperl_perl.c: In function ‘modperl_perl_core_global_init’:
modperl_perl.c:58:9: error: lvalue required as left operand of assignment
Run Code Online (Sandbox Code Playgroud)

在这个地方写下面的代码:

    GvCV(gv) = get_cv(cglobals->sub_name, TRUE);
Run Code Online (Sandbox Code Playgroud)

搜索可能产生此错误的内容,我发现以前版本的Perl和Perl 5.14(CORE/gv.h)之间存在差异:

    #define GvCV(gv) (GvGP(gv)->gp_cv)   /* previous versions */
Run Code Online (Sandbox Code Playgroud)

VS

    #define GvCV(gv) (0+GvGP(gv)->gp_cv)  /* in Perl 5.14 */
Run Code Online (Sandbox Code Playgroud)

0+从定义中删除它允许mod_perl 2.0.4成功编译,这很好,因为与以前的版本相比,0+...它不被识别为左值.

为什么0+在GvCV的定义中使用并且是否有必要?或者删除它是否安全,并且GvCV(gv)在以前的Perl版本中有类似的定义?

c perl mod-perl

12
推荐指数
1
解决办法
513
查看次数

为什么"package"关键字有时会被包名称中的注释分开?

分析CPAN模块的来源我可以看到这样的事情:

...
package # hide from PAUSE
   Try::Tiny::ScopeGuard;
...
Run Code Online (Sandbox Code Playgroud)

显然,它取自Try::Tiny,但我也看到了其他模块中关键字和包标识符之间的这种评论package.

为什么使用此程序?它的目标是什么,它有什么好处?

perl

12
推荐指数
1
解决办法
462
查看次数

如何检查Perl中是否存在Internet连接?

我有一个简单的脚本,定期验证(每隔几秒一次)是否有来自该服务器的互联网连接.要明确的是,它不是要检查外部站点/服务/服务器是否还活着.作为可靠的互联网目的地,我使用谷歌,雅虎等网站的IP.通常我使用3个目的地(局域网,ISP网络,外部ISP)

我目前负责的代码只是一个简单而肮脏的调用ping:

    my $pingResponse = `ping -c 1 -w 1 123.123.123.123`;
    my $isConnected = parsePingResponse($pingResponse);
Run Code Online (Sandbox Code Playgroud)

它似乎有效,但我确信它不是完成此任务的正确/最佳方式.至少有3个缺点:外部系统调用,它很慢,它有一个相对较长的最后期限为1秒.

所以,我的问题是:如何简单有效地实现ping功能的perlish方式,以验证互联网连接是否还活着?

(我认为LWP是一种矫枉过正.如果一个站点或一个页面可用,这是不重要的,只要一些外部IP可以访问.可能它应该是一个简单的涉及低级网络)

connection perl networking

7
推荐指数
1
解决办法
3774
查看次数

为什么非线程Perl不使用off64_t类型与启用线程的类型相比?

我的初始任务是安装mod_perl 2.0.6 + Apache 2.2.22.
该过程因off64_t编译mod_perl时出现许多错误而停止.所以,我开始深入挖掘.首先,我安装了两个新的Perl 5.8.9实例(因为我必须使用这个版本):一个线程版本和一个非线程版本(它们是相同的,只是usethreads不同).尝试使用线程Perl重现相同,但成功完成并且没有任何off64_t错误.
结论很明显:线程Perl提供必要的off64_t,非线程的不提供.
进一步搜索,我比较config.h(从core/<arch>/CORE两个Perl'es的),和在该行3671我可以看到这个(在非螺纹的Perl):

    /* HAS_OFF64_T:
     *      This symbol will be defined if the C compiler supports off64_t.
     */
    /*#define       HAS_OFF64_T             / **/
Run Code Online (Sandbox Code Playgroud)

并在启用线程的Perl中:

    #define HAS_OFF64_T            /**/
Run Code Online (Sandbox Code Playgroud)

perl -V两个Perl实例报告ccflags ='... -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 ...'都是使用的编译器标志.

据我所知,off64_t用于大文件,与线程无关.我找到了关于off_t和的信息off64_t:

如果使用_FILE_OFFSET_BITS = 64此类型编译源(即off_t)透明地替换为off64_t.

简而言之:有两个相同的Perl版本,只有一个区别:usethreadsconfigure参数.Threaded Perl启用off64_t,非线程Perl启用.

我的问题是:为什么会发生这种情况以及线程如何连接到 …

perl multithreading compilation large-files

6
推荐指数
1
解决办法
366
查看次数

Perl技术分离一部分代码以独立运行是什么?

我并没有参与接近操作系统的编程技术,但据我所知,当在Perl中并行执行某些操作时,选择的武器fork可能是一些基于它的有用模块.文档页面fork说:

Does a fork(2) system call to create a new process running the same program at the same point.
Run Code Online (Sandbox Code Playgroud)

因此,拥有一个耗费大量内存并且需要fork执行小任务的大型应用程序意味着将有2个大型perl进程,而第二个将浪费资源只是为了做一些简单的工作.

因此,问题是:如何使fork代码的独立部分独立运行并消耗它所需的资源,该怎么做(或如何使用,如果它是唯一的方法)?

只是一个非常简单的例子:

    use strict;
    use warnings;

    my @big_array = ( 1 .. 2000000 );  # at least 80 MB memory
    sleep 10;  # to have time to inspect easely the memory usage

    fork();
    sleep 10;  # to have time to inspect easely the memory usage
Run Code Online (Sandbox Code Playgroud)

并且子进程也消耗80+ MB.

要明确:与这个分离的代码进行交流或以某种方式使用其结果并不重要,只是为了可以说" …

perl fork process

6
推荐指数
1
解决办法
1432
查看次数