小编gra*_*tas的帖子

perl中的BerkeleyDB可以处理散列哈希值(最多为n)吗?

我有一个使用散列的脚本,它包含四个字符串作为键,其值为哈希值.这些哈希值还包含四个字符串作为键,它们也具有哈希值作为其值.此模式持续高达n-1级别,这是在运行时确定的.第n级哈希包含整数(与通常的哈希引用相对)值.

我为Perl安装了BerkeleyDB模块,因此我可以使用磁盘空间而不是RAM来存储此哈希.我假设我可以简单地将哈希绑定到数据库,它会工作,所以我在我的代码中添加了以下内容:

my %tags = () ; 
my $file = "db_tags.db" ; 
unlink $file; 


tie %tags, "BerkeleyDB::Hash", 
        -Filename => $file, 
        -Flags => DB_CREATE
     or die "Cannot open $file\n" ;
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

在getUniqSubTreeBDB.pl第31行第1行使用"strict refs"时,不能使用字符串("HASH(0x1a69ad8)")作为HASH引用.

为了测试,我创建了一个新脚本,其代码(上面)与哈希绑定到文件.然后我添加了以下内容:

my $href = \%tags; 
$tags{'C'} = {} ;
Run Code Online (Sandbox Code Playgroud)

它运行正常.然后我补充说:

$tags{'C'}->{'G'} = {} ;
Run Code Online (Sandbox Code Playgroud)

它会给出几乎相同的错误.我在想BerkeleyDB无法处理我正在创建的数据结构类型.也许它能够在我的测试中处理第一级(C - > {}),因为它只是一个常规键 - >缩放器?

无论如何,我的假设的任何建议或肯定将不胜感激.

database perl hash berkeley-db

8
推荐指数
1
解决办法
2101
查看次数

有没有办法将子程序的打印输出捕获到变量,所以我可以将它发送到stderr?

假设我们有:

sub test {
        print "testing\n";
}
Run Code Online (Sandbox Code Playgroud)

如果有一种情况我想让它打印到stderr而不是stdout,有没有办法我可以调用子程序来做到这一点?或者我可以将输出捕获到变量然后使用警告?我对perl很新.

perl stderr

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

vim - 如何保存行号,以便您可以随时轻松跳转到它们?

假设我正在研究三个函数,我将在它们之间来回跳转.假设函数A,B和C在a,b和c行上.有没有办法绑定以下(跳转到行位置)

:a  
:b
:c 
Run Code Online (Sandbox Code Playgroud)

在运行期间键到键,这样我就可以轻松跳转到这些位置.如果您玩星际争霸,这有点像将选定的单位组绑定到您的数字键,然后使用数字键快速更改您选择的组(或跳转到指定的行,在这种情况下).

或者是否有其他方法可以获得我不知道的类似结果?我刚刚发现=%autoformats你突出显示的括号内的标签,所以我对vim很新.

谢谢.

vim

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

2D数组和Parallel :: ForkManager,数组在分叉后然后分配值是空的?

我使用forkmanager同时运行任务而不是顺序运行任务.我已将实际代码转换为以下代表代码逻辑的示例代码.

#!/usr/bin/perl -w 
use strict;
use Data::Dumper;
use Parallel::ForkManager;

my @array2d = () ;



my $dim1Items = 4;
my $dim2Items = 3;

my $dim1Manager = Parallel::ForkManager->new($dim1Items);
for (my $i = 0; $i <= $dim1Items ; $i++) {
        $dim1Manager->start and next;


        my $dim2Manager = Parallel::ForkManager->new($dim2Items);
        for (my $j = 0; $j <= $dim2Items; $j++) {
                $dim2Manager->start and next;

                $array2d[$i][$j] = "$i\t$j" ;

                $dim2Manager->finish;
        }
        $dim2Manager->wait_all_children;


        $dim1Manager->finish;
}
$dim1Manager->wait_all_children;

print Dumper(@array2D) ; 
Run Code Online (Sandbox Code Playgroud)

然后我运行Dumper(@ 2dArray)来查看内容,但是我得到了空字符串,这意味着数组是空的.我尝试了我的值赋值语法而没有分叉,它起作用 - 所以我必须在分叉时做错事.

arrays perl

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

"哈希分配中奇数个元素" - 包含简单示例代码,为什么会发生?

基本上,当我在一个子程序中移动一个哈希值来处理它时,我得到了错误:哈希赋值中奇数个元素.如果我希望将哈希值传递给子例程,我是否应该使用哈希引用?

#!/usr/bin/perl -w
use strict;

my ($a, $b, $c, %hash) = &getVals() ;
&run($a,$b,$c,%hash) ;


sub getVals() {
    $hash{"f"} = "abc" ;
    $a = "A" ;
    $b = "B" ;
    $c = "C" ;
    return ($a, $b, $c, %hash) ;
}


sub run() {
    my $a = shift;
    my $b = shift;
    my $c = shift;
    my %hash = shift; #error here 


    #do stuff here. . . 
}  
Run Code Online (Sandbox Code Playgroud)

perl hash

0
推荐指数
1
解决办法
1174
查看次数

标签 统计

perl ×4

hash ×2

arrays ×1

berkeley-db ×1

database ×1

stderr ×1

vim ×1