perlで辞書データを置換

このQ&Aのポイント
  • perl超初心者が辞書データを置換する方法について詳しく教えてください。
  • 初心者がperlを使用して辞書データを置換する方法について教えてください。
  • perlを使って辞書データを置換する方法を教えてください。
回答を見る
  • ベストアンサー

perlで辞書データを置換

perl超初心者です。 初めて組んで行き詰りました。 辞書データから不必要なものを取ろうと 思いましたが、いきなり[ファイルを開く] で止まってます。 以下がそうです。 use utf8; binmode STDIN, ":encoding(cp932)"; binmode STDOUT, ":encoding(cp932)"; open(DIC, "+<", "pdic2csv.csv") or die("Error:$!"); @array = <DIC>; $a = ~ s|" / "|"_"|g; @array = ("\,","\\","\s",1,2,3); $a = ~ s/1,2,3/"_"/g; $a = ~ s|" /// "|"\,"|g; close(DIC) ----------------- 使う辞書データは以下です。 うつる /// 건너다 / [綴り]ㄱㅓㄴㄴㅓㄷㅏ うつわ /// 그릇 / 그릇は,(~)杯, \ cf. 잔 うで /// 팔 よろしくお願いします。

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6640/9407)
回答No.2

>上の文でsyntax errorが出てしまいました。 >見ても全くわかりません。トホホ 自分で書いたプログラムを穴の開くほど見ましょう… 「プログラムは書いたとおりではなく、書かれたとおり動く。」 「ああ書いた、こう書いたはずなんだけどなあ…」では、バグは見つかりません。 このプログラムをperlインタプリタが解釈していくと、ここはこう解釈されて、このときこの変数の初期値は…みたいに追っていかないと、先入観からプログラミングされていない動作を頭の中でエミュレートしちゃったりしますよ。 ---- で、syntax error は大概行末のセミコロンが抜けてるか、文字列が閉じてないか、カッコのネストが崩れてるかです。 見たところwhileの中カッコが閉じてませんがどうですか。 ※closeの後ろのセミコロンもありませんが、そこでプログラムの終わりもしくは中カッコ閉じならばセーフです。

その他の回答 (1)

  • asciiz
  • ベストアンサー率70% (6640/9407)
回答No.1

open の書式は `open(FILEHANDLE,EXPR)' ですから、 open(DIC, "+<pdic2csv.csv") or die("Error:$!"); あるいは単に open(DIC, "pdic2csv.csv") or die("Error:$!"); とするべきでしょうね。(このファイルには書き込みしないんでしょうから、"+<"の指定は不要かと思います。) もしかしたら、参考にしたプログラムでは、2番目のパラメータがドットで連結されていたかも? → open(DIC, "+<" . "pdic2csv.csv") or die("Error:$!"); まあこれはこれで、ファイルアクセス指定と、ファイル名部分が明確に分けられていて見やすかったり、ファイル名部分が変数名だったりする場合にも使えるというわけですね。 ---- また、置換コマンド s/// のパターン部分は、ダブルクォートで囲まず、直接書きます。 そこは文字列リテラシではなく、「正規表現」で「マッチ」させるもの…といった解釈でしょうか。 例) $a =~ s| / |_|g; ---- 他にも、@array を上書きしてしまっているとか 定義してない $a をいきなり使ってるとかありますが、他の部分にあるんでしょうかね…。 とりあえずこんなところで。

neowave2001
質問者

補足

open(DIC, "+<pdic2csv.csv") or die("Error:$!"); while(<DIC>){ $data = $_; $a = ~ s| / |_|g; @array = ("\,","\\","\s",1,2,3); $a = ~ s/1,2,3/_/g; $a = ~ s| /// |\,|g; close(DIC) ---------------- エラー文 Missing right curly or square bracket at "pdic2csv.pl"line 16,at end of line syntax error at "pdic2csv.pl" line 16, ato end of file "pdic2csv.pl" had compilation errors. お返事ありがとうございます。 上の文でsyntax errorが出てしまいました。 見ても全くわかりません。トホホ よろしくお願いします。

関連するQ&A

  • 初心者が超初歩的な質問です

    perlで初歩的な質問です。 辞書ファイルで編集していたら必要以外な文字が多くて自力で削っていたら大変なので、perlでしてみました。 参考資料を見ながら一応打ったのですが、どうもうまくいきません。 実は、最初のファイル入出力のところです。 open(DIC,"> $inputfile"); 初期化されて空ファイルになる open(DIC,"< $inputfile"); とすると画面には表示されるが処理が進まない。 下が打った文です。 $inputfile="DicIn.csv"; open(DIC,"+> $inputfile") or die "$!"; while (<DIC>){ @array = <DIC>; @Array = (@Array1,@Array2); $a1 = ~ s/"//g; $a2 = ~ s|///|---|g; print(DIC); } close(DIC) 本当に初歩的ですみません 困ってます、よろしくお願いします

  • perlで全ての文字コードをeucJPで扱う

    ネットで検索しながら、表題のことをやろうとしているのですがうまくいきません。 やりたいことは、eucJPのファイルを読み込み、必要な分だけを整形して取り出し eucJPのファイルとして出力したいです。(少し追記も必要です) 根本的なところが理解できていないので、困っているのですが、 以下のようなコードを組み合わせて試してみています。 use encoding "euc-jp" binmode STDERR, ":encoding(euc-jp)"; (STDINとかSTDOUTも指定してみたりしました) perlを使う場合には、cat input.txt | hoge.pl > output.txtとしています 環境は、Ubuntuを使っていて、perlのバージョンは5.10.0となっています。 なにかアドバイスか参考URLあればお願い致します。

  • binmode関数を2回繰り返すと結果が狂う?

    お世話になります。 「まるごとPerl」という雑誌の記事をWindowsに移植してEncodeモジュールの勉強中です。 #! perl # list1 -- 日本語の文字を1文字として解釈 use strict; use warnings; use utf8; # スクリプトは UTF-8 で保存 binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更 #4文字目のカから4文字、カタカナと表示される my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); というスクリプトをUTF-8で保存してWindowsのDOS窓で(コードページはデフォルトのCP932のままで)実行すると C:\> list1.pl カタカナ と無事表示されます。 ところが、うっかり間違えて binmode を binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更 binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更 と2回書いてしまうと、結果がこうなります。 C:\> list1.pl "\x{00ca}" does not map to cp932. "\x{00de}" does not map to cp932. "\x{00ca}" does not map to cp932. "\x{00e9}" does not map to cp932. \x{00ca}\x{00de}\x{00ca}\x{00e9} これはいったい何が起こっているのでしょうか。 binmode はあるファイルハンドルのエンコードを決めるもので、何回やっても結果が一緒なのかと思っていました・・・。 00ca、00de、00ca、00deというのも、CP932の「カタカナ」のダンプ「834A 835E 834A 8369」をどうすれば得られるのか不明です・・・。 よろしくお願いします!!!

    • ベストアンサー
    • Perl
  • perl5.8.6日本語の置換について

    教えてください。perl5.8.6の日本語処理で行き詰まっています。 下記のプログラムをeuc-jpで書いて動作させたところ、s///gの 置換がうまくいきません。 何か間違っているのでしょうか。 weather.pl --------------------------- #! /usr/bin/perl # 使い方: # require "weather.pl"; # $data=weather; use LWP::Simple; use strict; use encoding 'euc-jp'; use Encode qw/from_to/; binmode STDERR,"encoding(euc-jp)"; sub weather{ my $doc; my $adrs = "http://www.jma.go.jp/JMA_HP/jp/warn/text/27.html"; until($doc){ $doc = get "$adrs"; } from_to($doc,'shiftjis','euc-jp'); $doc =~/<tr><td><pre>(.+)<\/pre><\/td><\/tr>/s; $doc = $1; $doc =~s/」/ /g; $doc =~s/パーセント/%/g; $doc =~s/[0-9]/[0-9]/g; $doc; } 1; my $result=weather; print "$result\n"; ---------------------------

    • ベストアンサー
    • Perl
  • Data::Dumper;でダンプ後表示した文字列\x{30fc}...

    お世話になります。 下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか 表示時に日本語の所が\x{30fc}のような文字列になってしまいます。 これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。 どなたかご教授いただけませんでしょうか。 #!/usr/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } use XML::RSS; use Data::Dumper; my $rss = new XML::RSS; #表示形式の違いで1と2がある。 $Data::Dumper::Indent = 1; use open IN => ":utf8"; # 入力をUTF8とする use open OUT => ":shiftjis"; #use open ":std"; #use Encode; #use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis'; #binmode STDOUT, ":encoding(utf-8)"; #binmode STDOUT, ":encoding(shiftjis)"; #binmode STDOUT, ":encoding(euc-jp)"; #use open ":encoding(shiftjis)"; # rssをセット。 open my $fh, '< ./test.rss'; my $text = join undef, <$fh>; close $fh; # rssをパース $rss->parse($text); # ひとまず中見を知る為にダンプしてみる print "Content-type:text/html;charset=Shift_JIS\n\n"; print "<html><head>\n"; print "<title></title></head>\n"; print "<body>\n"; print Data::Dumper->Dump([$rss]);

    • ベストアンサー
    • Perl
  • [perl5.8] SJISから読み込んだ~と

    sjisで書かれたファイルsjis.txtに"~"と一文字だけ 書いて、それをutf8で記述した以下のperlスクリプト で読込み、文字列マッチングをしたのですが、うまく いきません。(ちなみにソース中blockB部分を有効に し、blockAをコメントアウトするとうまくいきます) #=== match.pl =============================== #!/usr/bin/perl use encoding 'utf8'; use open IN => ":encoding(Shift_JIS)"; use open OUT => ":encoding(utf8)"; binmode STDOUT, ":raw:encoding(shiftjis)"; # === blockA === open(IN, "<sjis.txt"); @lines = <IN>; close(IN); # ============== # === blockB === # $a = "~"; # push(@lines, $a); # ============== for(@lines) {  if (/~/) {   print "WAVEDASH発見\n";  } } #============================================= ※いわゆるWAVEDASH問題に起因してそうだな、  というのはわかりますが、具体的に何が起きて  いるのかが理解できません。 原因や、どうすればこの問題を解決できるか、 ご存知の方、お知恵をお貸しください。

    • ベストアンサー
    • Perl
  • (Perl CPAN) DBDがはいらない

    「windows7 64bit に ActivePerl をいれています」 以下のプログラムを書いて実行したところ、エラーメッセージがでてきました。 Software error: DBD::MySQL initialisation failed: Can't locate object method "driver" via package "DBD::MySQL" at C:/usr/local/lib/DBI.pm line 808. Perhaps the capitalisation of DBD 'MySQL' isn't right. at C:/Apache2.2/htdocs/00001/shinki_data_sakusei.pl line 33. これはつまり、DBD::MySQL がないよ!という意味であると思うのですが、ppmを起動してDBDにあたるモジュールをインストールして再実行してもまだ同じエラーがでます。どうしてもwindows7上で作らなければならないので、困っています。どこか参考になるサイトはないでしょうか? ========================================= use strict; use warnings; # エラーをブラウザに表示 use CGI::Carp qw(fatalsToBrowser); use utf8; binmode STDIN, ':encoding(UTF-8)'; binmode STDOUT, ':encoding(UTF-8)'; binmode STDERR, ':encoding(UTF-8)'; use Encode; use DBI; # プログラム開始 # ユーザ名とパスワード my $user = 'root'; my $pass = 'root'; #データベースへ接続 my $db = DBI->connect('DBI:MySQL:localhost', $user, $pass,); if ( ! $db ){ print "エラー: $db->err $db->errstr\n"; } # 命令 my $sth = $db->prepare( "SELECT * FROM login" ); # 実行 $sth->execute; # 出力 while( my @row = $sth->fetchrow_array ){ print "@row\n"; } #データベースから切断 $db->disconnect; __END__

    • ベストアンサー
    • Perl
  • sedやperlでの2バイト文字を含む変換

    こんにちは。 sedコマンドは、texに付属していた日本語対応のものを使用しており、 perlはWindows用のActive Perl v.5.12.2を使用しています。 カレントディレクトリにあるファイルやフォルダにおいて、 名前を一括して変換したいと思い、以下のようなNameConv.batというバッチスクリプトを作成しました。 ____________________________________________________________ @echo off for /f "delims=" %%a in ('dir /b !opt!') do ( for /f "usebackq delims=" %%b in (`echo %%a^| sed -e "s/%~1/%~2/g"`) do ( move /y "%%a" "%%b" 1>nul 2>nul if not "%%a"=="%%b" echo 「%%a」→「%%b」 ) ) ____________________________________________________________ このバッチスクリプトを NameConv.bat " " "_" の様にして呼び出すと上手く行きました。 (この場合は、カレントディレクトリの全てのディレクトリとフォルダの名前において、 スペースがアンダーバーに変換されました。) ところが、 NameConv.bat "スペース" " " のように、第一引数に変換文字列に2バイト文字を使用すると、 以下のようなエラーメッセージが出て上手く行きませんでした。 sed: -e expression #1, char 14: Unterminated `s' command どうやら、 echo %%a| sed -e "s/スペース/ /g" といったコードは、上手く行かなかったようです。 そこで、この問題を解決しようと、以下のようなNameRep.plというPerlスクリプトを作成しました。 ____________________________________________________________ #日本語を扱うために必要な設定 use encoding "cp932"; use open ":encoding(cp932)"; use open ":std"; map{ binmode($_,":crlf"); } qw/STDIN STDOUT STDERR/; #置換操作 $name="$ARGV[0]"; $name =~ s/$ARGV[1]/$ARGV[2]/g; print "$name"; ____________________________________________________________ そしてこのスクリプトを for /f "delims=" %a in ('dir /b') do ( @perl NameRep.pl "%a" "スペース" "_" ) の様にしてコマンドラインから呼び出すことで、「スペース」という文字列が、 きちんと処理できるかを試したところ、以下のようなエラーメッセージが出ました。 Unmatched [ in regex; marked by <-- HERE in m/\x{00d8}\x{00f9}\x{005b} <-- HERE \x{00d8}/ at C:\Users\kei\NameRep.pl line 11. どうやら $name =~ s/$ARGV[1]/$ARGV[2]/g; の部分で、$nameや$ARGV[1]に2バイト文字が含まれていると、上手く行かないようです。 #日本語を扱うために必要な設定 以下のコードブロックで、シフトJISに対応できるはず(少なくとも今までは問題なく扱えました) なのですが、何故か上手く行きません。 そこで、sedコマンドやperl、特にperlにおいて、シフトJISコードでの2バイト文字の扱い方を御存じの方に、何かアドバイスを頂きたいと考えています。 長くなりましたが、どうぞよろしくお願い致します。

    • ベストアンサー
    • Perl
  • perlで置換をするプログラムを作成したい

    perlで置換をするプログラムを作成したい ウエブの更新プログラムをperlで作成しています。 以下の条件式でうまく置換できないときがあります。 (ここから) $oldcont ="書き換え前のコメント"; $newcont ="書き換え後のコメント"; $get_csv = get("http://hoge.foo/index.html"); if($get_csv =~ /$oldcont/i) { $get_csv =~ s/$oldcont/$newcont/g; open(DB3,">./index.html") || &error("Can't write ./index.html"); flock(DB3, 2); print DB3 "$get_csv"; close(DB3); } 以下略 (ここまで) 通常の文字は置換できたのですが、以下のようなリンクを変えようとすると結果が変わりませんでした。 oldcont <a href="http:/hoge.foo/one.html"> newcont <a href="http://hoge.foo/two.html"> プログラムを確認してみたところ if($get_csv =~ /$oldcont/i) で条件式にうまくヒット出来ていない感じです。 タグ禁止処理が悪さしているのがわかり、タグ禁止処理は解除いたしました。 それでもなお動作しませんでした。 何か不足しているものがありましたらご指摘ください。 お手数かけます。ご指導をよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルの読み書きで初歩的質問

    perl超初心者で、初歩的な質問です。 辞書データから不必要な文字を取ろうと思っています。 ところが最初のファイルの入出力から行き詰っています。 処理が終わると空ファイルができます。 下が使いたい辞書データです。 ------------------- word,trans,exp,level,memory,modify,pron,filelink "さらさら","(adj-na,adv,n,vs) (1) rustling/murmuring/(2) fluently/(3) silky (hair)/(P)","",0,0,0,"" "さらば","(conj,int) farewell","",0,0,0,"" "さん","(suf) Mr or Mrs/(P)","",0,0,0,"" "さーたーあんだぎー","(n) type of Okinawan doughnut (donut)","",0,0,0,"" "さ来週 [さらいしゅう]","(n-adv,n-t) week after next","",0,0,0,"" "さ迷う [さまよう]","(v5u) to loiter/to putter/to prowl/to wander about/to roam about/to knock around","",0,0,0,"" "ざあざあ","(adv) sound of rushing water/sound of pouring rain/white noise sound/(P)","",0,0,0,"" ------------------- そして下が組んだものです。 use encoding "cp932"; $/ = "\r\n"; open(DIC, "< dicdata.csv") or die "$!"; while(<DIC>){ } close (DIC); if($a =~ /&quop/){ $a =~ s/&quop//g; } open(DIC, "> dicdata.csv") or die "$!"; close (DIC); -------------- なにとぞお願いします。

    • ベストアンサー
    • Perl