(Perl)UTF-8で別ファイルに書き出したい

このQ&Aのポイント
  • 現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。
  • 複数ある別ファイルからデータ読み込む場合も、open(IN,":utf8","$別ファイル"); という形で、うまく読みこめています。
  • 書きこんだファイルを開けてみると、日本語が文字化けしています(アルファベットは大丈夫)
回答を見る
  • ベストアンサー

(Perl)UTF-8で別ファイルに書き出したい

現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。 冒頭で use utf8; を宣言した後、jcode関連の文は、全てコメントアウトしてきました。 複数ある別ファイルからデータ読み込む場合も、 open(IN,"<:utf8","$別ファイル"); という形で、"<:utf8"を挿入して、うまく読みこめています。 ただ、読み込んだ後、別ファイルへUTF-8で書きこむのが、どうしてもうまくいきません。 書きこんだ後、文字化けしてしまいます。 書きこんだファイルを開けてみると、日本語が文字化けしています(アルファベットは大丈夫) 以下のPerlをどのように改造すれば、文字コードをUTF-8で書き込みすることができるのでしょうか? どうかご教授、よろしくお願い致します。 m(_ _)m --------------------------------- #------------------------------------------------- # 編集内容登録処理 #------------------------------------------------- sub EDITREGIST { #全角英数字を半角に変換 $zenkaku = '0123456789'; $hankaku = '0123456789'; # Jcode::tr(\$in{'CLICK'}, $zenkaku , $hankaku ); $in{'attach_file'} = &AttachCheck($attach,$attach_name); #ファイルロック開始 if( $lockkey ne "0" ){ &LOCK; } if (!open(IN,"<:utf8","$linkdata_file")) { &ERROR( read_linkdata ); } @BASE = <IN>; close(IN); foreach $data (@BASE) { &LINKDATALIST; if( $in{'editnum'} eq $CNTNUM ){ if( $in{'attach_file'} eq '' ){ if( $in{'CHDEL'} eq '1' ){ $in{'attach_file'} = ''; unlink("$updir/$IMAGE"); }else{ $in{'attach_file'} = $IMAGE; } }else{ unlink("$updir/$IMAGE"); $in{'attach_file'} =~ s/$updir\///g; } $in{'LINKNAME'} =~ s/\,/&%/g; $in{'LINKURL'} =~ s/\,/&%/g; $in{'LINKURL'} =~ s/&amp;/\&/g; $in{'COMMENT'} =~ s/\,/&%/g; $in{'COMMENT'} =~ s/\<br \/\>/!%/g; if( $in{'CLICK'} eq "" ){ $in{'CLICK'} = 0; } $new_data = "$CNTNUM,$datenow,$DATE_LMT,$DATE_ESY,$in{'OPN'},$in{'NEWMARK'},$in{'CATEGORY'},$in{'LINKNAME'},$in{'HONORIFIC'},$in{'LINKURL'},$in{'COMMENT'},$in{'CLICK'},$in{'attach_file'},\n"; }else{ $new_data = "$CNTNUM,$DATE_LINKDATA,$DATE_LMT,$DATE_ESY,$OPN,$NEWMARK,$CATEGORY,$LINKNAME,$HONORIFIC,$LINKURL,$COMMENT,$CLICK,$IMAGE,\n"; } push( @TOTAL,$new_data ); } #実際にファイルに書き込む if( !open(OUT,">$linkdata_file") ){ &ERROR( read_linkdata ); } print OUT @TOTAL; close (OUT); #ファイルロック解除 if( $lockkey ne "0" ){ &UNLOCK; } &SendFinish2; }

  • mcse
  • お礼率55% (148/266)
  • Perl
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.4

stdio::getFormDataに対しての見識がないので適切な回答はできませんが、以下を試すとどうなるでしょうか? %in = (); stdio::getFormData(\%in,1,"sjis",1,",","$updir/"); を、 use CGI; %in = map decode_utf8($_), CGI->new->Vars; に変更。 これで文字化けが解消する可能性はありますが、stdio::getFormDataに詳しい人が回答してくれるかもしれませんので、質問はオープンのままにされたほうがいいと思います。

mcse
質問者

お礼

ryu_chanさま ご教示誠にありがとうございました! ご指摘の通り、修正したところ、文字化け直りました!!! m(_ _)m 感動しました!(^^) まるで魔法のような感じ驚いています。 かれこれ3日間くらい格闘してきましたが、問題が解決できてスッキリしました。 誠にありがとうございました!感謝致します。

mcse
質問者

補足

N60-BASIC様、Tacosan様、ryu_chan様、誠にありがとうございました。 各皆様のおかげで問題が解決ができまして、大変感謝しております。 今回は、ずばり直ったryu_chan様をベストアンサーとさせて頂きますので、どうぞご了承ください。 実は、もう1つだけ同じ文字化けの現象が起きていて、解決できない問題があります。(もう1つ質問を立てさせて頂ければと思います。 もし宜しければ、再度アドバイスを頂ければと思いますので、どうぞよろしくお願い致します。

その他の回答 (3)

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.3

No.2のTacosanさんが言及されてますが、以下で解決できるかもしれません。 use Encode; for my $value ( values %in ) { $value = decode_utf8 $value; }

mcse
質問者

お礼

ryu_chanさま ご回答ありがとうございました。 上記コードも試しましたが、文字化けは解消されませんでした(>_<)。 冒頭で以下のような宣言をしていますが、これが問題になっているのでしょうか? #------------------------------------------------- # 受け取ったデータの変換 #------------------------------------------------- %in = (); stdio::getFormData(\%in,1,"sjis",1,",","$updir/");

mcse
質問者

補足

もしくは、別ファイルで行っている以下のデコード処理が問題なのでしょうか? ※sjisの部分はコメントアウトしています。 #------------------------------------------------- # デコード処理 #------------------------------------------------- sub DECODE { if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name,$value) = split(/=/, $pair); $name2 = $name; $value2 = $value; $FORM2{$name} = $value; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #半角カナを全角に変換 # Jcode::h2z_sjis(*value); #文字コード変換 # Jcode::convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\n/!%/g; $value =~ s/\r//g; $value =~ s/\t//g; $value =~ s/\,/&%/g; $value =~ s/&nbsp;/ /g; #フォーム変数へ $in{$name} = $value; } }

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

%in の文字コードか? Encode::decode でなんとかなるかも....

mcse
質問者

お礼

ご回答ありがとうございました。 早速試してみましたが、ダメでした。

  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.1

惜しいところまで行ってますね。 if( !open(OUT,">$linkdata_file") ){ &ERROR( read_linkdata ); } を、Perl5の新機能である「3引数open」を使って if( !open(OUT,">:utf8", $linkdata_file) ){ &ERROR( read_linkdata ); } としてみたらどうでしょうか? use utf8; で書かれたスクリプト内文字列や、Encode.pm でデコードされた文字列は、内部utf8表現とでも言うべき特殊な文字列になっています。 この内部utf8表現の文字列は、そのまま標準出力やファイルに対してストリーム出力しようとすると、 Wide character in print at ... といった感じの警告が出てしまいます。 これを正常にUTF-8で出力するには、内部utf8表現をUTF-8バイトコード文字列に変換してやる必要があります(「内部表現」と言われる理由です)。 本来は出力したい文字列に対してEncode::encode()を明示的に使うのですが、使わなくても自動でやってくれるのが出力オープン時の「:utf8」指定になります。 この辺、仕組みをきちんと理解しようとすると非常にややこしい部分ではあるのですが、一見面倒に見えるこの仕組みのおかげで、文字化け等を気にせずに正規表現などを利用できるようになります。 正確には、内部utf8表現を使うことで「半角英数字以外の文字についてもPerlがすべての文字を1文字単位で扱ってくれるようになる」といったところでしょうか。 興味がありましたら「Perl utf8フラグ」あたりで検索してみるとよいかもしれません。 あと余談ですが、もし前回の私の回答がきっかけでPerl5を勉強してくださってるのだとしたら本当に頭が下がります。 以下のblog記事が「今どきのPerlスクリプト」を知る上で多少参考になるかもしれません。 [ サンプルコードによるPerl入門 - 現代的なPerlの記述方法一覧 ] http://d.hatena.ne.jp/perlcodesample/20091120/1246679588 ご参考まで。

mcse
質問者

お礼

N60-BASIC様 またご回答頂きましてありがとうございました。 m(_ _)m 詳細なご説明でとてもよく分かりました! 参考URLも大変参考になりました! アドバイス通り open(OUT,">:utf8", $linkdata_file) と記載してみました。 正常に動作はしましたが、残念ながら文字化けはまだ直りませんでした。 文字化け状況 → あいうえお  このPerlは、フォームに日本語等の文字入力して、実行ボタンを押すと $linkdata_file に、そのデータを書き込みます。 フォームに入力する時は、普通に日本語で表示されていますが、 どうやら、「実行ボタン」を押して、書き込んだ時に文字化けが発生しているようです。 そのため、$linkdata_fileに書き込まれたデータをフォーム上で再編集しようと$linkdata_fileから読み込んだ場合に、文字化けされた文字が反映されてしまうという状況になっています。 なお、ブラウザ上のフォーム自体は、文字コードがutf-8に既にセットされています。 linkdata_file内のデータを除くと、日本語のみが文字化けしていました。 もしかすると原因は、 $in{'LINKNAME'} =~ s/\,/&%/g; $in{'LINKURL'} =~ s/\,/&%/g; $in{'LINKURL'} =~ s/&amp;/\&/g; $in{'COMMENT'} =~ s/\,/&%/g; $in{'COMMENT'} =~ s/\<br \/\>/!%/g; の設定にあるのでしょうか? お手数をおかけいたしますが、ご教示お願いします。 m(_ _)m

関連するQ&A

  • cgiの投票回数制限設定について(Perl)

    投票cgiを作成していますが、以下のPerlでは、同一IPから1日1回の投票しかできません。 同一IPからの投票を1日連続5回まで許可する仕組みにしたいと考えています。(6回目以降は単にカウントされないだけで警告等は出さない) 以下のPerlをどのように改造すれば良いか具体的にアドバイスを頂けると大変助かります。 かなり専門的な内容で恐縮ですが、困っておりますので、何卒よろしくお願い致します。 m(_ _)m --------------------- # IPアドレスのチェック sub IpCheck { if (!-e $iplog) { &TimeLog; } $last = (localtime((stat($iplog))[9] + $jisa))[3]; $today = (localtime($nowtime))[3]; if ($last != $today) { unlink($iplog); &TimeLog; } open(TLOG,"<$iplog"); @IP = <TLOG>; close(TLOG); $l = 0; foreach (@IP) { $_ =~ s/\r|\n//g; if ($_ =~ /^$addr/) { &NoCnt; } elsif ($l == $#IP) { if (!open(RTIP,">>$iplog")) { &Error(4); } print RTIP "$addr\n"; close(RTIP); &CNTUP; } $l++; } } sub TimeLog { if (!open(TIME,">$iplog")) { &Error(5); } print TIME "$addr\n"; close(TIME); chmod(0666,$iplog); &CNTUP; } #------------------------------------------------- # クリックカウントアップ sub CNTUP { #ファイルロック開始 if( $lockkey ne '0' ){ &LOCK; } if (!open(IN,"$linkdata_file")) { &ERROR( read_linkdata ); } @BASE = <IN>; close(IN); foreach $data (@BASE) { #データリスト読込 &LINKDATALIST; if( $in{'targetno'} eq $CNTNUM ){ $COUNTERUP = $CLICK + 1; $targeturl = $LINKURL; $new_data = "$CNTNUM,$DATE_LINKDATA,$DATE_LMT,$DATE_ESY,$OPN,$NEWMARK,$CATEGORY,$LINKNAME,$HONORIFIC,$LINKURL,$COMMENT,$COUNTERUP,$IMAGE,\n"; }else{ $new_data = "$CNTNUM,$DATE_LINKDATA,$DATE_LMT,$DATE_ESY,$OPN,$NEWMARK,$CATEGORY,$LINKNAME,$HONORIFIC,$LINKURL,$COMMENT,$CLICK,$IMAGE,\n"; } #ファイルの最初にデータを保存する push( @TOTAL , $new_data ); } #実際にファイルに書き込む if (!open(NOTE,">$linkdata_file")) { &ERROR( read_linkdata ); } print NOTE @TOTAL; close(NOTE); #ファイルロック解除 if( $lockkey ne '0' ){ &UNLOCK; } #HTML出力 print "Location: $targeturl\n\n"; exit;

    • ベストアンサー
    • Perl
  • Perl cgiの文字化けを直したい (UTF8)

    現在、jcode.plを使用したShift JISで構成されていた Perlのcgi を UTF-8 に改造しています。 フォームに書き込んだPAGETITLEを別ファイルへUTF-8で書きこむ際に、文字化けしてしまいます。 書きこんだファイルを開けてみると、日本語が文字化けしています(アルファベットは大丈夫) 以下のPerlのPAGETITLEをどのように改造すれば、文字化けしないで、$foundations_fileへUTF-8で書き込みすることができるのでしょうか? ※個人的にはデータ書き込みの sub REGIST 以下を改造すれば良いのではと推測していますが、どうやれば良いのか分かりません。 どうかご教示、よろしくお願い致します。 m(_ _)m ------------------------------------- #!/usr/bin/perl use utf8; binmode STDIN,":utf8"; binmode STDOUT,":utf8"; #基本セットアップファイル読込 require './setup_manage.cgi'; #このファイル $cgi = "./foundations.cgi"; #デコード処理 &DECODE; sub VIEW { #基本設定ファイルの読み込み &FOUNDATIONS_READ; 【省略】 <TABLE width="100%" border="0" cellspacing="0" cellpadding="1"><TR> <TD width="70%">変更するデータを直接書き換えて [ 編集実行 ] を押して下さい。</TD> <FORM method="post" action="./login.cgi"> <TD width="30%" align="right"><INPUT type="submit" value="メインメニューに戻る"></TD> <INPUT type="hidden" name="mode" value="main"> <INPUT type="hidden" name="pw" value="$in{'pw'}"> </FORM> </TR></TABLE> 【省略】 <TABLE border="0" cellspacing="1" cellpadding="4" bgcolor="#999999"><TR> <FORM name="SUBMIT" method="post" action="$cgi" onSubmit="return kakunin()"> <TD width="160" bgcolor="#eeeeee"> <TABLE border="0" cellspacing="0" cellpadding="1"><TR> <TD>ページタイトル</TD> </TR></TABLE> </TD> <TD width="400" bgcolor="#ffffff"> <TABLE border="0" cellspacing="0" cellpadding="1"><TR> <TD><INPUT type="text" name="PAGETITLE" size="60" value="$PAGETITLE"></TD> </TR></TABLE> </TD> 【省略】 ------------------------------------------------- # データ書き込み #------------------------------------------------- sub REGIST { #全角英数字を半角に変換 $zenkaku = '0123456789'; $hankaku = '0123456789'; $in{'PAGETITLE'} =~ s/\,/&%/g; $in{'PAGE1'} =~ s/\,//g; $in{'PAGE2'} =~ s/\,//g; $in{'PAGE3'} =~ s/\,//g; $in{'CATECOL'} =~ s/\,//g; $in{'PERIOD'} =~ s/\,//g; $in{'TABLECOL'} =~ s/\,//g; $in{'SIZECOL'} =~ s/\,//g; $in{'SIZEROW'} =~ s/\,//g; $in{'COPYRIGHT'} =~ s/\,/&%/g; #ファイルロック開始 if( $lockkey ne '0' ){ &LOCK; } #ファイルに書きこむ if (!open(OUT,">:utf8",$foundations_file)) { &ERROR( read_foundations ); } print OUT "$datenow,$in{'PAGETITLE'},$in{'INIMODE'},$in{'MODECHG'},$in{'PAGE1'},$in{'PAGE2'},$in{'PAGE3'},$in{'CATEVIEW'},$in{'CATECOL'},$in{'INICATE'},$in{'PERIOD'},$in{'RANKING'},$in{'CMODE'},$in{'RANKVIEW'},$in{'TITLEVIEW'},$in{'SRCHVIEW'},$in{'INPVIEW'},$in{'DATAROW'},$in{'TABLECOL'},$in{'BARCLR'},$in{'BARPER'},$in{'IMGPRT'},$in{'IMGSIZE'},$in{'SIZECOL'},$in{'SIZEROW'},$in{'IMGFRM'},$in{'COPYRIGHT'},$in{'GPVIEW'},"; close(OUT); #ファイルロック解除 if( $lockkey ne '0' ){ &UNLOCK; } &COMP; }

    • ベストアンサー
    • Perl
  • MFCで、UTF-8で保存したい

    すいません。 またまた教えて下さい。 MFCで、UTF-8でファイルを保存しようとしていますが、うまくいきません。 下記のプログラムで、添付のエラーが出ます。 // UTF-8ファイル書き込み FILE* pFile1; fopen_s(&pFile1,"C:\\app\\8a.txt", "w, ccs=UTF-8"); //fopen_s(&pFile1,"C:\\app\\8a.txt", "w"); //UTF-8でないのでOK if (pFile1) { CStdioFile file(pFile1); file.WriteString(_T("abcあいうえお")); file.Close(); } <環境> windows8 visual studio2012(2008でも同じでした) MFCで、文字セットはマルチバイト文字セットを使用するにしています。 参考にしたHP http://faithandbrave.hateblo.jp/entry/20080724/1216890457 なぜでしょうか? よろしくお願い致します。

  • mb_convert_encodingとUTF

    mb_convert_encodingでUTF-8>JIS変換行う場合 $fileにファイル内容全部が読み込まれた状態で、mb_convert_encoding($file, "JIS", "UTF-8")とした場合、$fileの冒頭に?という文字化けが残ります。 これを削除もしくは表示させないようにするにはどうしたらよいのでしょうか? if(($buf = mb_convert_encoding(file_get_contents("$file"), "jis","utf-8"))<>""){ $file = tmpfile(); fwrite($file, $buf); rewind($file); if((flock($file,LOCK_EX))!==false){ while(!feof($file)){ $str = fgetcsv($file,1000,","); <処理~~~~> } } fclose($file); }

    • ベストアンサー
    • PHP
  • Perl 指定行への書き込み

    #!/usr/bin/perl require './jcode.pl'; $file = "houkoku.txt"; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\t//g; $value =~ s/\r\n/\n/g; $value =~ s/\r/\n/g; $value =~ s/^\s+//; $value =~ s/\s+$//; $FORM{$name} .= (defined $FORM{$name}) ? "," . $value : $value; } open( WRITE, "+< $file" ); print WRITE $FORM{'name'},",",$FORM{'color'}."\n"; close(WRITE); foreach ( keys %FORM ) { if( $FORM{$_} eq '' ) { $FORM{$_} = '入力がありません'; } } #if ( $FORM{'name'} eq '' ) { $FORM{'name'} = '入力がありません'; } if ( $FORM{'color'} eq '' ) { $FORM{'color'} = '入力がありません'; } print "Content-Type: text/html\n\n"; print <<END_HTML; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <center> <table border="1"> <td> $FORM{'name'}</td> <td> $FORM{'color'}</td></tr> </table> </center> </body> </html> END_HTML exit; として、カンマ仕切りでデータを保存できるようになりました。 これを、指定行への書き込みを行いたいのですが、どのようにしたら良いでしょうか。 たとえば、5行目にこのデータを書き込んで、常に5行目を上書き更新するような感じです。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 文字コードの変換(Shift-JISからUTF8)

    文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを 確認するとShift-JISのままです。 どなたか教えていただけないでしょうか? ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $input_file="input.csv"; my $output_file="output.txt"; open (IN, $input_file) or die "$!"; open (OUT, ">$output_file") or die "$!"; while (<IN>){ chomp ($_); my @data=split(/,/,$_); for(my $i=0;$i<@data;$i++){ $data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換 $data[$i]=~s/\s+//g; print OUT $_; } print OUT "\n"; } close (IN); close (OUT);

    • ベストアンサー
    • Perl
  • perl サブルーチンでのファイル出力結果おかしい

    以下のコードを実行するとカレントディレクトリの配下にある すべてのファイルのリストがコンソールとファイルに出力される はずですが、コンソールに表示されているファイルの一部しか ファイルに出力されていません。 どうも、最後に do_file()を呼び出したときのファイルしか リストされていないようなのですがなぜでしょうか。 どのようにすればよいのでしょうか。 よろしくお願いします。 (Windows7, ActivePerl(v5.16.3)) ----test.pl--------------------------------------------- &do_dir('.'); sub do_dir{  open(FILE2,'>list.txt') or die "$!";  my $dirname=shift;  my $delim='/';  opendir(DIR,$dirname) or die "$!";  foreach $entry (readdir(DIR)){   next if($entry eq '.');   next if($entry eq '..');   if ($dirname=~/[\\\/]$/) {    my $delim='';   }   my $filename="$dirname$delim$entry";   if(-d $filename){    &do_dir($filename);   } else {    &do_file($filename);   }  }  close(DIR);  close(FILE2); } sub do_file{  my $filename=shift;  return unless ($filename=~/\.*$/);  print "$filename\n";  print FILE2 "$filename\n"; }

    • ベストアンサー
    • Perl
  • 同名ID、同名画像ファイル名があったらエラー表示

    CGI勉強中です。既に同名の商品id_num及び画像ファイル名gazouが存在する場合、エラー表示する場合、コードの書き方がわかりません。 教えて下さい。 --------------------------------------------------------------- # 商品登録処理 sub goods_regist { if ( $in{'id'} eq '' ) { &error ('エラー','IDが未選択です'); } if ( $in{'id_num'} eq '' ) { &error ('エラー','商品個別番号が未入力です'); } if ( $in{'goods'} eq '' ) { &error ('エラー','商品名が未入力です'); } if ( $in{'tanka'} eq '' ) { &error ('エラー','商品単価が未入力です'); } if ( $in{'id_num'} eq '' ) { &error ('エラー','商品個別番号が未入力です'); } if ( $in{'ad_amount'} eq 'text' && $in{'ad_amount2'} eq '' ) { &error ('エラー','個数設定が不正です'); } if ( $in{'ad_amount'} eq 'list' && $in{'ad_amount3'} eq '' ) { &error ('エラー','個数設定が不正です'); } $goods_data = "$goods_dir/$in{'id'}.cgi"; open (DATA,"$goods_data") || &error('オープンエラー','商品データファイルが開けません。'); @LINES = <DATA>; close (DATA); $count = @LINES; if ( $count == 0 ) { $num = 1; } else { @lists = $LINES[-1]; $num = $lists[0]; $num = $num + 1; } &lock2; open (OUT,">>$goods_data") || &error('オープンエラー','メール設定ファイルが開けません。'); print OUT "$num\t$date_now\t$in{'id'}\t$in{'id_num'}\t$in{'goods'}\t$in{'tanka'}\t"; print OUT "$in{'ad_amount'}\t$in{'ad_amount2'}\t$in{'ad_amount3'}\t$in{'rem'}\t\n"; close (OUT); # 画像アップロード処理 ################ $filename = $in{'gazou'}; $gif = 1; $jpeg = 1; $macbin=0; foreach (@in) { if ($_ =~ /(.*)Content-type:(.*)\/(.*)/i) { $tail=$3; } if ($_ =~ /(.*)gazou=(.*)/i) { $fname=$2; } if ($_ =~ /application\/x-macbinary/i) { $macbin=1; } } $tail =~ s/\r//g; $tail =~ s/\n//g; $filename =~ s/\"//g; $flag=0; if ($image_up eq '0') { $flag=1; } if ($tail =~ /gif/i && $gif) { $tail=".gif"; $flag=1; } if ($tail =~ /jpeg/i && $jpeg) { $tail=".jpg"; $flag=1; } if (!$flag) { if ($fname =~ /.gif/i && $gif) { $tail=".gif"; $flag=1; } if (($fname =~ /.jpg/i && $jpeg) || ($fname =~ /.jpeg/i && $jpeg)) { $tail=".jpg"; $flag=1; } } if (!$flag) { &error("アップロードできないファイル形式です","lock"); } $upfile = $in{'gazou'};

  • foreachの入れ子について。

    あるディレクトリ内の全てのファイル名を取得し、 全てのファイルを開いてカンマ、ダブルクォーテーション付加の処理をし、 別ファイルへと出力する。と言ったものを以下のように作ったのですが、 入れ子のforeach{}内へ入って行きません、 foreachの入れ子は出来ないのでしょうか? それともプログラムが間違っているのでしょうか? どなたかご教授お願いいたします。 require "./jcode.pl"; # jcode.plの呼び出し #ディレクトリ表示 opendir(DIR01,"./TestData") || die "can not open dir"; @FileName = readdir(DIR01); closedir(DIR01) || die "can not close dir"; foreach $file (@FileName) { if ($file eq '.') {next;} # '.'の時ループを抜ける if ($file eq '..') {next;} # '..'の時ループを抜ける $FName = "./TestData/$file"; # ファイルのオープン open ( FILEHANDLE , "$FName") || die "ファイルを開けません :$!\n"; @line = <FILEIN>; close (FILEIN); foreach $line (@line){ ######################### print "TEST-->$line\n"; ######################### $line =~ s/ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ//g; $line =~ s/\"/\"\"/g; $line =~ s/\,\"\?/\"\,\"/g; $line =~ s/\"\,\?/\"\,\"/g; $line =~ s/\ |\ /\"\,\"/g; &jcode::sjis2euc(\$line,"z"); # sjis --> euc コードへ変換 if (length $line != 1){ chop($line); $cd_22 = chr(0x0022); $line = "$cd_22$line$cd_22"; $line =~ s/([^\LF])$/$1\n/; } } open (FILEOUT, ">./log/TEST.txt") or die; #上書き時 print FILEOUT @line; close (FILEOUT); } } exit;

    • ベストアンサー
    • Perl
  • Perl 速度について

    あるサイトの情報を取得するのに ソースを組んで、なんとかできたのですが、 時間がかかってる気がします。 ページ数 約300ページくらい読み込んでいて その中でも、 250ページほど、正規表現で、一部抜粋し、保存させているのですが、 ここが遅いです。 保存した容量は、 1個につき2kb~20kb 平均8kbほど 下記のような、ソースの箇所が明らかに遅い気がします。 my @words; while ($content =~ m#<td.*?>(.+?)</td>#gs) { my $word = $1; $word =~ s/<.+?>//g; $word =~ s/(\r|\n)+/\,/g; $word =~ s/,+//g; for( my $year=2010; $year<2017; $year++ ){ $word =~ s/$year\//\n$year\//g; } from_to($word,"euc-jp","utf8"); utf8::decode($word); push(@words, $word) if $word; } @Word = join(',', @words) . "\n"; print @Word; open(FILE, ">","$DATA[$i].txt") or die("error :$!"); flock(FILE, 2); print FILE @Word; close FILE; 内容が多いからでしょうか? だいたい10分近くかかっております。 パソコンもcore i3と古い Windows7を使用しています。 そんなものでしょうか? もしくは、速くする方法はありますか?

    • ベストアンサー
    • Perl

専門家に質問してみよう