1

私は現在perlを学んでおり、データベース(DBIモジュール)にアクセスして統計を引き出す短いスクリプトがあります。以下に投稿されたコードは少し反復的であるように思われ、ハッシュループに減らすことができるかどうか疑問に思います。各データベースクエリの唯一の違いは、myo_maps_studyの正規表現です。

#Get the number of myo stress studies
$sth = $dbh->prepare("SELECT count(myo_maps_study) FROM myo WHERE myo_maps_study ~ 'MYO[0-9]*\$' AND myo_date <= ? AND myo_date >= ?");
$sth->execute($date_stop,$date_start) or die "Couldn't execute myo stress query" . $sth->errstr;
my $n_myo_stress = $sth->fetchrow_array;

#Get the number of myo redistribution studies
$sth = $dbh->prepare("SELECT count(myo_maps_study) FROM myo WHERE myo_maps_study ~ 'MYO[0-9]*R\$' AND myo_date <= ? AND myo_date >= ?");
$sth->execute($date_stop,$date_start) or die "Couldn't execute myo rep query" . $sth->errstr;
my $n_myo_rep = $sth->fetchrow_array;

#Stress tomos
$sth = $dbh->prepare("SELECT count(myo_maps_study) FROM myo WHERE myo_maps_study ~ 'MYO[0-9]*T\$' AND myo_date <= ? AND myo_date >= ?");
$sth->execute($date_stop,$date_start) or die "Couldn't execute myo stress tomo query" . $sth->errstr;
my $n_stress_tomo = $sth->fetchrow_array;

#Rest tomos
$sth = $dbh->prepare("SELECT count(myo_maps_study) FROM myo WHERE myo_maps_study ~ 'MYO[0-9]*U\$' AND myo_date <= ? AND myo_date >= ?");
$sth->execute($date_stop,$date_start) or die "Couldn't execute myo rest tomo query" . $sth->errstr;
my $n_rest_tomo = $sth->fetchrow_array;




print "***** Imaging Statistics  ************\n";
print "n_myo_stress: $n_myo_stress \n";
print "n_myo_rep: $n_myo_rep \n";
print "n_stress_tomo: $n_stress_tomo \n";
print "n_rest_tomo: $n_rest_tomo \n";
print "\n\n***********************************\n";

たとえば、キー値がn_myo_stress、n_myo_repなどであり、それらの値が正規表現MYO [0-9] \ $、MYO [0-9] * R\$などであるハッシュ配列を作成できます。

次に、を使用してデータベースクエリを実行し$sth->execute(hash value, $date_stop, $date_start)、クエリの結果を$ hash_key(つまり、$ n_myo_stress)の形式のスカラーに割り当てることができますか。最後に結果を端末に出力します

フォーマットとインデントが不十分であることをお詫びします。スタックオーバーフローでこれを行う方法がわかりません。

4

1 に答える 1

5

ハッシュは必要ありません。次のことを実行できます。

$sth = $dbh->prepare("SELECT count(myo_maps_study) FROM myo WHERE 
        myo_maps_study ~ ? AND myo_date <= ? AND myo_date >= ?");

my @results;

for my $myo (qw(MYO[0-9]*$ MYO[0-9]*R$ MYO[0-9]*T$ MYO[0-9]*U$)) {
    $sth->execute($myo, $date_stop, $date_start) 
        or die "Couldn't execute query for $myo: " . $sth->errstr;
    push @results, $sth->fetchrow_array;
}
于 2013-01-16T12:45:31.933 に答える