小编Cha*_*g76的帖子

替换 perl 中多维哈希的 MULTIPLE 第一个键

继我问的类似问题(更改 perl 中多维散列的第一个键)之后,我在 perl 中有一个多维散列,并且想更改所选值的多个第一个键。例如,我有哈希

my %Hash1;
$Hash1{1}{12}=1;
$Hash1{1}{10}=1;
$Hash1{2}{31}=1;
$Hash1{3}{52}=1;
$Hash1{3}{58}=1;
$Hash1{4}{82}=1;
$Hash1{4}{154}=1;
Run Code Online (Sandbox Code Playgroud)

现在我想用值 300 替换第一个键中的值 3 和 4。在此之后我会得到:

$Hash1{1}{12}=1;
$Hash1{1}{10}=1;
$Hash1{2}{31}=1;
$Hash1{300}{52}=1;
$Hash1{300}{58}=1;
$Hash1{300}{82}=1;
$Hash1{300}{154}=1;
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过扫描原始哈希并执行以下操作来创建新哈希:

my %Hash2;
foreach my $key1 (sort keys %Hash1) {
    foreach my $key2 (keys %{ $Hash1{$key1} }) {
        if($key1==3 || $key1==4){
            $Hash2{300}{$key2}=1;
        } else {
            $Hash2{$key1}{$key2}=1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是有没有更快的方法呢?

perl hash

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

perl fork()如何检查子进程是否崩溃

我有一些生成许多子进程的Perl代码.基本代码如下:

 my $forked = 0;
 my $err = 0;
 my $Processes_To_Use_After_Calc=10;     
 print "Parent ($$) has started\n";
 for my $ispawn (1 .. $Processes_To_Use_After_Calc){
    my $child_pid = fork();
    die "Cannot fork: $!" if !defined $child_pid; # system overload
    if(defined $child_pid && $child_pid > 0) {
        ## Parent
        $forked++;
    } elsif(defined $child_pid){
        #
        # Here some calculations are performed
        #
        print "Child $$ has finished (number $ispawn) \n";
    }
}
for(1..$forked) {
    my $child_pid = wait();
}
Run Code Online (Sandbox Code Playgroud)

所有相当标准的东西.现在,我想知道是否有任何子进程崩溃(无法正确终止).显然,如果没有打印每个子进程的最后一个语句,我可以认为存在问题.但是,我希望另一种方法可以完全退出父程序并关闭所有子进程,如果其中一个子进程崩溃,这些进程仍处于打开状态.这可能吗?

perl fork

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

使用 perl DBI 参数化 INSERT 语句将日期时间插入 Oracle

我需要使用 perl 将日期时间值插入到 Oracle 数据库表中。以下代码插入所需的值:

use strict;
use warnings;
use DBI ;
use DBD::Oracle ;

my $SRV1='server1';
my $DB1='database1';

my $Date_Str_To_Insert="TO_DATE('2003/05/03 21:02:44','yyyy/mm/dd hh24:mi:ss')";

my $db1 = DBI->connect("dbi:Oracle:$SRV1/$DB1", "user", "pword");
my $SQL1="insert into table1 (valdat) values ($Date_Str_To_Insert)";
my $SQL1_sth = $db1->prepare($SQL1);
$SQL1_sth->execute();
$SQL1_sth->finish();
$db1->disconnect if defined($db1) ;
Run Code Online (Sandbox Code Playgroud)

但是,如果我更换

my $SQL1="insert into table1 (valdat) values ($Date_Str_To_Insert)";
Run Code Online (Sandbox Code Playgroud)

经过

my $SQL1="insert into table1 (valdat) values (?)";
Run Code Online (Sandbox Code Playgroud)

$SQL1_sth->execute();
Run Code Online (Sandbox Code Playgroud)

经过

$SQL1_sth->execute($Date_Str_To_Insert);
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

DBD ERROR: error possibly near <*> indicator at char 42 in 'insert  into …
Run Code Online (Sandbox Code Playgroud)

oracle perl dbi

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

标签 统计

perl ×3

dbi ×1

fork ×1

hash ×1

oracle ×1