我有一个使用散列的脚本,它包含四个字符串作为键,其值为哈希值.这些哈希值还包含四个字符串作为键,它们也具有哈希值作为其值.此模式持续高达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 - > {}),因为它只是一个常规键 - >缩放器?
无论如何,我的假设的任何建议或肯定将不胜感激.
假设我们有:
sub test {
        print "testing\n";
}
Run Code Online (Sandbox Code Playgroud)
如果有一种情况我想让它打印到stderr而不是stdout,有没有办法我可以调用子程序来做到这一点?或者我可以将输出捕获到变量然后使用警告?我对perl很新.
假设我正在研究三个函数,我将在它们之间来回跳转.假设函数A,B和C在a,b和c行上.有没有办法绑定以下(跳转到行位置)
:a  
:b
:c 
Run Code Online (Sandbox Code Playgroud)
在运行期间键到键,这样我就可以轻松跳转到这些位置.如果您玩星际争霸,这有点像将选定的单位组绑定到您的数字键,然后使用数字键快速更改您选择的组(或跳转到指定的行,在这种情况下).
或者是否有其他方法可以获得我不知道的类似结果?我刚刚发现=%autoformats你突出显示的括号内的标签,所以我对vim很新.
谢谢.
我使用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)来查看内容,但是我得到了空字符串,这意味着数组是空的.我尝试了我的值赋值语法而没有分叉,它起作用 - 所以我必须在分叉时做错事.
基本上,当我在一个子程序中移动一个哈希值来处理它时,我得到了错误:哈希赋值中奇数个元素.如果我希望将哈希值传递给子例程,我是否应该使用哈希引用?
#!/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)