perlの構文エラーの原因は?

このQ&Aのポイント
  • perlの構文エラーが発生しています。詳細なエラーの原因を教えてください。
  • perlの構文に問題があります。正しい構文に修正する方法を教えてください。
  • perlの構文に間違いがあります。エラーメッセージを確認して問題の箇所を特定する方法を教えてください。
回答を見る
  • ベストアンサー

perlの構文がおかしいようです。

構文は以下の通りです。IF文のところがおかしいようですが、どこに間違いがあるのか教えていただけないでしょうか。 sub ippack { my ($a, $b, $c, $d) = @_; return ($a << 24) | ($b << 16) | ($c << 8) | $d; } sub ipunpack() { my ($n) = @_; return (($n>>24)&0xFF,($n>>16)&0xFF,($n>>8)&0xFF,$n&0xFF); } open (IN,"<useIP.txt") while(my $input = <IN>) { if ($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/){; my $n = &ippack($1,$2,$3,$4); my $m = &ippack($5,$6,$7,$8); $n = $n & $m; $m = ~$m & 0xFFFFFFFF; for(my $i = 0; $i <= $m; $i++) { print join(".", &ipunpack($n+$i))."\n "; } } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ print "$input\n"; } print "\n"; }

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

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

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

> } if-else($input =~ /([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)/);{ if-else ってなに?

関連するQ&A

  • Perlで画像のサイズ取得する方法

    URL指定で画像サイズの取得が出来ません。 何方かご教授お願いします。 悲しいことにレンタルサーバーにはimage::magickがインストールされていないので使えません。 ----perl---- #!/usr/bin/perl $FileName = "http://i.yimg.jp/images/main11.gif"; ( $format, $width, $height ) = &GetImageSize( $FileName ); print "Content-type: text/html\n\n"; print <<"HTML"; <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <BR> $width x $height <br> <IMG src="$FileName" border="0"> HTML sub GetImageSize{ my ( $IMG, $in ) = @_; my ( %SHT, %LNG ); my ( $buf, $mark, $type, $f_size, $width, $height ); my ( $TAG, $TYPE, $COUNT, $V_OFFSET, $PK, $ENTRY, $Exif_IFD ); my ( $endian, $dummy1, $dummy2, $dummy, $EOI, $APP1, $length, $exif ); my ( $format, $offset, $line, $CODE, $jfif ); my @TGA; my $ntag; # 定数 $mark = pack("C", 0xff); %SHT = ( 'II' => 'v', 'MM' => 'n' ); %LNG = ( 'II' => 'V', 'MM' => 'N' ); # 初期値 $endian = ''; $width = -1; $height = -1; $format = ''; $Exif_IFD = -1; if( $in eq '' ){ $in = 'IMG'; } open( $in, $IMG ) || return( '', -1, -1 ); binmode($in); seek( $in, 0, 0 ); read( $in, $buf, 6 ); # GIF 形式 if($buf =~ /^GIF/i){ $format = 'GIF'; read( $in, $buf, 2 ); $width = unpack("v*", $buf); read( $in, $buf, 2); $height = unpack("v*", $buf); } close( $in ); return( $format, $width, $height ); } exit;

    • ベストアンサー
    • Perl
  • プログラムについて(UNIX)

    以下のプログラムを部分的で結構ですので 解説していただけないでしょうか? 打ち込んだ数字を10進法に変換して、 その後どうなっているのかがよく分かりません。 よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define N 127 #define M 121 #define LENGTH 45539 int C[N] ; int d[LENGTH/N]; int b[LENGTH/N]; float r[LENGTH]; char message[LENGTH/N/7]; int PNread(int); int PXread(void); int main() { int i, m; /* Insert the process to input the user No. m here. */ printf("Input the user No. : "); scanf("%d", &m); if (m < 0 || m > M) { printf("You input a wrong user No.\n"); exit(-1); } printf("\nThe user No. m is %d. \n", m); /* Read the spread code for user No. m from data file */ if(PNread(m) == -1) exit(-1); /* Display the spread code. */ /* Here is an example to display the first 10 numbers */ if(PXread()== -1) exit(-1); int t,k; float hatD[LENGTH/N]; for(t=0; t < LENGTH/N; t++){ hatD[t]=0; for(k = t*N; k < (t+1)*N; k++) hatD[t]+= ((float)r[k]*C[k%N])/((float)N); d[t] = (hatD[t] >= 0)?1:-1; /*?はif文の省略形である*/ } for(t = 0; t < LENGTH/N; t++) b[t] = (d[t] >= 0) ? 0 : 1; /* 文字に変換する */ for(i = 0; i < LENGTH/N; i += 7) message[i/7] = b[i]*64 + b[i+1]*32 + b[i+2]*16 + b[i+3]*8 + b[i+4]*4 + b[i+5]*2 + b[i+6]; /* メッセージの表示 */ printf("Message:\n%s\n", message); return 0; } /* Function of spread code reading */ int PNread(int m) { FILE *in; /* Verify the data file */ if ((in = fopen("PN7.dat", "r"))== NULL) { /* Error message */ printf("Error: Cannot find the data file. \n"); return -1; } if(m>1) /* Set the file pointer to the m-th user's spread code */ fseek(in,(m-1)*N*sizeof(int),SEEK_SET); /* Read the spread code to array C */ fread(C,sizeof(int),N,in); fclose(in); return 1; } int PXread(void) { FILE *in; int count; float rtemp; if((in = fopen("Rx7_51.dat", "r"))== NULL) { printf("Error; Cannot find the date file. \n"); return -1; } for(count = 0; count < LENGTH; count++){ fscanf(in, "%f", &rtemp); r[count] = rtemp; } fclose(in); return 1; }

  • Perl 強制終了の回避について

    Attempt to free unreferenced scalar とは? http://oshiete1.goo.ne.jp/qa4237453.html の続きです。 とりあえず、下に現状で分かる最小限の再現性があるスクリプトを 書いておきます。 print &opentmpl("body"); print &opentmpl('footer'); # これがない場合はエラーにならない sub opentmpl { my $fn = shift; my $VAR = shift || {}; my $file = &{$fn}(); &regex(\$file, $VAR, '__([A-Z_\d]+?(\[\d+?\])?)__', ['$VAR->{"%s"}', '$1']); &regex(\$file, $VAR, '&{(.+?)}&', ['%s', '$1']); return $file; return undef; } sub regex { my $str = shift; my $VAR = shift; my $pattern = shift; my $replace = shift; $$str =~ s/((([^\n]*?)$pattern(?=.*))+(\n?))/&func($1, $VAR, $pattern, @$replace)/egs; return; } sub func { my $str = shift; my $VAR = shift; my $pattern = shift; my $buf = shift; $str =~ s/$pattern/$@ = ''; $_ = eval(sprintf($buf, map { eval($_); } @_)); $@ ? $@ : $_/egs; if($str =~ /^\s*\n?$/s) { return; } return $str; } sub body { print "Content-type: text/plain; charset=shift_jis\n\n"; return <<'HTML'; &{ return &opentmpl('table', {'TEST' => 'test'}); }& HTML } sub table { return <<'HTML'; __TEST__ HTML } sub footer { return <<'HTML'; test HTML } 調べてみた限りではActivePerl for Win32以外のPerlでも同様のよう です。 (Linux上でも同様のようです) 5.8.8ではエラーになりますが、5.10.xではエラーにならないようです。 (同じ環境において5.8.8では再現し、5.10.0にバージョンアップすると 再現しなくなり、再度5.8.8にバージョンダウンすると再現します) 本番機の環境が5.8.8で勝手にバージョンアップなどができないため、 5.8.8で正常に動作するようにするにはどうしたらよいでしょうか。 結構、無駄も多いと思いますので全く同じ動作をしながらより効率の いい書き方ができたらいいなと思います。 (なお、実際には使用しているけど上記では使用していない部分が 含まれていてその部分がない場合もエラーにならないようです)

    • ベストアンサー
    • Perl
  • C言語で分からないところがあるのですが……

    C言語で分からないところがあるのですが…… すみません。C言語の課題で分からないところがあり、質問しに来ました。 ユーザから数を受けて、そこまでのフィボナッチ数列を表示させるというプログラムです。 下のソースコード(でいいんですよね?)は正しいやつです。 for文を使って、繰り返しの作業を行うことに成功しましたが、doとwhileに書き換える作業がうまくできません。 どなたか助けてください。 #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT the number. : "); scanf("%d",&n); for(i=1; i<=n; i++){ printf("F%d = %d\n",i, fib(i)); } }

  • C言語で分からない点があるのですが……

    C言語で分からない点があるのですが…… こんにちは。C言語を学んでいて、詰まったので宜しければ回答いただけると嬉しいです。 フィボナッチ数列に関するプログラミングです。 ユーザから数字を受け取ります。(第何項か) そこまでの数字を表示するというプログラムです。 n=3なら F1=1 F2=1 F3=2 という具合です。 しかし、実行した結果が添付した図の通りで、途中の項がすっ飛ばされていました。 どうすればいいんでしたっけ? 宜しければご助力ください!! #include<stdio.h> fib(int n) { if(n == 1)return(1); else{ if(n == 2) return (1); else return fib(n-1) + fib(n-2); } } main() { int n, i ; printf("INPUT number.: "); scanf("%d",&n); for(i=2; i<=n; i++){ printf("F%d = %d\n",n, fib(n)); } }

  • SD(Zスコア)をパーセンタイルに変換

    SD値(Zスコア)を(上からの)片側パーセンタイルに変換するコードをコピッてきて perlでプログラムしました(下記)。 しかしSDが極端な値をとると、うまくいきません。 そもそもSDとパーセンタイルの数学的関係については理解しておりません。 このコードのどこを書き直せばご指導いただければ幸いです。 sub erf { my $x = $_[0]; my $return_value; if ( $x ne "" ){ my $m = 1.00; my $s = 1.00; my $sum = $x * 1.0; for ( my $i = 1; $i < 50; $i++ ){ $m *= $i; $s *= -1; $sum += ($s * $x**(2.00*$i + 1.0) )/($m * (2.0*$i + 1.0)); } $return_value = 2 * $sum/ sqrt(3.14159265358979); } else { print "erf input error"; exit; } return ( $return_value ); } sub SD_to_Percentile { my $sd = $_[0]; my $return_value; if ( $sd ne "" ){ my $area = &erf( $sd / 1.41421356)/2; my $one_sided_percentile = 50+$area*100; $return_value = (100 - $one_sided_percentile); } else { print "SD illegal<br>"; exit; } return( $return_value ); }

  • Perl5で同時刻のデータを統合したい

    perl初心者です。 下記のような同時刻の2つのデータを1つのデータに統合させたいのですが うまく出来ず困っています。 どうかお知恵を貸していただけないでしょうか。 データは時刻(時:分:秒), 値1, 値2になっています。 test1.txtの同時刻の後ろにtest2.txtの値1と値2を入れ、 欠測値には-999を入れるプログラムを作っています。 厄介なのは、 開始時刻がtest1.txtよりtest2.txtが早い場合や 終了時刻がtest2.txtよりtest1.txtが遅い場合がある事です。 test1.txt 10:13:14, 3.1, 0.1 10:13:15, 6.1, 0.3 10:13:16, 8.7, 0.2 10:13:17, 12.8, 0.3 10:13:18, 13.4, 0.5 10:13:19, 15.2, 0.4 test2.txt 10:13:16, 32.5, 0.01 10:13:17, 33.1, 0.03 10:13:18, 36.2, 0.02 10:13:19, 34.3, 0.01 10:13:20, 33.8, 0.04 10:13:21, 32.6, 0.09 10:13:22, 32.1, 0.08 希望結果 test.txt 10:13:14, 3.1, 0.1, -999.0, -999.00 10:13:15, 6.1, 0.3, -999.0, -999.00 10:13:16, 8.7, 0.2, 32.5, 0.01 10:13:17, 12.8, 0.3, 33.1, 0.03 10:13:18, 13.4, 0.5, 36.2, 0.02 10:13:19, 15.2, 0.4, 34.3, 0.01 10:13:20, -999.0, -999.0, 33.8, 0.04 10:13:21, -999.0, -999.0, 32.6, 0.09 10:13:22, -999.0, -999.0, 32.1, 0.08 以下が自分が作成したプログラムです。 open IN_1, "test1.txt"; open IN_2, "test2.txt"; open OUT, ">test.txt"; while ($input1 = <IN_1>) { # test1.txtの処理 chomp $input1; # 改行削除 @input1 = split(/,/, $input1); # カンマ区切り $n = $n + 1; $time1[$n] = @input1[0]; @time1 = split(/:/, $time1[$n]); # 時刻をコロン区切り @hours1[$n] = @time_l[0]; @min1[$n] = @time_l[1]; @sec1[$n] = @time_l[2]; @a[$n] = @input1[1]; # 値1 @b[$n] = @input1[2]; # 値2 } while ($input2 = <IN_2>) { # test2.txtの処理 chomp $input2; @input2 = split(/,/, $input2); $m = $m + 1; $time2[$m] = @input2[0]; @time2 = split(/:/, $time2[$m]); @hours2[$m] = @time2[0]; @min2[$m] = @time2[1]; @sec2[$m] = @time2[2]; @c[$m] = @input2[1]; # 値1 @d[$m] = @input2[2]; # 値2 } # 開始と終了時刻の計算 # test1.txtの時刻 $hours1_S = @hours1[1]; # 開始時 $hours1_E = @hours1[$n]; # 終了時 $min1_S = @min1[1]; # 開始分 $min1_E = @min1[$n]; # 終了分 $sec1_S = @sec1[1]; # 開始秒 $sec1_E = @sec1[$n]; # 終了秒 $time1_S = $hours1_S*3600 + $min1_S*60 + $sec1_S; # 開始時刻を秒に計算 $time1_E = $hours1_E*3600 + $min1_E*60 + $sec1_E; # 終了時刻を秒に計算 # test2.txtの時刻 $hours2_S = @hours2[1]; $hours2_E = @hours2[$m]; $min2_S = @min2[1]; $min2_E = @min2[$m]; $sec2_S = @sec2[1]; $sec2_E = @sec2[$m]; $time2_S = $hours2_S*3600 + $min2_S*60 + $sec2_S; $time2_E = $hours2_E*3600 + $min2_E*60 + $sec2_E; if($time1_S <= $time2_S){ # 開始時刻の比較 $starttime = $time1_S; }else{ $starttime = $time2_S; } if($time1_E <= $time2_E){ # 終了時刻の比較 $endtime = $time2_E; }else{ $endtime = $time1_E; } $j = $endtime - $starttime; # 全体のデータ個数 # test.txtへ出力 for($i=1; $i<=$j; $i++){ if(@hours1[$i] != @hours2[$i] && @min1[$i] != @min2[$i] && @sec1[$i] != @sec2[$i]){ printf OUT "%2d:%2d:%2d %5.1f% 5.1f %5.1f %7.2f\n", @hours1[$i], @min1[$i], @sec1[$i], @a[$i], @b[$i], -999, -999; }elsif(@hours1[$i] == @hours2[$i] && @min1[$i] == @min2[$i] && @sec1[$i] == @sec2[$i]){ printf OUT "%2d:%2d:%2d %5.1f% 5.1f %5.1f %7.2f\n", @hours1[$i], @min1[$i], @sec1[$i], @a[$i], @b[$i], @c[$i], @d[$i]; }else{ printf OUT "%2d:%2d:%2d %5.1f% 5.1f %5.1f %7.2f\n", @hours2[$i], @min2[$i], @sec2[$i], -999@, -999, @c[$i], @d[$i]; } } close IN_1; close IN_1; close OUT; とても汚いプログラムになってしまいました… このプログラム以外でも構いませんのでどうかよろしくお願い致します。

    • ベストアンサー
    • Perl
  • Perl 禁止語句

    テキストの中に禁止語句一覧があります。 それと一致した場合、エラーを返すのですが、 現在のコードですと、 完全一致で、これを部分一致にする 方法を教えてください。 またコードの指摘があればよろしくお願いいたします! ◆ngword.txt◆ あい いう うえ えお ・ ・ ・ 1000行ほど(もっとあるかもしれません) ◆test.pl◆「UTF-8」 #/usr/bin/perl use Encode; my $Name = "え"; $Name = encode('cp932', decode('UTF-8', $Name)); open my $fh, '<', 'ngword.txt'; chomp(@ngword = <$fh>); if(&ban($Name, \@ngword)) { print "error\n"; } sub ban { my $body = shift; my $word = shift; $body =~ s/(\x0d\x0a|\x0a|\x0d|\n|\s|\x81\x41|\xff)//g; return map { $body =~ /$_/m } @$word; }

    • ベストアンサー
    • Perl
  • &$_の意味がわからない

    Sub MkCounter{ my $counter=0; my $inc=sub{++$counter;}; my $dec=sub{--$counter;}; return($inc,$dec); } ($i,$d)=&MkCounter; @results=map &$_,($i,$i,$i,$d,$d); print join(', ', @results), "\n"; 実行結果は 1,2,3,2,1 となるんですが、@results=map &$_,($i,$i,$i,$d,$d);の部分がよくわからないんです。&$_は何を意味しているんでしょうか?

    • ベストアンサー
    • 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"; }

専門家に質問してみよう