- ベストアンサー
パターンマッチと除算
perl初心者です。学生でperlを学びはじめたばかりです。 文の変換プログラムをperlで作りたいのですが、 各辺が5cmの四角形→50mm 正方形 30分間の走りこみ→0.5時間 マラソン という具合に言葉の置き換えと数字の変換を同時に行えるようなプログラムを作りたいです。 また、数字を拾うときに言葉によって式を変えたいです。 $pattern =~ s///g;と数値演算子/を使ってやるのは分かるんですが、それをどう組み合わせて使ったらよいのかわかりません。 簡単なことを質問して申し訳ありません。 どうかよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと離れてました。 とりあえず >$line =~ s{(\d+) (.*) の 四角形}{ ($1 * 10) . 'mm 正方形' }exg; >ができません。置き換えしたところで評価ってできるんでしょうか? できますよ。 }exg ってくっついているおまけの 'e' ってのが それをやれという指示になってます (evaluate の e) 置換結果が期待通りでないということなら、 実際にどういうマッチ結果になっているかを $& や $1 を print して確かめるようなことをしてみてください。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
あれ、ひょっとしてスクリプト丸ごとわたしが作るって話になってます? まあいいや。 適当に仕立てますのでちょっと時間くださいな。 >> ○○度 右回り。」実行//前 → △△ 左モータ前進 >> ●●度 右回り。」実行//後 → ▲▲ 右モータ後進 >> ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 >これは見分けをつけるために//前などをつけて識別できたらと考えています。 > あとすいません、 > ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 > は、◎→□は◎/18=□にしたいです。書き忘れました。申し訳ありません。 いや、だから実際には 60度 右回り。」実行//前 とかいうデータになるわけでしょう? ◎と○ってどうすれば区別がつきます?
補足
そうですよね… そこの区別ができないんで角度の部分は、360度までしかないので10度刻みでそれぞれ 90度 右回り。」実行//前 → 10 左モータ前進 のように作っていくことにします。 すいません。ありがとうございます。 角度の部分は1つずつ書いていこうと思うのですが、秒の*10のところで、前に教えていただいた $line =~ s{(\d+) (.*) の 四角形}{ ($1 * 10) . 'mm 正方形' }exg; ができません。置き換えしたところで評価ってできるんでしょうか? 何度も申し訳ありませんが、どうかよろしくお願いいたします。
- sakusaker7
- ベストアンサー率62% (800/1280)
あー、#1のスクリプトは文字コードをUTF-8のファイルにしないと ちゃんと動きません。 エラーは多分そのせいです。 > 私が作りたいと考えているものは、 > ◇秒 時間。時計!30 歩く。」実行 → ◆◆秒 両前進 > ○○度 右回り。」実行//前 → △△ 左モータ前進 > ●●度 右回り。」実行//後 → ▲▲ 右モータ後進 > ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 > という変換プログラムです。 > ◇→◆は◇*10=◆ > ○→△、●→▲は○/9=△、 一つ確認なんですが、これは一行に一命令とか言う規則はありますか? それと登場する単位は、秒と度だけですか? > ○○度 右回り。」実行//前 → △△ 左モータ前進 > ●●度 右回り。」実行//後 → ▲▲ 右モータ後進 > ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 この三つって実際に数字が入ったときに見分けがつかないような? 左回りが存在するかどうかも不明ですね。 ということでその辺の補足をお願いします。
補足
ありがとうございます。 左回りも作りたいです。 > ○○度 右回り。」実行//前 → △△ 左モータ前進 > ●●度 右回り。」実行//後 → ▲▲ 右モータ後進 > ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 これは見分けをつけるために//前などをつけて識別できたらと考えています。 あとすいません、 ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 は、◎→□は◎/18=□にしたいです。書き忘れました。申し訳ありません。 また、単位は秒と度だけです。 一行に一命令でなくても構わないです。 何度もすいません。本当に助かります。 よろしくお願いいたします。
- sakusaker7
- ベストアンサー率62% (800/1280)
もうちょっと規則を明確にしてもらわないとなんともいえないけど、 提示された結果だけ考えれば #!/usr/bin/perl use strict; use warnings; use utf8; binmode STDOUT, 'encoding(cp932)'; while (my $line = <DATA>) { print "$line→\n"; $line =~ s{(\d+) (.*) の 四角形}{ ($1 * 10) . 'mm 正方形' }exg; $line =~ s{(\d+) 分間の走りこみ}{ ($1 / 60) . '時間 マラソン'}exg; print $line; } __END__ 各辺が5cmの四角形 30分間の走りこみ 実行結果: 各辺が5cmの四角形 → 各辺が50mm 正方形 30分間の走りこみ → 0.5時間 マラソン こんな感じ? 置換の規則が一般化できるなら実際に置換しているところをもうちょっと 纏められるかもしれないけど。
補足
丁寧なご指導ありがとうございます。 質問の仕方が不明確ですいませんでした。 私が作りたいと考えているものは、 ◇秒 時間。時計!30 歩く。」実行 → ◆◆秒 両前進 ○○度 右回り。」実行//前 → △△ 左モータ前進 ●●度 右回り。」実行//後 → ▲▲ 右モータ後進 ◎◎度 右回り。」実行//前 → □□ 左モータ前進右モータ後進 という変換プログラムです。 ◇→◆は◇*10=◆ ○→△、●→▲は○/9=△、 ◎→□は◎/18=□ というように式を変えたいです。 パターンはこの4つなんですが、なかなかうまくできません。 教えていただいたのでやるとエラーpanic: utf6_to_utf8……と出てしまいます。 簡単な事なのにほんと申し訳ありません。よろしくお願いします。
お礼
たくさんの回答ありがとうございました。 たくさんいただいたヒントから、思っていたプログラムを作ることができました!! Pealはこれからもっと学んでいくつもりです。 本当にありがとうございました。