5

当社の Web サイトでは、Perl を使用して、人事担当者が欠員を Web サイトに掲載するための簡単なメカニズムを提供しています。これはサードパーティによって開発されましたが、彼らは長い間連絡を取り合っていました。悲しいことに、社内に Perl のスキルはありません。これは、マーケティング担当者が社内の IT チームを迂回したときに起こることです!

このアプリケーションに簡単な変更を加える必要があります。現在、欠員ページには、欠員があるかどうかに関係なく、「現在、次の空室があります:」と表示されています。したがって、この行が適切なタイミングでのみ表示されるように変更します。

もちろん、少し Perl を学び始めることもできますが、私たちはすでに代わりのサイトを計画しており、Perl を使用していないことは確かです。したがって、これらのスキルを持つ人にとって解決策は些細なものになるため、焦点を絞った助けを求めようと思いました.

以下は、欠員をリストする手順の開始です。

sub list {
  require HTTP::Date;
  import HTTP::Date;

  my $date = [split /\s+/, HTTP::Date::time2iso(time())]->[0];

  my $dbh = DBI->connect($dsn, $user, $password)
    || die "cannot connect to $database: $!\n";

  my $sql = <<EOSQL;
SELECT * FROM $table where expiry >= '$date' order by expiry
EOSQL

  my $sth = $dbh->prepare($sql);
  $sth->execute();


  while (my $ref = $sth->fetchrow_hashref()) {
    my $temp  = $template;
    $temp     =~ s#__TITLE__#$ref->{'title'}#;

    my $job_spec = $ref->{'job_spec'};

...etc...

キーラインはwhile (my $ref = $sth->fetchrow_hashref()) {. これは、「返されたレコードセットから別の欠員を引き出すことができる間...」と言っていると考えています。この行の前に print ステートメントを配置すると、常に表示されます。この行の後、空席ごとに繰り返されました。

返されたレコードセットを途中で移動せずに、表示する空席があることを確認するにはどうすればよいですか?

while ループ内のコードをいつでもコピーして、(while ループの前にある) if() ステートメント内に配置できます。このステートメントには、print ステートメントも含まれます。しかし、私はより単純なアプローチを好むだけですIf any records then print "We currently have.." line. 残念ながら、私はこの単純な行でさえコーディングする手がかりがありません。

ほら、私の手探りの説明を考慮しても、それは些細な問題だと言いました!

ティア

クリス

4

9 に答える 9

15

本当に簡単な方法は次のとおりです。

$sth->execute();

my $first = 1;
while (my $ref = $sth->fetchrow_hashref()) {
    if( $first ) {
        print "We currently have the following vacancies:\n";
        $first = 0;
    }
    my $temp  = $template;
    ...
}
if( $first ) {
    print "No vacancies found\n";
}
于 2008-11-14T13:55:39.997 に答える
3

これはデータベースに関する質問なので、Perl に関する質問ではありません。結果が得られるまで、結果がいくつあるかを知る良い方法はありません。ここには 2 つの選択肢があります。

  1. 「select count(*)」を実行して行数を確認するクエリを実行してから、別のクエリを実行して実際の行を取得するか、
  2. クエリを実行して結果をハッシュに保存し、ハッシュに含まれるエントリの数を数えてから、ハッシュを調べて結果を出力します。

たとえば、私の頭の上から:

my @results = ();
while (my $ref = $sth->fetchrow_hashref()) {
   push @results, $ref;
}

if ($#results == 0) {
  ... no results
} else {
  foreach $ref (@results) {
    my $temp = $template;
    ....
 }
于 2008-11-14T13:55:11.493 に答える
3

Mysql を使用している場合、「rows」メソッドは問題なく機能します。

$sth->execute();

if($sth->rows) {
  print "We have data!\n";
}

while(my $ref = $sth->fetchrow_hashref()) {
...
}

この方法といくつかの警告は、"perldoc DBI" に詳細に文書化されています。常に "perldoc" から始めてください。

于 2008-11-14T16:51:26.537 に答える
2

誰もがヘッダーがGraemeのソリューションで印刷されているかどうかについて繰り返されるテストを最適化することを望んでいるので、私はそれにこのマイナーなバリエーションを提示します。

$sth->execute();

my $ref = $sth->fetchrow_hashref();
if ($ref) {
  print "We currently have the following vacancies:\n";
  while ($ref) {
    my $temp  = $template;
    ...
    $ref = $sth->fetchrow_hashref();
  }
} else {
    print "No vacancies found\n";
}
于 2008-11-14T19:17:34.650 に答える
1
use Lingua::EN::Inflect 'PL';

$sth->execute();
my $results = $sth->fetchall_arrayref( {}, $max_rows );

if (@$results) {
    print "We currently have the following ", PL("vacancy",scalar @$results), ":\n";

    for my $ref (@$results) {
        ...
    }
}
于 2008-11-14T18:06:40.410 に答える
1

もう少し効率的な方法 (ループ内の条件を回避する) では、ページの出力方法を少し変更してもかまわない場合 (一度に 1 行ずつではなく、すべて一度に) を保持する変数を作成できます。ループ直前の出力:

my $output = '';

次に、ループ内で、print ステートメントを次のように変更します。

$output .= "whatever we would have printed";

ループの後:

if ($output eq '')
{
  print 'We have no vacancies.';
}
else
{
  print "We currently have the following vacancies:\n" . $output;
}
于 2008-11-14T14:03:37.703 に答える
1

別のクエリを追加するだけです..次のようなもの:

# count the vacancies    
$numinfo = $dbh->prepare("SELECT COUNT(*) FROM $table WHERE EXPIRY >= ?");
$numinfo->execute($date);
$count = $numinfo->fetchrow_arrayref()->[0];

# print a message
my $msg = '';
if   ($count == 0) $msg = 'We do not have any vacancies right now';
else               $msg = 'We have the following vacancies';
print($msg);
于 2008-11-14T14:05:06.250 に答える
-2

perldoc DBI は次のように述べています。

 For a non-"SELECT" statement, "execute" returns the number of rows
 affected, if known. If no rows were affected, then "execute"
 returns "0E0", which Perl will treat as 0 but will regard as true.

したがって、答えは $sth->execute() の戻り値をチェックすることです:

 my $returnval = $sth->execute;
 if (defined $returnval && $returnval == 0) {
     carp "Query executed successfully but returned nothing";
     return;
 }
于 2008-11-15T04:28:45.880 に答える