小编Joe*_*ger的帖子

揭开Perl glob的神秘面纱(*)

这个问题中,海报询问如何在一行中执行以下操作:

sub my_sub {
    my $ref_array = shift;
    my @array = @$ref_array;
}
Run Code Online (Sandbox Code Playgroud)

凭借我对基本Perl魔法的了解,我可以通过简单地使用以下内容来避免:

sub my_sub {
    my $ref_array = shift;
    for (@$ref_array) {
      #do somthing with $_ here
    };

    #use $ref_array->[$element] here
}
Run Code Online (Sandbox Code Playgroud)

然而,在这个答案中,SO的当地僧侣之一提出:

sub my_sub {
  local *array = shift();
  #use @array here
}
Run Code Online (Sandbox Code Playgroud)

当我问

在尝试学习中级Perl魔法时,我可以问一下,你在这里设置什么是什么?您是否将@array的引用设置为已传入的arrayref?你怎么知道你创建@array而不是%array或$ array?我在哪里可以了解有关此*运算符的更多信息(perlop?).谢谢!

有人建议我把它作为一个新帖子,尽管他确实提供了很好的参考.无论如何,这里呢?有人可以解释什么被分配给什么以及如何创建@array而不是%array或$ array?谢谢.

perl glob

18
推荐指数
1
解决办法
7554
查看次数

Moose vs. MooseX ::宣告

片尾曲

MooseX :: Declare将不再被任何人推荐,因为它依赖于Devel :: Declare,它实现了它的目的,但它本身已经过时了.此时如果有人想要MX :: D,他们应该看看Moops

原版的

假设我已经对旧式Perl OO有了不错的认识,并且假设我要用某种形式的Moose编写一些新的代码(是的,我知道有一个性能损失),我想知道是否更深入了两个兔子洞我希望我选择了另一条道路吗?你能SO-和尚开导我的优劣Moose对比MooseX::Declare(或其他一些?).另外,如果我们选择切换,他们是如何互换的,一对一和另一个.

(ps我会很好地解决这个问题,但我认为一个结构良好的答案可能会避免主观性)

oop perl moose

17
推荐指数
1
解决办法
2461
查看次数

了解奇怪的Perl多行注释机制

编辑:注意新的Perl程序员:这个机制不应该用于多行注释!它有一个缺陷降低可读性.

PerlMonks关于在Perl中生成多行注释的机制的帖子中,Abigail提供了这个,让我困惑:

使用here文档的问题是它会在'-w'下发出警告.使用鲜为人知的<< >>运算符要好得多.

<<q=~q>>;
  This is a multiline comment.
q
Run Code Online (Sandbox Code Playgroud)

运行它-M0=Deparse给出:

"  This is a multiline comment.\n" =~ //;
-e syntax OK
Run Code Online (Sandbox Code Playgroud)

有人能告诉我发生了什么事吗?

perl comments operators

13
推荐指数
3
解决办法
1225
查看次数

只有一个孤独插入符号的角色类怎么办?

在尝试回答问题时,在找到特定字符时将文本写入新行,我使用了Regexp :: Grammars.它一直对我感兴趣,最后我有理由学习.我注意到作者的描述部分有一个LaTeX解析器(我是狂热的LaTeX用户,所以这让我很感兴趣)但是它有一个奇怪的构造在这里看到:

    <rule: Option>     [^][\$&%#_{}~^\s,]+

    <rule: Literal>    [^][\$&%#_{}~^\s]+
Run Code Online (Sandbox Code Playgroud)

什么的[^]字符类完成?

regex perl latex regexp-grammars

11
推荐指数
1
解决办法
393
查看次数

标量上下文中新的'each @array'的行为

Perl 5.14为我们提供了扩展each函数,它可以在数组和哈希上运行:

在列表上下文中调用时,返回一个2元素列表,其中包含散列的下一个元素的键和值,或者数组的下一个元素的索引和值,以便您可以迭代它.在标量上下文中调用时,仅返回散列中的键(不是值)或数组中的索引.

使用列表上下文的示例:

perl -E 'say $^V'

v5.14.0

perl -E '@a = (1..10); while (my ($i, $elem) = each @a) {say "\$a[$i] = $elem"}'

$a[0] = 1
$a[1] = 2
$a[2] = 3
$a[3] = 4
$a[4] = 5
$a[5] = 6
$a[6] = 7
$a[7] = 8
$a[8] = 9
$a[9] = 10
Run Code Online (Sandbox Code Playgroud)

但是在标量语境中,我什么都没得到:

perl -E '@a = (1..10); while (my $i = each @a) {say $i}'
Run Code Online (Sandbox Code Playgroud)

有人可以提供任何见解吗?我有一种感觉,当有人指出我的错误时,这将成为一个斩首,但也许不是.

编辑:实际上while循环与它无关:

perl -E '@a = (1..10); …
Run Code Online (Sandbox Code Playgroud)

arrays iteration perl new-operator

10
推荐指数
1
解决办法
190
查看次数

计算qr正则表达式中的捕获组?

我正在开发一个项目,它一次从ftp服务器获取文件列表.此时,它返回文件的arrayref,或者如果qr传递了可选的正则表达式引用(即),则使用grep过滤列表.此外,如果它qr有一个捕获组,它会将捕获的部分视为版本号,而是返回一个hashref,其中键是版本,值是文件名(如果没有捕获组,它将作为数组返回).代码看起来像(稍微简化)

sub filter_files {
  my ($files, $pattern) = @_;
  my @files = @$files;
  unless ($pattern) {
    return \@files;
  }

  @files = grep { $_ =~ $pattern } @files;
  carp "Could not find any matching files" unless @files;

  my %versions = 
    map { 
      if ($_ =~ $pattern and defined $1) { 
        ( $1 => $_ )
      } else {
        ()
      }
    } 
    @files;

  if (scalar keys %versions) {
    return \%versions;
  } else {
    return \@files;
  }
} …
Run Code Online (Sandbox Code Playgroud)

regex perl capture

10
推荐指数
1
解决办法
1350
查看次数

Mojolicious和延迟的WebSocket

我有这个代码片段,我试图每X秒将一个字符串推送到服务器,如:

#!/usr/bin/env perl
use Mojolicious::Lite;
use EV;
use AnyEvent;
use POSIX qw(strftime);

get '/' => sub {
    my $self = shift;

    $self->render('main');
};

websocket '/echo' => sub {
        my $self = shift;
        my $w;
        $w = AE::timer 3, 1, sub {
                    $self->send('Got it');
        };
      #  $self->send(strftime("Server $$: %a %b %e %H:%M:%S %Y", localtime));
};
app->start();

__DATA__
@@ main.html.ep
<html>
<head>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
</head>
<body>
<table id="tableID">
<tbody>
</tbody>
</table>
<script type="text/javascript">
var ws = new WebSocket('ws://192.168.1.104:3000/echo');
      ws.onopen = function () …
Run Code Online (Sandbox Code Playgroud)

perl html5 websocket mojolicious

9
推荐指数
1
解决办法
1221
查看次数

在线Perl POD渲染器

我似乎记得有一个"官方"网站(perl.org或cpan.org),它有一个POD预览器.一个人上传了一个文件,它将显示包含在PAN上的POD.有人有此链接吗?我似乎找不到它.

perl renderer pod preview

8
推荐指数
2
解决办法
1200
查看次数

存储具有PDL作为属性的Moose对象

我是Moose的新手并且做得很好,直到我用PDL作为财产.我希望能够将一个对象写入一个文件(我一直在使用use MooseX::Storage; with Storage('io' => 'StorableFile');,这个对象有PDL一个属性.PDL::IO::Storable提供了Storable以这种方式使用的必要方法,但是我不知道如何在驼鹿.

这是一个例子,它有点长,我知道,但它尽可能少,我可以做到:

#!/usr/bin/perl

package LinearPDL;
use Moose;

use PDL::Lite;
use PDL::IO::Storable;

use MooseX::Storage; 
with Storage('io' => 'StorableFile');

has 'length' => (is => 'ro', isa => 'Num', required => 1);
has 'divisions' => (is => 'ro', isa => 'Int', required => 1);
has 'linear_pdl' => (is => 'ro', isa => 'PDL', lazy => 1, builder => '_build_pdl');

sub _build_pdl {
  my $self = shift;

  my $pdl = $self->length() …
Run Code Online (Sandbox Code Playgroud)

perl moose storable pdl

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

抑制"BEGIN失败 - 编译中止"

我有一个模块需要在BEGIN块中进行一些检查.这可以防止用户在线下看到无用的消息(在编译阶段,在第二个BEGIN中看到).

问题是,如果我在BEGIN内部死亡,我抛出的信息就会被埋没 BEGIN failed--compilation aborted at.但是我更喜欢die,exit 1因为它可以被捕获.我应该使用exit 1或者有什么我可以做的来抑制这个额外的消息吗?

#!/usr/bin/env perl

use strict;
use warnings;

BEGIN {
  my $message = "Useful message, helping the user prevent Horrible Death";
  if ($ENV{AUTOMATED_TESTING}) {
    # prevent CPANtesters from filling my mailbox
    print $message;
    exit 0;
  } else {

    ## appends: BEGIN failed--compilation aborted at
    ## which obscures the useful message
    die $message;

    ## this mechanism means that the error is not trappable
    #print $message;
    #exit 1;

  } …
Run Code Online (Sandbox Code Playgroud)

perl

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