• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:getc を使用した標準入力の取り扱いについて)

getc を使用した標準入力の取り扱いについて

このQ&Aのポイント
  • Perl スクリプトを使用して標準入力の取り扱いを行う際に問題が発生しています。
  • 行の文字数が多い場合に正常に処理がされず、期待する動作を得ることができません。
  • 具体的には、4行目の最後の文字が読み取れていないようです。

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

数字の 0 を読んだところで while(my $c = getc STDIN){ $strp .= $c; } のループから抜けてしまっています。ここの条件判定は while( defined (my $c = getc STDIN) ){ ... } でないといけません。

goo337972
質問者

お礼

t-okura さん 迅速なご回答ありがとうございます. FILEHANDLER / 標準入力 の最後に到達すると getc では未定義値が返ってくるということなのですね. 大変勉強になりました! 早速修正いたしまして,正常に稼動することを確認いたしました. 本当に助かりました.ありがとうございます.

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • HASH(0xほげほげ)

    出力が”HASH(0x197fa1c)”のような場合、どう解析してけばいいでしょうか? --------------------------------------------------------------------- #!C:\Perl\bin\perl.exe -w use strict; use Win32::OLE::OPC; #変数↓ my $items_stringP1 = "PLC0"; #OPCServer のデバイス名 my $items_stringP2 = "D"; #MELSECのデバイス名称 my $items_stringP3 = 0; #先頭アドレス my $maxcount = 1; #点数(5) #変数↑ my $opcintf = Win32::OLE::OPC->new('OPC.Automation', 'Takebishi.Dxp'); my $group = $opcintf->OPCGroups->Add('grp'); my $items = $group->OPCItems; my $items_stringP3_Min = $items_stringP3; my $count = 0; while ($count < $maxcount){ my $items_string=$items_stringP1.".".$items_stringP2.$items_stringP3; $items_stringP3 ++; $count ++; $items->AddItem($items_string, $opcintf); } print "********************"."\n"; print $items ."\n"; print "********************"."\n"; my $key; foreach ( keys %$items) { print "キー値 : $key\n"; } --------------------------------------------------------------------- 出力結果:↓ ******************** Win32::OLE::OPC::Items=HASH(0x197fa1c) ******************** Use of uninitialized value $key in concatenation (.) or string at C:\testPerl\OPC\OPC08.pl line 38. キー値 : Use of uninitialized value $key in concatenation (.) or string at C:\testPerl\OPC\OPC08.pl line 38. キー値 : Use of uninitialized value $key in concatenation (.) or string at C:\testPerl\OPC\OPC08.pl line 38. キー値 :

    • ベストアンサー
    • Perl
  • Perl CGI -入力フォーム-

    Perlを始めたばかりの初心者です。 Perlの中にフォームを入れたいのですが、エラーが出てしまいます。 現在は、ローカルで作動させています。 #! c:/perl/bin/perl print "Content-type: text/html\n\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; print "<p><input type="text" name="name"></p>\n"; print "</body>\n"; print "</html>"; 【print "<p><input type="text" name="name"></p>\n";】この記述がエラーの対象行となっています。 inputを使用する場合は他にも記述が必要なのでしょうか? 宜しくお願いします。

  • perl初心者です。宜しくお願い致します。

    ファイルの容量が大きく。perlを使用してデータの集計をしています。 "A"がきたらflag1をたてなさい。 "B"がきたらflag2をたてなさい。 "C"がきたらflag3をたてなさい。 これでAとBとCを抜き取ること&AからCまでの時間を取得したのですが、 Bの数のmaxの値だけを抜き取りたいのですが、Bがきたときの数をすべて 出力してしまいます。下記の文だと、Bが4回きたら、1,2,3,4と出力してしまいます。 それで4だけを出力したいのですがどのように書き換えたらようか教えて頂けますでしょうか。 '----------------------------------------------------------------------------- open (IN,"< $ARGV[0].txt") or die; open (OUT,"> $ARGV[0]_out.txt") or die; $flag =0; my $a, $b, $c; $count = 0; ####################################################### while($line =<IN>){ ($time,$data) = split(/\s+/,$line); if($data eq "A") { $flag=1; $a = $time; #print OUT $line; #print OUT "\n"; } elsif($data eq "B"){ $flag=2; $count++; $count == $data; print OUT ("$count\n") } #print OUT ("$count\n"); elsif($data eq "C"){ $flag=0; $count=0; $b = $time; $c = $b - $a; print OUT ("time $c\n") } } -------------------------------------------------------------------------------

  • 入力フォームを変数に格納

    Perlを始めたばかりの初心者です。 inputで入力した情報を変数として取得する方法は可能でしょうか? #! c:/perl/bin/perl print "Content-type: text/html\n\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; print "<p><input type=\"text\" name=\"name\"></p>\n"; print "</body>\n"; print "</html>"; 上記の入力フォームで、777と入力した場合、サーバーを経由しないで、777を変数に格納したいのですが、可能でしょうか? 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 配列内定義サブルーチン呼び出し

    下記のような配列内定義サブルーチン呼び出しを作成し動作を確認しました。 次にソース2行目の「no strict;」を「use script;」に変更すると Bareword "sub1" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub2" not allowed while "strict subs" in use at refsub_OK.pl line 4. Bareword "sub3" not allowed while "strict subs" in use at refsub_OK.pl line 4. Execution of refsub_OK.pl aborted due to compilation errors. とエラーになります。 プログラムはやはり「use script;」を記述したいのですが、「use script;」を記述 したままでエラーにならない方法がありましたらおしえてください。 perlのバージョンは5.12.3、OSはWindowsXP SP3です。 よろしくお願いします。 ---ソースここから--- #!perl no strict; use warnings; my @ary = ( ("input1.txt", "save1.txt", sub1), ("input2.txt", "save2.txt", sub2), ("input3.txt", "save3.txt", sub3), ); while (@ary) { my $p1 = shift(@ary); my $p2 = shift(@ary); my $sub = shift(@ary); print "p1=[$p1] p2=[$p2] sub=[$sub]\n"; &$sub("$p1", "$p2"); } sub sub1 { my ($p1, $p2) = @_; print "sub1: [$p1] [$p2]\n"; } sub sub2 { my ($p1, $p2) = @_; print "sub2: [$p1] [$p2]\n"; } sub sub3 { my ($p1, $p2) = @_; print "sub3: [$p1] [$p2]\n"; } ---ソースここまで---

    • ベストアンサー
    • Perl
  • ”ァー”が含まれている文字を置換すると文字化け

    OS:solaris8 perlのver:5.8.6 perlで、”ァー”が含まれている文字列に対し、 全角スペースを半角スペースに置換しようとすると 文字化けしてしまいます。 (”ぁー”でもどうようでした) ”ぃー”や”ぅー”、”ぁ”では 問題無いのですが…。 当方、perl初心者&文字コードに詳しくないため、 原因がよくわからないでいます。 どなたか原因をおわかりの方、 ご教授お願いいたします。 文字コードはEUCです。 以下はソースです my $line = "ファイヴァー スコープ 眼鏡"; $line =~ s/\t/ /g; # タブを半角スペースに置換する print '$line2='.$line."<br>\n"; $line =~ s/ / /g; # 全角スペースを半角スペースに置換する print '$line3='.$line."<br>\n"; #↑ここで文字化けしてしまいます $line =~ s/^\s+//; # 頭の空白を除く print '$line4='.$line."<br>\n"; $line =~ s/\s+$//; # 尻の空白を除く print '$line5='.$line."<br>\n";

    • ベストアンサー
    • Perl
  • ボタン押したときだけカウント

    http://www.sic.shibaura-it.ac.jp/~p00050/ でホームページを作っています。 左下のほうにあるリンクをクリックしたときだけ、カウントが上がるようにしたいんです。 でも表示更新したときにもカウントが上がってしまいます。 左下の部分のフレームはcount.cgiで、ソースは次のとおり。 #!/usr/local/bin/perl $data = 'data.dat'; open(F, "$data"); $count = <F>; close(F); $count++; open(F, ">$data"); print F "$count"; close(F); print "content-type:text/html\n\n"; print "<body bgcolor=black topmargin=0 leftmargin=0 bottommargin=0 rightmargin=0>\n"; print "<font color=lightgrey size=2><p align=center>ポイント <b>$count</b><br>\n"; print "このページに共感した人は、<br>好きなだけ<a href=count.cgi target=count>ここ</a>を押してください。"; print "</p></font></body>\n";

    • 締切済み
    • CGI
  • 検索結果テーブルの背景色を変更したい

    質問があります。 以下のようにperlで検索結果を表示させているのですが、<td>の背景色を変えたいのです。 ところがbgcolorタグを挿入するとinternal server error を起こしてしまいます。 以下のようなループのなかにbgcolorタグを挿入するのは無理なのでしょうか? perl初心者なもので単純な質問かもしれませんが教えていただけたらと思います。 よろしくお願いします。 ちなみに結果は正常に表示されます。 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array; print "<tr>\n"; print "<td>" . $ar[0] . "</td>\n"; print "<td>" . $ar[1] . "</td>\n"; print "<td>" . $ar[2] . "</td>\n"; print "<td>" . $ar[3] . "</td>\n"; print "<td>" . $ar[4] . "</td>\n"; print "<td>" . $ar[5] . "</td>\n"; print "</tr>\n"; }

    • ベストアンサー
    • Perl
  • <Perl>参照配列の出力に失敗する。

    <Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概   要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。

    • ベストアンサー
    • Perl
  • メタ文字の取り扱い

    カレントディレクトリにディレクトリaaa, bbb, cccが在り、さらにそれぞれのディレクトリに11_2とか9_20などのような1から20までの数字を_で2個つなげたディレクトリが在ります。そのディレクトリの中のファイル名を出力する以下のスクリプトgetname.plを作成したのですが、 Unrecognized escape \d passed through at ./getname.pl line 9. Unrecognized escape \d passed through at ./getname.pl line 9. というエラーが出ます。全く原因がわからないでいます。もしよろしければ解決法をご教示いただけないでしょうか。どうぞよろしくお願いします。 #!/usr/bin/perl use strict; use warnings; my @directory=qw/aaa bbb ccc/; foreach my $dname (@directory) { opendir(DIR,"./$dname/\d+_\d+"); my @dir=readdir(DIR); close(DIR); print join("\n",@dir); } print "\n";

    • ベストアンサー
    • Perl