perlのデータクリアーがうまく動かない

このQ&Aのポイント
  • perlのデータクリアーがうまく動かないです。データが残ったままでプログラムが処理されてしまいます。
  • 以下のプログラムで動作するようにと思っていたのですがうまく動きません。
  • データの格納処理の最終結果として、期待していた結果が得られません。
回答を見る
  • ベストアンサー

perlのデータクリアーがうまく動きません。

perlのデータクリアーがうまく動きません。 perlでデータからリンクを生成するプログラムを作成しています。 以下のプログラムで動作するようにと思っていたのですがうまく動きません。 $xlkprのデータが$mainlinkぶん蓄積したら、$mainlink分を繰り返し(コピー)してデータ格納させたいのです。 $xliprのクリア my $xlipr = ""; をしてますが、データが残ったままでプログラムは処理されてしまいます。 データ $datfile リンクA リンクB リンクC リンクD リンクE リンクF データが残っているので以下の結果となってしまってます。 格納されるデータ リンクA リンクB リンクA リンクB リンクA リンクB リンクC リンクD リンクA リンクB リンクC リンクD リンクA リンクB リンクC リンクD リンクE リンクF リンクA リンクB リンクC リンクD リンクE リンクF 最終結果 ←この結果となって欲しいです。 リンクA リンクB リンクA リンクB リンクC リンクD リンクC リンクD リンクE リンクF リンクE リンクF 以下のプログラムを載せます。 プログラム (ここから) 略 $mainlink = 2; open(IN,"$datfile")|| die &error(" $datfile を読み込みopen出来ません"); flock(IN,2); @lines = <IN>; close(IN); foreach $line(@lines){ ($seq2,$id,$mail,$temp,$purl,$ttitle,$yo1,$yo2,$yo3) = split("<>", $line); #リンクタグ生成ロジック if ($mainsiteurl eq $purl){ $xlink++; if ($temp eq "1"){$xlkpr .= "<a href=\"$purl/$id\">$ttitle</a>\n";} if ($temp eq "2"){$xlkpr .= "<a href=\"$purl/?$id\">$ttitle</a>\n";} if ($temp eq "3"){$xlkpr .= "<a href=\"$purl/?id=$id&m=$mail\">$ttitle</a>\n";} if ($xlink >= $max){ for($i=1;$i<=$mainlink;$i++){ $print_link2 .= "$xlkpr"; } my $xlipr = ""; $max = $max + $mainlink; } } } 以下略 データ格納処理へ (ここまで) もっと効率の良いプログラムもあるかと思いますが、申し訳ございませんご教授頂きたくよろしくお願いいたします。

  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

この > my $xlipr = ""; は、この位置で、このブロック内のみで有効な新しい$xliprが作られます。それまでに同じ名前の変数があっても、それとは、無関係です。 このプログラムの場合、my を使わなければ、次と等価です。(xlipr2は他で使っていないとして) $xlipr2 = ""; $xliprが初期化されていないのが一目瞭然です。 myを書かずに、 $xlipr = ""; とするのが、このプログラムでは正解です。 myは新しい変数を用意する、という意味では「変数の初期化」ですが、「既存の変数の値を初期化する」という機能ではありません。

hihin2003
質問者

お礼

kmeeさん 回答ありがとうございます!! myを書かないで処理しましたらバッチリ動きました。 >myは新しい変数を用意する、という意味では「変数の初期化」ですが、「既存の変数の値を初期化する」>という機能ではありません。 そうなんですね。勉強になります。 ありがとうございます。 本当に助かりました。

関連するQ&A

  • Perl ページ表示遅い ループの改善

    ソースが汚いかもしれませんが、ご教示お願い致します。 実行したいことは、できてはいるのですが、 「表示が遅い」です。 ループのやり探し、 サーバー上でのHTML生成が 原因だと思うのですが、 どう改善すればいいのかわかりません・・・ ・下記のソースの簡単な説明 あるテキストファイルにCSV方式でデータを記録してあります。 (最終で200万バイトくらい) (現在 12万バイト) そのデータで1列目に順位の数字があり (~20位前後) それを、いろんな条件で絞込し一気に表示してます。 そこから、サーバー上でテーブルとして表示させているのですが とにかく遅いです。 ・・・サーバー上で計算するからでしょうが・・・ もう少し速くする方法はないでしょうか? スクリプトでHTMLを生成させることはできるのですが、 サーバーにデータのみを保存させ そこから生成させたいのです・・・ ※だいたい10秒前後(Wi-Fi有りで) Wi-Fiの環境がなく、さらに回線が3Gまでに なっている人だと絶望的な状況だと・・・ 下記のソースで、 (1)おかしな点 (2)改善すれば速くなる点 (3)別の案 を教えてほしいです・・・ ------ソース------ my @DataNo = ("13","14","2","1","8"); my $DataName; for(my $dn=0;$dn<=$#DataNo;$dn++){  my $DataNo = $DataNo[$dn];  my ($No) = split(/,/, $DataNo);    if($No eq "13"){ $DataName = "A" }  if($No eq "14"){ $DataName = "B" }  if($No eq "2"){ $DataName = "C" }  if($No eq "1"){ $DataName = D" }  if($No eq "8"){ $DataName = "E" } print <<END;  <h2 class="ResMidashi"> $DataNameデータ</h2>   <table class="ResultData">    <tr>     <td>[$DataName]</td>     <th>Test1</th>     <th>Test2</th>     <th>Test3</th>    </tr> END my %hash = (); my @arrey; open(F, "<","../Test/Test.txt") or die("error :$!"); eval{ flock(F, 1) }; while(<F>){  chomp;  my @temp1 = split /,/;  push @arrey , $temp1[$No]; } close F; foreach (@arrey) {  $hash{$_}++; } my @Data; if($No eq "1" || $No eq "2" || $No eq "9"){  @Data = sort keys %hash; } else{  @Data = reverse sort keys %hash; } my $matches = 0; my $Count1 = 0; my $Count2 = 0; my $Count3 = 0; for(my $Co=0;$Co<=$#Data;$Co++){  my $DATA = $Data[$Co];  my ($Main) = split(/,/, $DATA);  open(F, "<","../Test/Test.txt") or die("error :$!");  eval{ flock(F, 1) };  while(<F>){   chomp;   my @temp2 = split /,/;   if( $temp2[5] eq "$JoukenA" and $temp2[6] eq "$JoukenB" and $temp2[7] eq "$JoukenC"){    if( $temp2[$No] =~ /^$Main$/ ){     $matches++;     $Count1++ if $temp2[0] == "1";     $Count2++ if $temp2[0] == "2";     $Count3++ if $temp2[0] == "3";    }   }  }  my $T;my $P;  if($matches){   $T = ($Count1 / $matches) * 100;   $T = sprintf('%.2f', $T);   $P = (($Count1 + $Count2 + $Count3) / $matches) * 100;   $P = sprintf('%.2f', $P);   my $Frame1;my $Frame2;   if($Puk ne "0.00"){ print <<END;    <tr>     <td>$Main</td>     <th>$Count1-$Count2-$Count3-$matches</th>     <th>$T</th>     <th>$P</th>    </tr> END   }  }  $matches = 0;  $Count1 = 0;  $Count2 = 0;  $Count3 = 0;  if($Co eq $#Data){last;} } print <<END;   </table> END }

    • ベストアンサー
    • Perl
  • perl 下記スクリプトは正常に動きますか?

    今まで長い間、何か勘違いしていたのか、条件が2つ以上になると、 長い間このように書いていたのですが、 if( ($a%2==1 && $b==1) && ($c eq 10 && $d == 5) ) { print "ok"; } 下記スクリプトでも正常に動作しますか? if( $a%2==1 && $b==1 && $c eq 10 && $d == 5){ print "ok"; }

    • ベストアンサー
    • Perl
  • 一つ前のデータを入れたい

    WIN2000 Access2000 です。 例えばクエリでこういう結果を出したいのですが ID f1 f2 f3 ------------    1 あ a 10    2 あ a 20    3 あ a 30    4 あ b 11    6 い c 20    7 い c 25    8 い d 30    を    ID f1 f2 f3 -------------- 1 あ a 10 2 あ a 10 3 あ a 20 4 あ b 11 5 あ b 12    6 い c 20 7 い c 20 8 い d 25 グループでf3が最小だったらそのままの数字を それ以外だったら、一つ前のデータをそのままもってきたいのですが、クエリでできますか?

  • 【エクセル】重複データ抽出時にうまくいかない

    エクセル2003で、[データ]→[フィルタ]→[フィルタオプションの設定]で下記のように 設定して重複データを省きました、 ・「指定した範囲」にチェック ・「リスト範囲」に$A$1:$A$13を入力。 ・「抽出範囲」に$B$1を入力 ・「重複するレコードは無視する」にチェック の条件で実行すると。 [元データ]  A列 1 a 2 a 3 b 4 b 5 c 6 c 7 c 8 d 9 d 10 d 11 e 12 e 13 e が [フィルタ実行後]  A列  B列 1 a  a 2 a  a 3 b  b 4 b  c 5 c  d 6 c  e 7 c 8 d 9 d 10 d 11 e 12 e 13 e の様にB列でaが2つ出てしまいます。 なにが原因でしょうか?

  • エクセルでのフラグデータの作成

    エクセルのデータで 顧客ID |購買商品 A | a A | b A | c B | a B | d C | b C | d C | e … | … こというようなデータを a │ b │ c │ d │ e A │ 1 │ 1 │ 1 │ 0 │ 0 B │ 1 │ 0 │ 0 │ 1 │ 0 C │ 0 │ 1 │ 0 │ 1 │ 1 … というように変換することはできるでしょうか? もしできるならその方法を教えてください!

  • エクセルでのデータの並べ替えについて

    質問があります。下記のように並んでいるデータがあるとします。   前年   今年 a 10 b 20 d 30 a 40 e 50 c 30 c 40 f 35 g 55 これを、  前年 今年 a 10 40 b    20 c 40 30 d 30 e 50 f    35 g 55 という様に並べ替える方法を教えてください。(データは多数あります。)

  • perl で mailto: リンク

    perl で書かれた CGI のソースに、$vout 変数内に a タグで mailto: のリンクが書いてあり、クライアントが リンクを踏むと、メーラーが立ち上がるようになっています。 が、mailto: に subject と body を含めて、かつ body には改行を含めたいのですが、どうしてもエラーになってしまいます。 以下を含める場合、どのように書けばよいのでしょうか ? <持込に関して> ← subject ↓本文 @お名前[改行] @ご住所[改行] @お電話番号[改行] <問い合わせ内容詳細> ちなみに URLエンコードで <a href="mailto:yourname@yourhost.yourdomain?subject=%8E%9D%8D%9E%82%C9%8A%D6%82%B5%82%C4&body=%40%82%A8%96%BC%91O%5B%89%FC%8Ds%5D%0D%0A%40%82%B2%8FZ%8F%8A%5B%89%FC%8Ds%5D%0D%0A%40%82%A8%93d%98b%94%D4%8D%86%5B%89%FC%8Ds%5D%0D%0A%3C%96%E2%82%A2%8D%87%82%ED%82%B9%93%E0%97e%8F%DA%8D%D7%3E"></a> としてもサーバエラーになってしまいます。 subjectやbody をつけなければ動くのですが、どこがいけないんでしょうか ? ソースは ShiftJISになっています。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ACCESSでの結合プロパティについて

    ACCESSでの結合プロパティは、3つあって、1つ目は2つのテーブルに共通するものだけを引っ張ってくる。 2つ目は片方の全部と、もう1方では、共通するものだけ。3つ目は、2つ目の逆。 両方のレコードを持ってくるということは出来ないのでしょうか? 例:「data」で結合して、表示は、今回厳密には定義しません。 テーブル1 ID data 1 a 2 b 3 c 4 d 5 e 6 f テーブルB ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j 結合プロパティ(1)では、 ID data 4 d 5 e 6 f 結合プロパティ(2)では、 ID data 1 a 2 b 3 c 4 d 5 e 6 f 結合プロパティ(3)では、 ID data 4 d 5 e 6 f 7 g 8 h 9 I 10 j となると思います。 今やりたいことは、全部持ってくることです。 ID data 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 I 10 j よろしくお願い致します。

  • perlでアドバイスをお願いします。

    あるテキストファイルが以下の内容で記述されているとします。 a   file1 a   file1 a   file1 b   file1 b   file1 b   file1 c   file2 c   file2 d   file2 d   file2 e   file2 e   file2 f   file3 f   file3 f   file3 上記のように列が二つあるテキストファイルについて、 2列目のfile名が1列目のどの値とひもづいて いるかを処理するperlプログラムを作ることを考えます。 出来上がったperlによって上記テキストファイルを処理した結果は、 file1は aとb file2は cとdとe file3は f とひもづいていることが分かる ということにしたいです。 これをperlプログラムで書くとき、条件として 一行一行を読みとるとき if ( $_ =~ /(\S+)\s+(\S+)/ ){ を使っています。 そのため$1と$2に現在行の1列目,2列目が与えられた後、 ハッシュと配列を組み合わせて考えた場合どのようにすれば いいのでしょうか。 また仮にテキストファイルの続きが存在し、 1列目がg 、2列目がfile1 の行があるとき 2列目で既に出てきた同じfile名はエラーとすることも考えた 場合どう記述するのか合わせてお願い致します。 長くなってしまい申し訳ないのですが、 ご指導ご鞭撻宜しくお願い致します。

  • 【Excel】該当データ表示方法について

    Excelの表で、(A)列にデータ名、(B)列にデータ値が入力されているとして、 1.(C)列に(B)列のデータ値の種類を昇順で表示、 2.(D)列に(C)列のデータ値を持つ(A)列の文字を表示、 3.(E)列に(D)列のデータ種類の数を表示 という3つの内容を実現したいのですが、(1つでも) ご存知の方、教えて下さい。よろしくお願いしますm(__)m 【イメージ】   | (A) (B) (C)  (D)   (E) ――――――――――――――――――― (1)| A 10 10 A、D、E   3 (2)| B 20 20 B、G    2 (3)| C 30 30 C、F    2 (4)| D 10 (5)| E 10 (6)| F 30 (7)| G 20

専門家に質問してみよう