我有一个函数将Excel数据提取到一个哈希数组中,如下所示:
sub set_exceldata {
my $excel_file_or = '.\Excel\ORDERS.csv';
if (-e $excel_file_or) {
open (EXCEL_OR, $excel_file_or) || die("\n can't open $excel_file_or: $!\n");
while () {
chomp;
my ( $id, $date, $product, $batchid, $address, $cost ) = split ",";
my %a = ( id => $id
, date => $date
, product => $product
, batchid => $batchid
, address => $address
, cost => $cost
);
push ( @array_data_or, \%a );
}
close EXCEL_OR;
}
}
Run Code Online (Sandbox Code Playgroud)
填充哈希数组是很好的.但是,困难的部分是在数组中搜索特定项(哈希).我似乎无法找到可能具有id或21,或batchid为15或成本> $ 20等的项目.
我将如何实施这样的搜索工具?
谢谢大家,
我现在不太清楚,可能会忽略一些简单的事情.我已经考虑了一段时间并一直在寻找,但不能再想到任何明智的搜索查询会导致我找到我想要的东西.
简而言之,我想知道如何进行模块继承,就像base.pm/parent.pm为面向对象模块做的那样; 仅适用于基于Exporter的模块.
我的意思的一个假设的例子:
这是我们的脚本.它最初加载了Foo.pm并从中调用了baz(),但是baz()有一个可怕的bug(我们很快就会看到),所以我们现在使用Local/Patched/Foo.pm来解决这个问题.我们这样做,因为在这个假设的情况下我们不能改变Foo(它是一个正在积极开发的cpan模块,你看),并且它是巨大的(严重的).
#!/usr/bin/perl
# use Foo qw( baz [... 100 more functions here ...] );
use Local::Patched::Foo qw( baz [... 100 more functions here ...] );
baz();
Run Code Online (Sandbox Code Playgroud)
这是Foo.pm. 正如你所看到的,它导出了调用qux的baz(),它有一个可怕的bug,导致事情崩溃.我们希望保留baz和Foo.pm的其余部分,但没有做大量的复制粘贴,特别是因为它们可能会在以后更改,因为Foo仍在开发中.
package Foo;
use parent 'Exporter';
our @EXPORT = qw( baz [... 100 more functions here ...] );
sub baz { qux(); }
sub qux { print 1/0; } # !!!!!!!!!!!!!
[... 100 more functions here ...]
1;
Run Code Online (Sandbox Code Playgroud)
最后,由于Foo.pm用于很多地方,我们不想使用Sub :: Exporter,因为这意味着将bandaid修复程序复制粘贴到所有这些地方.相反,我们正在尝试创建一个新的模块,其行为和看起来像Foo.pm,并且实际上仍然从Foo.pm加载其99%的功能,并用更好的一个替换丑陋的qux子.
接下来是如果Foo.pm是面向对象的,那么这样的事情会是什么样子:
package Local::Patched::Foo;
use parent 'Foo';
sub qux …Run Code Online (Sandbox Code Playgroud) 根据迈克尔卡曼的评论,我决定改写这个问题.请注意,在此编辑之前会出现11条评论,并且相信迈克尔观察到我没有以明确我要求的方式编写问题.
$a和$b通过导入模块有关于严格?
首先是一些设置.以下作品:
#!/bin/perl
use strict;
print "\$a=$a\n";
print "\$b=$b\n";
Run Code Online (Sandbox Code Playgroud)
如果我再添加一行:
print "\$c=$c\n";
Run Code Online (Sandbox Code Playgroud)
我在编译时遇到错误,这意味着我的任何令人眼花缭乱的打印代码都无法运行.
如果我评论use strict;它运行正常.在狭窄之外,$a并且$b主要特别在于sort将两个值与这些名称进行比较.
my @reverse_order = sort { $b <=> $a } @unsorted;
Run Code Online (Sandbox Code Playgroud)
因此,主要的功能差异有关$a,并$b此路不通虽然Perl的"知道他们的名字" -是你最好知道这一点,当你排序,或者使用一些功能列表::的Util.
只有当你使用严格,这$a和$b在一个全新的方式成为特殊变量.它们是唯一的严格意义上的变量,而不会抱怨它们没有被声明.
:现在,我喜欢严格,但令我感到震惊的是,如果TIMTOWTDI(有多种方法可以做到这一点)是Perl中的规则#1,那么这不是非常TIMTOWDI.它说,$a和$b是特殊的,仅此而已.如果你想使用变量,你不必声明$a并且$b是你的家伙.如果你想通过添加三个变量$c,突然之间还有另一种方法可以做到.
没关系在操纵哈希$k并且$v可能更有意义:
my %starts_upper_1_to_25
= skim { …Run Code Online (Sandbox Code Playgroud) 我想在Perl中做,相当于以下Ruby代码:
class Foo
MY_CONST = {
'foo' => 'bar',
'baz' => {
'innerbar' => 'bleh'
},
}
def some_method
a = MY_CONST[ 'foo' ]
end
end
# In some other file which uses Foo...
b = Foo::MY_CONST[ 'baz' ][ 'innerbar' ]
Run Code Online (Sandbox Code Playgroud)
也就是说,我只想声明一个常量的嵌套哈希结构,以便在类和外部使用.如何?
# I have a hash
my %my_hash;
# I have an array
@my_array = ["aa" , "bbb"];
# I store the array in my hash
$my_hash{"Kunjan"} = @my_array;
# But I can't print my array's element
print $my_hash{"Kunjan"}[0];
Run Code Online (Sandbox Code Playgroud)
我是Perl的新手.请帮我.
下面是我的代码(不要担心模块顶部有USUW)
我正在测试数组引用是否是只读的,如果是这种情况,那么我将它复制到另一个数组引用.测试显示该数组不是只读的,但是当它运行时,它会因该错误而失败.(对于那些你不熟悉的我或Smart::Comments--those ###的Smart::Comments.)
### readonly( $arg_ref ) : readonly( $arg_ref )
### readonly( @$arg_ref ) : readonly( @$arg_ref )
my @ro = map { readonly( $_ ) } @$arg_ref;
### @ro
if ( readonly $arg_ref ) {
$arg_ref = [ @$arg_ref ];
}
return map { my $val = shift @$arg_ref;
$_ => $val
} @_
;
Run Code Online (Sandbox Code Playgroud)
这是我得到的输出:
### readonly( $arg_ref ) : 0
### readonly( @$arg_ref ) : 0
### @ro: [
### 0, …Run Code Online (Sandbox Code Playgroud) 我有一组可变大小的字符串,例如:
AAA23
AB1D1
A1BC
AAB212
我的目标是按字母顺序排列并为COLUMNS收集独特的字符,例如:
第一栏:AAAA
第二栏:AB1A
等等...
在这一刻,我能够通过散列哈希来提取帖子.但是现在,我该如何对数据进行排序?我可以为每个散列哈希创建一个新数组吗?
非常感谢你的帮助!
人
我的代码:
#!/usr/bin/perl
use strict;
use warnings;
my @sessions = (
"AAAA",
"AAAC",
"ABAB",
"ABAD"
);
my $length_max = 0;
my $length_tmp = 0;
my %columns;
foreach my $string (@sessions){
my $l = length($string);
if ($l > $length_tmp){
$length_max = $l;
}
}
print "max legth : $length_max\n\n";
my $n = 1;
foreach my $string (@sessions){
my @ch = split("",$string);
for my $col (1..$length_max){
$columns{$n}{$col} = $ch[$col-1];
}
$n++; …Run Code Online (Sandbox Code Playgroud) 我想迭代一个哈希数组的引用,而不必制作本地副本,但我一直得到不能使用字符串("1")作为ARRAY引用,而"严格引用"错误.为什么?我如何解决它?
sub hasGoodCar {
my @garage = (
{
model => "BMW",
year => 1999
},
{
model => "Mercedes",
year => 2000
},
);
run testDriveCars( \@garage );
}
sub testDriveCars {
my $garage = @_;
foreach my $car ( @{$garage} ) { # <=========== Can't use string ("1") as an ARRAY ref while "strict refs" error
return 1 if $car->{model} eq "BMW";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在学习Perl的多线程.我的代码:
use warnings;
use threads;
use threads::shared;
$howmany = 10;
$threads = 5;
$to = int($howmany / $threads);
for (0 .. $threads) {$trl[$_] = threads->create(\&main, $_);}
for (@trl) {$_->join;}
sub main {
for (1 .. $to) {
print "test\n";
}
}
exit(0);
Run Code Online (Sandbox Code Playgroud)
我想在线程中打印单词test $howmany times $threads.此代码打印测试 12次.问题出在哪儿?
我一直在努力将变量赋值给Perl中的键.我要做的是提示用户输入一个值,该值保存在一个变量中,该变量用作访问和打印哈希表中保存的值的键.以下代码有助于说明我的问题:
my $key = 0;
print( "Enter the value for your key\n" );
$key = <>;
my %hash = (
a => "A",
b => "B",
);
print( $hash{$key} );
Run Code Online (Sandbox Code Playgroud)
问题是print($ hash {$ key}); 什么都不打印到屏幕上,但printf($ hash {"a"};确实;我不明白.任何帮助和澄清将不胜感激.提前致谢.