小编Joe*_*ger的帖子

为什么Perl中的"import"子例程不是大写的

我好奇.大多数Perl隐式调用的子例程必须以全部大写字母命名.TIESCALAR,DESTROY等实际上perldoc perltoot

如果构造函数可以有任意名称,那么为什么不使用析构函数呢?因为虽然显式调用了构造函数,但析构函数不是.破坏通过Perl的垃圾收集(GC)系统自动发生,这是一个快速但有些懒惰的基于参考的GC系统.要知道要调用什么,Perl坚持将析构函数命名为DESTROY.Perl关于调用析构函数的正确时间的概念目前还没有明确定义,这就是为什么你的析构函数在被调用时不应该依赖它们的原因.

为什么DESTROY全部上限?Perl有时会使用纯大写的函数名作为约定来表示Perl会以某种方式自动调用该函数.隐式调用的其他函数包括BEGIN,END,AUTOLOAD,以及perltie中描述的绑定对象使用的所有方法.

那么为什么import子程序是小写的呢?有没有人对此有很好的了解?

perl naming-conventions implicit

6
推荐指数
2
解决办法
247
查看次数

超时时的Jquery.get行为?

我是网络编码的新手,最近一直在玩JQuery.我注意到了一些行为,并想知道它是否是正常行为以及处理它的最佳方法.

我正在做一个简单的访问我的Web服务器,有时服务器可能需要几分钟才能返回其结果.我注意到我的服务器端代码被多次调用,在这种情况下'/ userprofile'最多可以被调用3次.

("li#user").click(function(){
    $.get('/userprofile',{partialrender: 'true' },
        function (data) {
          $("div#content").html(data); 
    });
});
Run Code Online (Sandbox Code Playgroud)

所以我的问题是;

1)这是正常行为吗?2)如果是这样JQuery进行额外的调用或浏览器?3)有什么好方法可以解决这个问题?

我很欣赏问题3的答案可能很难,但是非常感谢任何帮助.

非常感谢.

更新:

多谢你们,

好吧所以我不能用那个确切的调用产生问题,因为后端数据库很小但我可以用另一个相同的调用.我在get之前发出了一个警报,只调用一次.我正在使用Mojolicious webframework,所以我想知道它是否可以与之相关?我正在使用Morbo Web服务器.

这是我的代码,表现出这种行为

("li#importDevice").click(function(){
    alert('import clicked');
    $.get('/importDevice',{device: 'corptest' },
       function (data) {
         $("div#content").html(data); 
   });
 })



sub importDevice {
  my $self = shift;
  my $res = "test";
  my $dir      = $self->session("dir");
  my ($debug, $log, $path, $upload) = createLogHandles($self);
  my %deviceEntry = device::getDeviceEntry($devicename);
  print "In Import   Device \n";
  return $self->redirect_to('failed') unless $self->session('role') eq 'admin';

  my %sessiondetails = utils::buildSessionDetails(%deviceEntry);

 #THE FUNCTION BELOW IS …
Run Code Online (Sandbox Code Playgroud)

perl jquery mojolicious

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

什么文本编辑器做最精确的语法突出显示Perl

我知道我冒险提出一个推测性的问题,但是,受到这个最近的问题的启发,我想知道哪个编辑器在语法高亮Perl方面做得最好.很清楚解析Perl的困难(不可能)我知道不会有一个完美的案例.我仍然怀疑在忠实代表中是否有明确的领导者.

NB我用gedit,它工作正常,但已知问题.

perl syntax-highlighting editor

5
推荐指数
1
解决办法
929
查看次数

更常用的是使用数据结构引用

我一直在阅读一些perl513*delta文件,我看到了Perl 5.14的一些新功能.从Perl 5.13.7开始,许多数组/散列函数也适用于数组/散列引用.虽然这可能主要被视为语法糖,或者Perl正在做你期望的事情,但我想,这会改变在Perl中声明数据结构的范式吗?众所周知,它破坏了与预告片Perl的兼容性,主要使用匿名结构的争论是什么?

例如:

#!/usr/bin/env perl

use strict;
use warnings;

use 5.13.7;

my $hashref = {
  english => 'hello',
  spanish => 'hola',
  french => 'bon jour'
};

foreach my $greeting (keys $hashref) {
  say $hashref->{$greeting}; #use say since we need a later version anyway
}
Run Code Online (Sandbox Code Playgroud)

而不是使用命名hash(%hash)的更传统的方式.

PS如果看到它是增强的我可以改为CW,但我很想听到一些观点.

perl reference

5
推荐指数
1
解决办法
136
查看次数

更新:何时"Peralize"Perl Inline :: C中的变量

我正在尝试将C库包装到Perl中.我已经修改XS但是没有成功我认为我应该简单地开始Inline::C.我的问题是关于致死.我一直在尽力阅读perlguts,但我仍然感到困惑.sv_2mortal如果我没有把它推到堆栈上,我是否需要调用要返回的SV*?

(PS我真的正在研究一种不太有功能的C知识,它伤害了我.我有一个知道C帮助我的朋友,但他不知道任何Perl).

我在下面提供一个样本.该函数FLIGetLibVersion只是将len库版本的字符放在char*上ver.我的问题是version_return我的C代码泄漏内存的形式?

注意,欢迎对此代码提出任何其他意见.

#!/usr/bin/perl

use strict;
use warnings;

use 5.10.1;

use Inline (
  C => 'DATA',
  LIBS => '-lm -lfli',
  FORCE_BUILD => 1,
);

say version_stack();
say version_return();

__DATA__
__C__

#include <stdio.h>

#include "libfli.h"

void version_stack() {

  Inline_Stack_Vars;
  Inline_Stack_Reset;

  size_t len = 50;
  char ver[len];

  FLIGetLibVersion(ver, len);

  Inline_Stack_Push(sv_2mortal(newSVpv(ver,strlen(ver))));
  Inline_Stack_Done;

}

SV* version_return() {

  size_t len = 50;
  char ver[len];

  FLIGetLibVersion(ver, len);
  SV* ret = newSVpv(ver, …
Run Code Online (Sandbox Code Playgroud)

c perl memory-leaks inline

5
推荐指数
1
解决办法
242
查看次数

了解newRV_inc vs newRV_noinc

在试图处理C级的参考时,我似乎无法弄清楚newRV_inc和之间的差异(在实践中)newRV_noinc.为此,我嘲笑了这个小Inline::C例子.

#!/usr/bin/env perl

use strict;
use warnings;

use Devel::Peek 'SvREFCNT';

my $arrayref_inc = make_arrayref_inc();
print "inc: ", SvREFCNT($arrayref_inc), "\n";

my $arrayref_noinc = make_arrayref_noinc();
print "noinc: ", SvREFCNT($arrayref_noinc), "\n";

use Inline C => <<'END_C';
SV* make_arrayref_inc () {
  AV * array = newAV();
  SV * arrayref = newRV_inc((SV *)array);

  return arrayref;
}

SV* make_arrayref_noinc () {
  AV * array = newAV();
  SV * arrayref = newRV_noinc((SV *)array);

  return arrayref;
}
END_C
Run Code Online (Sandbox Code Playgroud)

得到:

inc: 1
noinc: …
Run Code Online (Sandbox Code Playgroud)

perl perlguts

5
推荐指数
1
解决办法
490
查看次数

Devel :: Declare从脚本中删除行

我试图学习Devel::Declare,以尝试重新实现像PDL::NiceSlice没有源过滤器的东西.当我注意到它正在从我的脚本中删除下一行时,我正在某个地方.为了说明我已经做了这个最小的例子,其中一个人可以使用comment关键字从代码中删除整行,允许编译,即使该行上有大量的字.

#Comment.pm
package Comment;

use strict;
use warnings;

use Devel::Declare ();

sub import {
  my $class = shift;
  my $caller = caller;

  Devel::Declare->setup_for(
      $caller,
      { comment => { const => \&parser } }
  );
  no strict 'refs';
  *{$caller.'::comment'} = sub {};

}

sub parser {
  #my $linestr = Devel::Declare::get_linestr;
  #print $linestr;

  Devel::Declare::set_linestr("");
}

1
Run Code Online (Sandbox Code Playgroud)

#!/usr/bin/env perl
#test.pl

use strict;
use warnings;

use Comment;

comment stuff;

print "Print 1\n";
print "Print 2\n";
Run Code Online (Sandbox Code Playgroud)

只收益率

Print …
Run Code Online (Sandbox Code Playgroud)

perl declare

5
推荐指数
1
解决办法
79
查看次数

Perl Statistics :: R生成空白图(jpeg)

我目前正在使用ActiveState Perl 5.14和R项目版本2.13.2.在Perl中我使用Statistics :: R版本0.08.根据ActiveState的说法,最近的版本Statistics::R(通过0.24)未能通过审查,因此无法通过PPM获得.

历史:我已成功使用Perl访问R一段时间来执行分析.现在我想生成分析结果的JPEG图像,以便于可视化.

问题在于:我可以在R控制台中成功生成图像.但是,当我通过Perl运行相同的命令时,我只得到一个空白图像.我的控制台代码包括(当然简化):

  x<-c(1,2,3,4,5)
  y<-c(5,4,3,2,1)
  jpeg("C:/temp.jpg")
  plot(x,y)
  dev.off()
Run Code Online (Sandbox Code Playgroud)

我的Perl命令包括(也简化):

   $R = Statistics::R->new();
   $R->start_sharedR
   $R->send("x<-c(1,2,3,4,5)");
   $R->send("y<-c(5,4,3,2,1)");
   $R->send('jpeg("C:/temp.jpg")');
   $R->send("plot(x,y)");
   $R->send("dev.off()");
Run Code Online (Sandbox Code Playgroud)

有什么建议?我知道Perl还有其他可以使用的绘图选项.我已经删除了一些(GD Graph),因为X轴数据不被视为数字.如果可能的话,我宁愿把它保留在R中,因为我已经在那个包中进行分析了.谢谢!

perl r

5
推荐指数
1
解决办法
1085
查看次数

测试Mojolicious模板的覆盖率

在编写Galileo时,我在模板(.html.ep)中添加了一些逻辑,仅此而已。为此,我想知道是否可以将这些文件包括在测试覆盖率分析中。

我尝试过一些东西,最有前途的是

HARNESS_PERL_SWITCHES='-MDevel::Cover=+select,\.ep$' prove -l t && cover
Run Code Online (Sandbox Code Playgroud)

但是这些文件仍未包括在内。也许这不可能,但也许有人有一些想法。

perl code-coverage mojolicious

5
推荐指数
1
解决办法
252
查看次数

在Mojolicious中使用AnyEvent run_cmd,我不断收到此错误:"AnyEvent :: CondVar:递归阻塞等待尝试"

在一个Mojolicious应用程序中,我正在尝试在单击链接时将ODT文件转换为HTML.我使用shell命令"soffice"转换文件.转换文件需要一些时间.我向用户发送状态消息以通知他进度.我通过写入Mojo :: Log对象发送这些状态更新消息.然后,我在EventSource路由中订阅此日志对象.

然后我遍历文件并使用AnyEvent :: Util run_cmd来执行外部"soffice"程序.

for my $file (@{ $filelist }) {
   my $output_dir = './output_dir';
   my $cmd = "soffice --headless --convert-to html --outdir '$output_dir' '$file'";
   my $cv = AnyEvent->condvar;
   my $w;
   $w = run_cmd($cmd, 
                '>'  => sub { my $out = shift;
                              &WriteToLog({ status => "cmd output '$out'..." });
                              undef $w;
                              $cv->send;
                 },

                '2>' => sub { my $err = shift;
                              &WriteToLog({ status => "ERROR '$err'..." });
                              undef $w;
                              $cv->send;
                 }
            );

   $cv->recv;
}
Run Code Online (Sandbox Code Playgroud)

几乎从主要的AnyEvent教程中复制和粘贴.如果只有很少的文件要转换(大约2或3),那么一切顺利.通过EventSource连接发送的状态消息显示在客户端浏览器上.然后在转换完所有文件后,将呈现网页.

如果要处理更多文件,则会转换一些文件,然后会出现线程标题中的错误消息.

包含上述代码的路由的路由是: …

perl asynchronous mojolicious anyevent

5
推荐指数
1
解决办法
1912
查看次数