元号判定:Perlでの元号判定方法とエラーハンドリングについて

このQ&Aのポイント
  • Perl初心者の方が、Perlを使用して「元号を判定する」方法について質問されています。質問者はif-elsif文を使用して試みましたが、うまく動作しないようです。また、明治以前の年号を入力した場合にエラーメッセージを表示する方法にもついて知りたいとのことです。
  • 質問者は、年号を入力すると「明治(meizi)X年」と表示させたいと考えています。そのために、if-elsif文を使用し、年号に応じた表示を行っています。
  • しかし、年号の範囲を条件式で指定する際に誤りがあるようです。また、同じ年号が重複して入力された場合に、例えば「meizi45nen/taisyou1nen」と表示させる方法についてもわからないとのことです。質問者はどこを修正すればよいのか、アドバイスを求めています。
回答を見る
  • ベストアンサー

元号判定:Perl初心者です

Perlにおいて、「元号を判定させる」ようにしたく、if-elsif文章を書いてみたのですが、上手くいきません。 (そもそも起動してくれないです・・・文章も合っているかわからないのですが。。) 年号を入力させて、 (meizi) X nenと表示させたいのです。 あと、明治以前の数字を入れたら、エラーと出すようにする。 被っている年号、例えば1912年と入れたら、meizi45nen/taisyou1nen ともしたいのですが、これらはどう入れたらいいのか分からなかったです。 どこを直せばいいのか、一部でもいいので、教えていただけると嬉しいです。 chomp($year = <stdin>); if($year<=1912 and $year>=1868){ $A=$year-1867 print("meizi $A nen \n"); } elsif($year<=1926 and $year>=1912){ $B=$year-1911 print("taisyou $B nen \n"); } elsif($year<=1989 and $year>=1926){ $C=$year-1925 print("syouwa $C nen \n"); } elsif($year>=1989){ $D=$year-1988 print("heisei $D nen \n"); }

  • Perl
  • 回答数4
  • ありがとう数0

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

とりあえず「if文の書き方」を学び直すべし. あと, 9行目のエラーは「1行目にエラーが出ないこと」をふまえてじっくり見直すとわかるかもよ.

その他の回答 (3)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

どんなエラーが出たか貼り付けないと、高確率で無視されますよ。 ダブルクリックで「起動」させているのなら、 コマンドプロンプトにドラッグ&ドロップして実行しないと エラーの確認も出来ませんけどね。 ちなみに原因はセミコロン抜けです。

TKmark
質問者

補足

補足(1) セミコロン抜けのご指摘ありがとうございます。 それで少しは先に進みました。 ただ、それでもうまくいかなかったところがありましたので、(質問の中に補足はできないみたいなので)他の方の補足にて改良したものを入力いたしましたので、再度助言をいただけると嬉しいです。

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

※ 内容はチェックしていません。 起動しないのは、Perlの基本的な文法を間違えているからです。 syntax error at XXXXX.pl line LLL, near "print" だいたいこんなエラーじゃないですか? 「syntax error」 文法の間違いです。 「line LLL」と行数が出ています。 この行自体が問題とは限らないので、その周辺をよく見ましょう。 まずはエラーメッセージを読みましょう。 プロフェッショナルでも、プログラムの修正は、そこから始めます。

TKmark
質問者

補足

補足(2) ありがとうございます。 エラーは syntax error at ファイル名 line8,near ") ; " Unrecognized character |xEF at ファイル名 line9 ※|xEFはバックスラッシュです。 以下に、自分なりに修正したものを補足させていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「そもそも起動してくれないです」とはどういうことでしょうか? 何かメッセージは出ませんでしたか?

TKmark
質問者

補足

補足(3) ありがとうございます。 手直しをした上で、以下のような文章になりました。エラーは(2)の通りです。 なお、手直しをした箇所は、セミコロンの補足と、while文にて1900年以前を入力させないようにした点です。 while(1){ print ("seireki(1900~):"); $year=<stdin>; last if($year>=1900); } if($year<=1912 and $year>=1868); { $A=$year-1867; print("meizi $A nen \n:"); } elsif($year<=1926 and $year>=1912);  { $B=$year-1911; print("taisyou $B nen \n:"); } elsif($year<=1989 and $year>=1926); { $C=$year-1925; print("syouwa $C nen \n:"); } elsif($year>=1989); { $D=$year-1988; print("heisei $D nen \n:"); }

関連するQ&A

  • 初心者です。perlを使用して辞書プログラムを実装する機能を作りたいのですが。

    perlを使用して辞書プログラムを実装する機能を作りたいのですが、メインプログラムを作ってからその先をどうすればいいのかわかりません。 print"1.新規作成 2.単語の登録 3.単語の検索 4.辞書一覧 5.単語の削除 6.終了:\n"; $type =<STDIN>; chomp($type); if ($type == 1) { new create; } elsif ($type == 2) { entry; } elsif ($type == 3) { search; } elsif ($type == 4) { list; } elsif ($type == 5) { deletion; } elsif ($type == 6) { exit(0); } この後はどのように作っていったらいいのでしょうか、教えて下さい。

    • ベストアンサー
    • Perl
  • perlの制御文について

    汚くて申し訳ありません。 以下のようなperlのプログラムを組んだのですが制御文が思い通りに動きません。 比較対象の数字の先頭の0を取れば正常に動くのですがどうしても0をはずすことはできないのです。 いろいろ試してみたのですがどうしてもうまきかないので知恵を貸してください。 $input = <STDIN>; if($input > 0130){ print "A\n"; } elsif(($input > 0120)&&($input < 0130)){ print "B\n"; } else{ print "C\n"; }

  • perl 初心者です。 わかりやすくお願いします。

    Perlを始めたのですが、本や色いろんなサイトを見てもよく分かりません。 Aと言うデータを読み込んで最大最小・平均・標準偏差を求めたいです。 (1)どこが間違っているのか1部づつでもいいので詳しく教えてください。 (2)一つ一つの意味がちゃんとはつかめていないと感じるので流れを教えてください。 #!/usr/bin/perl # 12345 STDIN use strict; use warnings; open ( FILEHANDLE , " < A " ) ; my @Str=<STDIN>; foreach my $Row (@Str ){ print $Row; } my $Minimum=$ARGV[0]; my $Maximum=$Minimum; my $Sum=$Minimum; my $temp=0; my $i=1; while ( $i < $Num_arg){ $temp=$ARGV[$i]; if ( $Minimum > $temp ) { $Minimum = $temp; }elsif ( $Maximum < $temp ){ $Maximum = $temp; } $Sum = $Sum + $temp; $i++; } my $Average = $Sum / $Num_arg; my $w = foreach my $w(0..$#Numbers){ ($Num_arg - $Average) ** / Num_arg; } my $Standarddivitation = sqrt ($w); print "Average value = $Average \n"; print "Maximum Value = $Maximum \n"; print "Minimum Value = $Minimum \n"; print "Standard devitation = $Standarddevitation;

  • if プログラムソース

    このプログラムソースでやりたいことは、 東海と入力すると 地方だと 東海は900円になります。 と表示させたいのですが、 うまく表示されません。 分かる方いましたら、教えてください。 教えて頂けると、助かります。 よろしくお願いします。 以下、プログラムソースです。 print"愛知県から小包の地方を入力してください。\n"; chomp($t=<>); if ( $1=="関東,信越,近畿,東海,北陸") { print"$t地方だと \n"; } elsif ( $1=="東北,中国,四国" ) { print"$t地方だと \n"; } elsif ( $1=="九州") { print"$t地方だと \n"; } elsif ( $1=="北海道") { print"$t地方だと \n"; } elsif ( $1=="沖縄" ) { print"$t地方だと \n"; } if ( $1 == 60 ){ print"$1は700円になります。\n"; } elsif ( $1==80) { print"$1は900円になります。\n"; } elsif ( $1==100 ) { print"$1は1,100円になります。\n"; } elsif ( $1==120 ) { print"$1は1,300円になります。\n"; } elsif ( $1== 140 ) { print"$1は1,500円になります。\n"; } elsif ( $1== 160 ) { print"$1は1,700円になります。\n"; }else { print"$1は1,900円になります。\n"; }

    • ベストアンサー
    • Perl
  • 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のプログラミングについて

    Perlのプログラミングでつまづきました。 # ファイルから指定文字列を含む行を収集する # 入力ファイルのオープンと読み込み print( "入力ファイル名?" ); $n = <STDIN>; chomp( $n ); open( FIN, "<$n" ) or die "入力ファイルオープンエラー: $!\n"; $n = @a = <FIN>; close( FIN ); print( "$n 行読み込みました\n" ); # 行の収集 print( "検索文字列?" ); $x = <STDIN>; chomp( $x ); $ptn = $x; #指定の文字列 $x = @b = grep( /$ptn/, @a ); print( "$x 行見つかりました\n" ); # 出力ファイルのオープンと書き出し print( "出力ファイル名?" ); $y = <STDIN>; chomp( $y ); open( FOUT, ">$y" ) or die "出力ファイルオープンエラー: $!\n"; print FOUT ( $ptn, "\n" ); print FOUT ( $x, "\n" ); print FOUT ( @b ); close( FOUT ); というプログラムで実行すると C:\My Perl\pl>perl プログラムの実行.pl 入力ファイル名?sample1.txt 168 行読み込みました 検索文字列?k 45 行見つかりました 出力ファイル名?out3-24.txt 続行するには何かキーを押してください . . . となり出力ファイルの中身が表示されません。 どこを間違えているのかご指摘いただけないでしょうか?

  • Perlによるディレクトリ内の連続的な大量データ処理

    Perlのテキスト処理に関する質問です.やりたいことはあるディレクトリ内に10000個ほどの(1)のようなテキストデータがあります.ここで私は(2)のプログラムを作成しました.しかしながら,このプログラムだと10000個あるテキストデータの一つしか処理できません.この処理内容をディレクトリ全体に適用させる方法はありますでしょうか?File::Find::Ruleなどがネット上にあったので使おうと努力しましたができませんでした.どなたかよろしくお願いします. (1)  2020 01 01 00 109.18970 18.36816 -2.317 -2.459 292.712 0.013 91.276 30.618 292.712 0.013 -2.317 -2.459 998.793 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 2020 01 01 00 109.54297 18.39178 -2.702 -2.652 292.653 0.013 90.044 30.676  292.653 0.013 -2.702 -2.652 993.902 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 ・ ・ ・ ・ (2) use warnings; open INFILE, '<', '2020-01-01_00.txt' or die "file open error: $!"; while( <INFILE> ){ chomp if( /\n$/ ); $Year = substr($_,0,4); chomp if( /\n$/ ); $Month = substr($_,5,2); chomp if( /\n$/ ); $Day = substr($_,8,2); chomp if( /\n$/ ); $Time = substr($_,11,2); chomp if( /\n$/ ); $Lon = substr($_,16,9); chomp if( /\n$/ ); $Lat = substr($_,29,8); chomp if( /\n$/ ); $Temp = substr($_,57,7); chomp if( /\n$/ ); $Hum = substr($_,76,6); chomp if( /\n$/ ); $Ozone = substr($_,85,6); chomp if( /\n$/ ); $Rad = substr($_,140,5); $data = $Year. "-".$Month."-".$Day." ".$Time." ".$Lon." ".$Lat." ".$Ozone." ".$Rad." ".$Hum." ".$Temp."\n"; open($data, ">", "data.txt") or die("error :$!"); } # ファイルを閉じる close INFILE; exit;  

  • perl

    授業でperlをやっていて課題がでてるのですが、 よく分かりません。 200以上300未満の数字か否かを判断する物を作りたいです。 が、300以上だと反応はないのですが200未満でも反応があります。 どこが違うのか教えてください 2つあります。 (1) my $a= 118; if($a < 200 ){ print "" } elsif($a => 300 ){ print "" } else { print "OK.\n"; } (2) my $x =111; if ($x ge 200 && $x lt 300){ print "OK.\n"; }

  • perlの「until」ループ文

    こんにちは。以下のループ文ですが、 --- print "初期値を入力してください:\n"; $number = <STDIN>; chomp($number); until ($number > 16) { print "数値:$number\n"; $number += $number; } --- 実行画面で「2」を入力すると、 数値:2 数値:4 数値:8 数値:16 のように出力されます。 なぜでしょうか?2,3,4....16じゃないの? どなたか、教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • [Perl] Pack関数について教えてください。

    こんにちは。 下記は、pack関数のサンプルスクリプトですが、 なんでそのような結果になるのか、よくわかりません。どなたか教えていただけますか。 print "文字列を入力してください:"; $string = <STDIN>; chomp ($string); $length = length($string); print "数値を入力してください:"; $number = <STDIN>; chomp ($number); # Do Pack! $packed = pack("A${length}i", $string, $number); print "パック文字列: $packed\n"; --- 結果 --- 文字列を入力してください:perl 数値を入力してください:100 パック文字列: perl

    • ベストアンサー
    • Perl

専門家に質問してみよう