2009-04-06 13 views
2

私は割り当てのためにPerlに小さなプログラムを書いています。私はPerlを初めて使っています。PerlのGD :: Graphが「無効なデータセット」について不平を言っているのはなぜですか?

私が書いたコードは私に必要な値とまったく同じものですが、棒グラフを作成する際にこのエラーが発生しています。

Invalid data set: 0 at line 67 

67行目には、次のコードにコメントがあります。 x軸に保存されている

値は次のとおりです。

40 44 48 52 64 76 83 104 105 148 149 249 431 665 805 1420 1500 

そしてY_AXISは以下のとおりです。

16 1 1 6 1 1 1 1 1 1 1 1 1 1 1 2 5 

は、ここに私のコードです:

use GD::Graph::bars; 

open(CHECKBOOK,"c:\\Perl\\bin\\ip_packet_trace1.txt"); 

my $counter = -1; 
my @sizearray = {}; 
while ($record = <CHECKBOOK>) { 
    @array = split(/\t/,$record); 
    $counter++; 
    $sizearray[$counter] = $array[6]; 

} 

$counter++; 

my @array1 = sort {$a <=> $b} @sizearray; 
print "$counter\n"; 
print "@array1\n"; 


my @freq = {0...0}; 

foreach $elem (@array1){ 

    my $s = $freq[$elem]+1; 

    $freq[$elem] = $s; 
} 


my $size = @freq; 
my @x_axis = {}; 
my @y_axis = {}; 

my $count2 = -1; 


for($i = 1; $i < $size; $i++){ 

    my $elem = $freq[$i]; 

    if($elem and $elem > 0 ){ 

     $count2++; 

     $x_axis[$count2] = $i; 

     $y_axis[$count2] = $elem; 
    } 

} 


print "@x_axis \n"; 
print "@y_axis \n"; 




my $mygraph = GD::Graph::bars->new(500, 300); # line 67 

$mygraph->set(x_label  => 'Month', 

y_label  => 'Number of Hits', 

title  => 'Number of Hits in Each Month in 2002', 

) or warn $mygraph->error; 

my @data = {@x_axis,@y_axis}; 



my $myimage = $mygraph->plot(\@data) or die $mygraph->error; 

open(IMG, '>C:\\image\\file.gif') or die $!; 

binmode IMG; 

print IMG $myimage->gif; 

close IMG; 
+0

太字でマークした行にコメントを追加しました(ただし、コードとして書式設定されているため太字ではありません)。しかし、私はあなたが間違った行をマークしたかもしれないと思います。私は - >プロットの行にエラーがあると思います。 –

答えて

1

K.私はあなたのコードをテストし、変更されました。以下のコードは動作します。誰もが言及した配列部分は重要でしたが、あなたの唯一の問題ではありませんでした。 cpanの例は無名配列だったので、@ data 2配列を渡すのではなく、@ dataに2つの参照を渡すだけでした。

#!/usr/bin/perl 
# 
use GD::Graph::bars; 

my $size = @freq; 
my @x_axis = qw(40 44 48 52 64 76 83 104 105 148 149 249 431 665 805 1420 1500); 
my @y_axis = qw(16 1 1 6 1 1 1 1 1 1 1 1 1 1 1 2 5); 

my $mygraph = GD::Graph::bars->new(500, 300); # line 67 
$mygraph->set(x_label  => 'Month', 
      y_label  => 'Number of Hits', 
      title  => 'Number of Hits in Each Month in 2002', 
) or warn $mygraph->error; 
my @data = (\@x_axis,\@y_axis); # the important part. 
my $myimage = $mygraph->plot(\@data) or die $mygraph->error; 

open(IMG, '>helping_graph.gif') or die $!; 
binmode IMG; 
print IMG $myimage->gif; 
close IMG; 
1

私は何を私は本当にわからないんだけど見ていますが、1つは私のところに飛び出します:ハッシュリファレンスとして配列を初期化しています:

hektor ~ $ perl -e '@sizearray = {}; print @sizearray, "\n"' 
HASH(0x8031c0) 

あなたが望むすべては空の配列である場合、あなたは、単にこれを言うことができますが:

my @sizearray; 

あなたは明確にそれが新しいと空のようにしたい場合は、括弧をしたいです。下記参照。 (ブラッドが彼のコメントで言うように、しかし、これは冗長である。あなたは、おそらく簡単なバージョンを見て、書くことに慣れる必要があります。)

my @sizearray =(); 

配列店はリストとリストは括弧で行く命じました。詳細については、perldoc perldataを参照してください。

+0

'my @sizearray;'は私の '@sizearray =();' –

+0

とまったく同じですが、 '@sizearray =();の視覚的リマインダが好きな人もいるでしょう。他の言語でも、私はそれを自分でやっていません。私は、彼が主張すれば、{}のように物事を壊すことはないということを意味しました。私はメモを入れます。 – Telemachus

2

use strictおよびuse warningsとしてください。これらのプラグマを使用すると、このコードで進行している面倒なことの多くにフラグが立てられます。

また、配列の最後に追加するために多くの努力をしています。 pushを使用すると、最後のアイテムのインデックスを知らなくてもこれを行うことができます。このようなプッシュを使用すると、コードをかなり単純化できます。

()を使用して空の配列を作成します(実際にはウェルリスト)。配列リファレンスを作成するには[]を使用してください。ハッシュリファレンスを作成するには{}を使用してください。あなたは、いくつかの場所でハッシュリファレンスを使用してきました。

グローバルファイルハンドルの代わりに字句ファイルハンドルを使用することも最適です。グローバルなファイルハンドルを使用すると、不必要なグローバル変数が使用されています。また、openへの通話が成功したかどうかを確認してください。

open(my $fh, '<', 'path/to/file) 
    or die "Unable to open data file - $!\n"; 

データ構造で作業しているとき、Data :: Dumperは何が起こっているかを見るのに便利なモジュールです。

use Data::Dumper; 

my $foo = { 
    bar => [ 0..5], 
    baz => { a..z }, 
}; 

my @qux = ([qw/a b c d/], [0..5]); 

print Dumper $foo; 
print Dumper \@qux; 

また、彼らは参照とネストされたデータ構造で作業する方法の良い例がありperldscperlreftutを見てみましょう。

3

@dataのあなたの割り当てはおそらく責任があると思います。

my @data = {@x_axis,@y_axis}; 

これは、1つの要素で配列を作成します。その1つの要素はハッシュです。 GD::Graphのドキュメントには、配列の配列が必要であることが示されています。これは、daotoadと記載されているので、Data::Dumperが便利です。次のことを試してみてください:

use Data::Dumper; 
my @x_axis = 1...100; 
my @y_axis = "a"..."z"; 
my @data = {@x_axis,@y_axis}; 
warn Dumper(\@data); 

あなたは、データを解釈しているかを確認することができ、そしてそれはGD::Graph exampleと同じではないことを参照してください。

@data = ( 
    ["1st","2nd","3rd","4th","5th","6th","7th", "8th", "9th"], 
    [ 1, 2, 5, 6, 3, 1.5, 1,  3,  4], 
    [ sort { $a <=> $b } (1, 2, 5, 6, 3, 1.5, 1, 3, 4) ] 
); 
関連する問題