小编Axe*_*man的帖子

按值搜索数组中的哈希值

我有一个函数将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等的项目.

我将如何实施这样的搜索工具?

谢谢大家,

arrays perl hash perl-data-structures

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

为非对象perl模块复制base/parent.pm功能的最简洁方法是什么?

我现在不太清楚,可能会忽略一些简单的事情.我已经考虑了一段时间并一直在寻找,但不能再想到任何明智的搜索查询会导致我找到我想要的东西.

简而言之,我想知道如何进行模块继承,就像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)

perl refactoring module

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

是否有某种方法可以像严格一样制作$ a和$ b等变量?

根据迈克尔卡曼的评论,我决定改写这个问题.请注意,在此编辑之前会出现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 timtowtdi

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

如何在Perl中创建嵌套哈希作为常量?

我想在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)

也就是说,我只想声明一个常量的嵌套哈希结构,以便在类和外部使用.如何?

perl hash constants perl-data-structures

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

如何在Perl中访问存储在哈希中的数组元素?

  # 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的新手.请帮我.

perl hash perl-data-structures

5
推荐指数
3
解决办法
2753
查看次数

任何人都可以向我解释这个只读的例外情况吗?

下面是我的代码(不要担心模块顶部有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)

perl readonly

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

Perl - 散列和列的哈希:(

我有一组可变大小的字符串,例如:

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)

perl hash perl-data-structures

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

Perl中的引用:哈希数组

我想迭代一个哈希数组的引用,而不必制作本地副本,但我一直得到不能使用字符串("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)

arrays perl hash reference perl-data-structures

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

为什么要打印12次?

我正在学习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

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

如何在Perl中使用变量作为哈希键?

我一直在努力将变量赋值给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"};确实;我不明白.任何帮助和澄清将不胜感激.提前致谢.

variables perl hash

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