假设我有一个子程序/方法,用户可以调用它来测试一些数据(例如)可能如下所示:
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是一个正则表达式.是否有任何良好的工具来检测标量是否有编译的正则表达式?
我有一个相当复杂的数据结构,我已经在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)
导入所有其他模块?
在这种特殊情况下,模块都是类,没有导出.
我有一个.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) 我似乎无法弄清楚如何将'when'关键字添加到BOO,它应该表现为'if'.我想我可以制作一个方法,但是我不能像我一样用它来移动.任何指针将不胜感激.
-标记
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) 我正准备设置一个完整的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分发.有关这个工具的任何想法?
我有一个我需要测试的设备的输出,主要是响应是一行,但有时它是两行.我用简单的正则表达式处理一行或两行来处理
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?
前几天,需要一次迭代一个数组的子集.最初,我用拼接做了这个 - 撕裂阵列在这种情况下没问题.它将一次返回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) 在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哈希切片和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) print <<EOTEXT;
(`-') (`-') _<-. (`-')_ <-. (`-')
_(OO ) ( OO).-/ \( OO) ) .-> \(OO )_
,--.(_/,-.\(,------.,--./ ,--/ (`-')----. ,--./ ,-.)
\ \ / (_/ | .---'| \ | | ( OO).-. '| `.' |
\ / / (| '--. | . '| |)( _) | | || |'.'| |
_ \ /_) | .--' | |\ | \| |)| || | | |
\-'\ / | `---.| | \ | ' '-' '| | | |
`-' …Run Code Online (Sandbox Code Playgroud) 给定以下 C 语言程序,
#include <stdio.h>
int main()
{
printf(" \"Books %% OR %% apparels\"");
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序打印书籍% OR % 服装,我想知道%% 的意义,因为它看起来没有必要。