0

私はちょっとした Perl スクリプトを作ろうとしています (私は初心者です!)

コードの例を取り上げ、必要に応じて編集しました。

したがって、タスクは、csv ファイルからデータを読み取り、それらを html テーブルに配置し、図をパイ形式で表示することです。

テーブルは既に機能していますが、円グラフだけが私の問題です。私はすでにコードのダイアグラム部分内で多くの変更を見て試しましたが、勝つことはできませんでした。

これが私のコードです:

#!C:\Perl64\bin\perl.exe -w
### Variablendeklarationen und Moduleinbindungen ###
use strict;

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use DBI;
my $DBH = DBI->connect('DBI:CSV:');
my $STH;
use CGI::Carp 'fatalsToBrowser';

### Statement-Vorbereitung ###
$DBH->{'csv_tables'}->{'daten'} = { 'file' => 'daten.csv'}
    or die "Konnte Datenbank nicht oeffnen:$!";
$STH = $DBH->prepare("SELECT * FROM daten")
    or die "Konnte SQL-Statement nicht ausfuehren:$!";

$STH->execute()
    or die "Ausfuehren der Datenbankabfrage nicht moeglich:$!";

print <<HERE_TEXT;
Content-type:text/html

<html>
<head>
<title>Datenanzeige CSV-File</title>
</head>

<body>
<center>
<h1>Folgende Umsatzdaten sind ausgelesen worden:</h1>
<hr>
<table border>
<tr>
    <td width="200"><b>Filiale:</b></td>
    <td width="100"><b>Leiter:</b></td>
    <td width="200"><b>Mitarbeiter:</b></td>
    <td width="100"><b>Umsatz:</b></td>
</tr>

HERE_TEXT

my @data;
my @diagarray;

while (@data = $STH->fetchrow_array()) {
    my $filiale = $data[0];
    my $leiter = $data[1];
    my $mitarbeiter = $data[2];
    my $umsatz = $data[3];

push (@diagarray, $umsatz);
print qq§<tr>\n<td><b>$filiale</b></td>\n<td>$leiter</td>\n<td>$mitarbeiter</td>\n<td>$umsatz</td>\n</tr>\n§;
}
print ("<br><br>");

use GD::Graph::pie;
my $graph = GD::Graph::pie->new(300, 300);

    $graph->set(
    title => 'Umsatzverteilung Filialen',
    ) or die $graph->error;

#my @diagram = (\@data,\@diagarray);

#Debug
#my $diagram;
#   foreach $diagram(@diagram)
#       {
#           print ("$diagram\n");
#       }

my $gd = $graph->plot(\@diagarray) or die $graph->error;

    my $format = $graph->export_format;
    print header("image/$format");
    binmode STDOUT;
    print $graph->plot(\@diagarray)->$format();

誰かが私に最後の必要なヒントを与えることができれば素晴らしいでしょう. ご挨拶

4

2 に答える 2

1

デバッグするときは、常にデータとスクリプト フローを確認し、何も正しいと思い込まないでください。

試す

use Data::Dumper; # at the top of your script
[...]
print Dumper(\@diagarray); # just before your $graph->plot call

データ形式がhttp://search.cpan.org/~ruz/GDGraph-1.52/Graph.pm#USAGEに表示されているものと異なることにおそらく気付くでしょう。

サンプルが ArrayRefs の ArrayRef を示している間、ArrayRef を ->plot に渡しています。

[
  ['Desc1','Desc2'],
  [250000, 350000],
]

描画部分を抽出し、動作する結果が得られるまで静的データで試すことをお勧めします。次に、それをスクリプトにコピーして戻し、静的データを実際のデータに置き換えます。次に例を示します。

#!/usr/bin/perl
use GD::Graph::pie;
my $graph = GD::Graph::pie->new(300, 300);
    $graph->set(
    title => 'Umsatzverteilung Filialen',
    ) or die $graph->error;
my @diagarray = (
    ['Title1', 'Title2', ],
    [ 100, 200 ],
);
my $gd = $graph->plot(\@diagarray) or die $graph->error;
my $format = $graph->export_format;
print header("image/$format");
binmode STDOUT;
print $graph->plot(\@diagarray)->$format();

また、エラー メッセージで報告された行を確認します。->plot 呼び出しのそれぞれが理由である可能性があります。

2 つの追加の注意事項:

  1. コードは実行時に実行されますが、コードはコンパイル時に処理されるため、コードはスクリプトのuse行内にある必要はありません。混合してもスクリプトに害はありませんが、私の $DBH = DBI->connect('DBI:CSV:'); のように見えます。CGI::Carp を使用する前に実行されます。
  2. スクリプトから HTML ソースを印刷することは、テストと学習には問題ありませんが、メンテナンスが難しくなるため、生産的な環境では実行しないでください。Template::Toolkit などを使ってみてください。
于 2016-04-22T08:09:55.863 に答える
0

@diagarray に 2 つの配列参照を取得することは、スカラーをそれにプッシュする方法と何ら変わりはありません。

push(@diagarray,\@labels);
push(@diagarray,\@values);

ただし、while ループの外でそれを行う必要があります。while ループの内側は、@labels と @values を入力する場所です。両方の配列は同じサイズでなければなりません。

また、スクリプトは HTML と円グラフを一度に出力しようとしていますが、ブラウザはすべてを HTML の 1 つの塊として扱うため、機能しません。HTML には、別の URL を指す「img」タグが必要です。その URL は同じスクリプトである場合もありますが、クエリ文字列が異なります。例えば

use CGI
my $query=new CGI;
if($query->param("piechart")) {
   # print out the graph
} else {
   print "<img src=\"",$ENV{"SCRIPT_NAME"},"?piechart=1\"/>";
}

または、円グラフのコードを完全に別のスクリプトに分割することもできますが、データを読み取るためのコードが変更された場合に 2 つのスクリプトを更新する必要があるため、保守が容易ではなくなります。

于 2016-04-22T23:45:39.037 に答える