小编Rob*_*t P的帖子

如何使用Perl检查标量中是否包含已编译的正则表达式?

假设我有一个子程序/方法,用户可以调用它来测试一些数据(例如)可能如下所示:

sub test_output {
    my ($self, $test) = @_;
    my $output = $self->long_process_to_get_data();
    if ($output =~ /\Q$test/) {
        $self->assert_something();
    }
    else {
        $self->do_something_else();
    }
}
Run Code Online (Sandbox Code Playgroud)

通常,$test是一个字符串,我们在输出中的任何地方寻找.这是一个界面,使调用非常容易.然而,我们发现有时候,直线串是有问题的 - 例如,一个大的,可能不同数量的空间......一个模式,如果你愿意的话.因此,我想让他们作为一个选项传递正则表达式.我可以这样做:

$output =~ $test
Run Code Online (Sandbox Code Playgroud)

如果我可以假设它总是一个正则表达式,但啊,但向后兼容!如果它们传入一个字符串,它仍然需要像原始字符串一样测试它.

那么在这种情况下,我需要测试一下是否$test是一个正则表达式.是否有任何良好的工具来检测标量是否有编译的正则表达式?

regex perl

4
推荐指数
2
解决办法
587
查看次数

如何创建为用户导入许多模块的模块?

我有一个相当复杂的数据结构,我已经在Perl中实现了.这已被分解为大约20个班级.基本上,只要您想使用其中一个类,就需要使用所有这些类.

现在,如果有人想要使用这种数据结构,他们需要做类似的事情:

use Component::Root;
use Component::Foo;
use Component::Bar;
use Component::Baz;
use Component::Flib;
use Component::Zen;
use Component::Zen::Foo;
use Component::Zen::Bar;
use Component::Zen::Baz;
... # 15 more of these...
use Component::Last;
Run Code Online (Sandbox Code Playgroud)

能够操纵它的所有部分.如何编写一个为用户执行此操作的模块,因此他们所要做的就是

use Component;
Run Code Online (Sandbox Code Playgroud)

导入所有其他模块?

在这种特殊情况下,模块都是类,没有导出.

perl module

4
推荐指数
1
解决办法
231
查看次数

如何在Perl中保留哈希的顺序?

我有一个.sql文件,我正在从中读取输入。假设文件包含以下输入。

Message Fruits Fruit="Apple",Color="Red",Taste="Sweet";

Message Flowers Flower="Rose",Color="Red";
Run Code Online (Sandbox Code Playgroud)

现在,我已经编写了一个perl脚本来从该文件生成哈希。

use strict;
use Data::Dumper;

if(open(MYFILE,"file.sql")){
    my @stack;
    my %hash;
    push @stack,\%hash;
    my @file = <MYFILE>;
    foreach my $row(@file){
        if($row =~ /Message /){
            my %my_hash;
            my @words = split(" ",$row);
            my @sep_words = split(",",$words[2]);

            foreach my $x(@sep_words){
                my($key,$value) = split("=",$x);
                $my_hash{$key} = $value;
            }
            push @stack,$stack[$#stack]->{$words[1]} = {%my_hash};
            pop @stack;
        }
    }
    print Dumper(\%hash);
}
Run Code Online (Sandbox Code Playgroud)

我得到以下输出。

$VAR1 = {
          'Flowers' => {
                         'Flower' => '"Rose"',
                         'Color' => '"Red";'
                       },
          'Fruits' => {
                        'Taste' …
Run Code Online (Sandbox Code Playgroud)

perl hash

4
推荐指数
1
解决办法
4443
查看次数

如何在Boo中添加语言关键字,让'when'表现为'if'

我似乎无法弄清楚如何将'when'关键字添加到BOO,它应该表现为'if'.我想我可以制作一个方法,但是我不能像我一样用它来移动.任何指针将不胜感激.

-标记

boo

3
推荐指数
1
解决办法
439
查看次数

Perl中的这个陈述有什么问题?

print "$_", join(',',sort keys %$h),"\n";
Run Code Online (Sandbox Code Playgroud)

它给我一个错误如下:

Use of uninitialized value in string at missing_months.pl line 36.
1,10,11,12
Run Code Online (Sandbox Code Playgroud)

这个print语句出现在for循环中,如下所示:

foreach my $num ( sort keys %hash )
{
        my $h = $hash{$num};
        print "$_", join(',',sort keys %$h),"\n";
}
Run Code Online (Sandbox Code Playgroud)

unix perl

3
推荐指数
1
解决办法
192
查看次数

如何将自定义模块分发添加到本地CPAN镜像?

我正准备设置一个完整的CPAN镜像供我公司内部使用.但是,我们有几个Module::Build基于内部的发行版,我想通过这个镜像向人们提供这些发行版.这些发行版只能从我们的镜子中获得; 它们只是内部库.基本上,一旦人们设置了他们的CPAN配置文件来加载"cpan.mycompany.com"镜像,我希望他们能够做到

cpan install MyCompany::Bundle
cpan install MyCompany::Other::Module
Run Code Online (Sandbox Code Playgroud)

在他们的命令行上安装任意数量的内部自定义模块分发.理想情况下,随着这些模块分发版本的增加,所有这些版本都将由我们的内部CPAN镜像索引并可用,就像之前版本的CPAN模块可用一样.

在最初的问题之后,我能够提出一些其他的可能性.

CPAN :: Inject,但看起来我不能用它来获取 cpan install My::Module语法.

然后是MyCPAN :: App :: DPAN,它看起来也很有趣,几乎看起来像我需要的东西.有没有人有这个工具的经验?

我刚遇到的另一个是CPAN :: Site.这似乎也能够设置自定义CPAN分发.有关这个工具的任何想法?

perl cpan dpan

3
推荐指数
1
解决办法
451
查看次数

How-To Perl递归正则表达式

我有一个我需要测试的设备的输出,主要是响应是一行,但有时它是两行.我用简单的正则表达式处理一行或两行来处理

if ($prompt =~ /(\s.*?)\r\n(.*)/)
{
   Note('Multiline '.$string);
   TestPrompt($string, $1);
   TestPrompt($string, $2);
}
else
{
   TestPrompt($string, $prompt);
}
Run Code Online (Sandbox Code Playgroud)

但是,如果响应超过两行呢?这段代码无法处理额外的行,我想在我的设计中保持健壮.有没有办法从正则表达式中捕获foreach

regex testing perl prompt functional-testing

3
推荐指数
1
解决办法
231
查看次数

为什么我的数组切片上的grep导致Perl中的堆栈溢出?

前几天,需要一次迭代一个数组的子集.最初,我用拼接做了这个 - 撕裂阵列在这种情况下没问题.它将一次返回N个元素,或者在列表末尾留下的任何元素.一切顺利.

然后事实证明我以后需要这个数组.我转而使用数组切片,而不是拼接.繁荣!程序爆炸,到处发送堆栈溢出.什么?为什么?怎么样?我玩弄它,发现了一些可行的变体.这是演示此问题的测试脚本:

use strict;
use warnings;

my @array = qw(a b c d e f g h i j k l m n o p q r s t u v z x c v b a s d f g a s d f a se g);
my $numPerTest = 5;

my $index = 0;
print "Separating out the subset before grepping it, good.\n";
while ($index < @array)
{
   print "Iteration $index\n";
   my @subset =  @array[$index..($index+$numPerTest)];
   @subset …
Run Code Online (Sandbox Code Playgroud)

arrays perl

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

在Perl中,您如何动态选择要用作回调的方法?

在Perl中,如果其包已知,则指定回调或代码引用是非常简单的:

package Foo;

sub foo { print "in foo" }

# and then
package main;

sub baz {
    my $code = shift;
    $code->();
}

baz( \&Foo::foo );
Run Code Online (Sandbox Code Playgroud)

这打印in foo.

让我们说你有一个对象,如此琐碎,像这样:

package Foo;

sub new { bless {}, shift }
sub bar { print "in bar" }
sub baz { print "in baz" }
Run Code Online (Sandbox Code Playgroud)

你可以使用上面的方法查找方法(\&Package:Method)并调用它

package main;
my $foo = Foo->new();
my $ref = \&Foo::bar;
$foo->$ref();
Run Code Online (Sandbox Code Playgroud)

但有时(好吧,经常)你不知道明确的类型.比方说有Foo,Bar,Baz,,他们都有自己的blat方法.您希望基于对象而不是包来获取对适当方法的引用.你会怎么做?

perl reference callback package

2
推荐指数
1
解决办法
305
查看次数

Perl Hash Slice,Replication x Operator和sub params

好的,我理解perl哈希切片和Perl中的"x"运算符,但是有人可以从这里解释下面的代码示例(稍微简化)吗?

sub test{
    my %hash;
    @hash{@_} = (undef) x @_;
}
Run Code Online (Sandbox Code Playgroud)

示例调用sub:

test('one', 'two', 'three');
Run Code Online (Sandbox Code Playgroud)

这条线是什么引发了我:

@hash{@_} = (undef) x @_;
Run Code Online (Sandbox Code Playgroud)

它正在创建一个哈希,其中键是sub的参数并初始化为undef,因此:

%哈希:

'one'=> undef,'two'=> undef,'three'=> undef

x运算符的rvalue应该是一个数字; 如何将@_解释为子参数数组的长度?我希望你至少要做到这一点:

@hash{@_} = (undef) x scalar @_;
Run Code Online (Sandbox Code Playgroud)

perl hash slice replicate

2
推荐指数
1
解决办法
1640
查看次数

如何在此处文档中使用 \(反斜杠)并在打印时显示它?

print <<EOTEXT;

      (`-') (`-')  _<-. (`-')_            <-. (`-')  
     _(OO ) ( OO).-/   \( OO) )     .->      \(OO )_ 
,--.(_/,-.\(,------.,--./ ,--/ (`-')----. ,--./  ,-.)
\   \ / (_/ |  .---'|   \ |  | ( OO).-.  '|   `.'   |
 \   /   / (|  '--. |  . '|  |)( _) | |  ||  |'.'|  |
_ \     /_) |  .--' |  |\    |  \|  |)|  ||  |   |  |
\-'\   /    |  `---.|  | \   |   '  '-'  '|  |   |  |
    `-' …
Run Code Online (Sandbox Code Playgroud)

perl ascii

2
推荐指数
1
解决办法
177
查看次数

printf 中 %% 的作用是什么?

给定以下 C 语言程序,

#include <stdio.h>

int main() 
{ 
    printf(" \"Books %% OR %% apparels\""); 
    getchar(); 
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

该程序打印书籍% OR % 服装,我想知道%% 的意义,因为它看起来没有必要。

c io

-2
推荐指数
1
解决办法
2万
查看次数

标签 统计

perl ×10

hash ×2

regex ×2

arrays ×1

ascii ×1

boo ×1

c ×1

callback ×1

cpan ×1

dpan ×1

functional-testing ×1

io ×1

module ×1

package ×1

prompt ×1

reference ×1

replicate ×1

slice ×1

testing ×1

unix ×1