- 締切済み
このプログラムなんですが
#! /usr/bin/perl @data=<>; open (IN,"newtype.txt"); @file = <IN>; close (IN); foreach $address (@file) { ($pn,$ad) = split(/\t/,$address); $pnad{$pn}=$ad; } foreach $jusyo (@data) { chomp $jusyo; print $jusyo; print "\n"; print "$pnad{$jusyo}"; } foreach $line (@file) { @data = split(/t\/, $line); if($data[0] =~ "51105") { print "$data[0]"; print "$data[1]"; } elsif($data[0] =~ "651130") { print "$data[0]"; print "$data[1]"; } } exit; コンパイルするときには ./sample.pl data.txt をシェルにうって実行します。 このプログラムでは、はじめに自分で指定したファイル内に存在する郵便番号(通常は7桁だけなんですが、プログラムを見ていただければわかると思われますが、それ以外に5桁(たとえば12354XX,x12354x,xx12354など))と6桁(134567x,x134567など)がありまして、それを表示させたいんですが、上のプログラムでは、if文以下の5桁と6桁があった場合にそれを同時に表示させるプログラムができていないんです。 ハッシュをもちいてプログラムを作り直したいんですが、教えてください。 今日の夜8時までに出さなくてはいけないので、すぐに回答をいただけたらありがたいです。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- Sucelggug(@xyz37005)
- ベストアンサー率51% (368/714)
>>No.1さん 失礼しました。 本日二度目の謝罪(ノ∀`) 一応弁明させていただくと \ 当方はこれを、実際のプログラムでは半角逆スラッシュだが、Windows環境で半角逆スラッシュを入れられないので、全角逆スラッシュで表記したと判断しました。 半角逆スラッシュ=円マークがわかっている方なら、ここでは普通に円マークで入れると思うのですよ。 実行文(./sample.pl data.txt)から環境はUNIX系で間違いないので、半角逆スラッシュが普通に入力できます。 半角逆スラッシュが入力できるのに全角逆スラッシュで入力するとは思えません。 まあ質問者が帰ってこないまま20時過ぎてしまったので真相は闇の中ですね。
- sakusaker7
- ベストアンサー率62% (800/1280)
いや、別に謝るほどのことではないかと>xyz37005さん 質問者さんは逃亡したっぽいので状況が不明ですが、 MacのSafariだったかで、半角円マークを入力して投稿すると もれなく全角逆スラッシュにしてくれるという仕様があったように覚えています。 ま、それかどうかはわかりませんけど。
- venzou
- ベストアンサー率71% (311/435)
No1回答者です。 >NO1さんの言われる\が\ではないかという話は、本件はUNIXの場合だと思うので気にしなくていいと思います。 念のため補足しますが、私が言いたいのは、全角の \ が間違いと言う事です。 バックスラッシュが間違いで、円記号が正解だ、と言う意味ではありませんよ。 \ これが円記号に見えるか、バックスラッシュに見えるかは、環境に依存します。 UNIX系ではバックスラッシュに見えると思いますので、わざわざ全角の \ を使う必要がない、 よって、この質問はWindows環境から投稿されたと推測しています。 Windows環境で、MS明朝やMSゴシックなど使っていれば、円記号に見えるはずです。 この状態では、半角のバックスラッシュは入力出来ません。 書籍などでは、バックスラッシュで表示されている場合もあると思いますが、 それを参考にして、バックスラッシュを入力しようとすると、ハマります。 半角のバックスラッシュが入力出来ないからと言って、全角を使うのは間違いです。 この場合は、半角の円記号を使うのが正解になります。 全角のバックスラッシュが使われていたので、質問主さんがこの辺りを 勘違いされてるかも知れないと、推測しました。 もちろん私の勝手な推測ですので、実際の所は分かりませんが・・・ そろそろ時間ですが、お返事ないですね。解決していることを祈りましょう。
- Sucelggug(@xyz37005)
- ベストアンサー率51% (368/714)
>>No.4さん すんません。 >@data=(); と見間違えてた(´;ω;`)ブワッ まあどちらにせよ2つの入力ファイルの内容と出力したいデータの形式がわからなければ、明確な回答出せないんだが。 夜8時まで4時間切ったがのんびりしてていいんだろうか。
- sakusaker7
- ベストアンサー率62% (800/1280)
> data.txtの意味合いはなんでしょうか? > 本スクリプトには引数に対する処理がないので、このdata.txtは意味がありません。 質問にあるスクリプトの頭の方で @data=<>; のようにファイルハンドルなしのダイヤモンド演算子を使っているので ここで読み込まれるのに使われるのではないかと。
- Sucelggug(@xyz37005)
- ベストアンサー率51% (368/714)
>今日の夜8時までに出さなくてはいけないので、すぐに回答をいただけたらありがたいです。 これがもし会社などで業務上使用するプログラムなら、ヒントをあげるので自分でコーティングしよう。 ここで正解を出すことはさほど難しくはないが、それは君のためにも会社のためにもならない。 まず質問の内容ですが、5桁と6桁の郵便番号を抜き出したいと受け取りました。 それを実現するには >if($data[0] =~ "51105") >elsif($data[0] =~ "651130") ここの条件文を変えればいいです。""の中身を変えます。 今のままだと、 $data[0]が文字列"51105"を含む場合 $data[0]が文字列"651130"を含む場合 にしかなりません。 $data[0]が数字が5個続く文字列を含む場合 $data[0]が数字が6個続く文字列を含む場合 にしてやらねばいけません。ここでの注意は7桁の数字は5桁も6桁も含むこと。 具体的にどう表記するかはご自分で考えてください。 “perl 正規表現”などで検索すればいろいろ情報が得られます。 他に気になった点としては >foreach $jusyo (@data) この時点で@dataが空なので中身は実行されません。 >@data = split(/t\/, $line); おそらく書き間違いかと思いますが、タブなら\tです。 NO1さんの言われる\が\ではないかという話は、本件はUNIXの場合だと思うので気にしなくていいと思います。 >print "$data[0]"; >print "$data[1]"; このまま出力すると全てのデータが区切り無しで表示されます。 間に改行などを入れるとよろしいかと思います。 >./sample.pl data.txt をシェルにうって実行します。 data.txtの意味合いはなんでしょうか? 本スクリプトには引数に対する処理がないので、このdata.txtは意味がありません。 出力ファイルにしたいのであれば、./sample.pl > data.txtになります。 最後にperlはコンパイルじゃありませんから!!
- sakusaker7
- ベストアンサー率62% (800/1280)
> if文以下の5桁と6桁があった場合にそれを同時に表示させるプログラムができていないんです 5桁の条件と6桁の条件を同時に満たすときに 2回出力すれば良いという意味なら elsif($data[0] =~ "651130") この elsif を if にすればいいのでは? > print "$data[1]"; こういうときに、変数をダブルクォートで括る必要はないですから。
- venzou
- ベストアンサー率71% (311/435)
とりあえず気になるのは下記の二つ >($pn,$ad) = split(/\t/,$address); ($pn,$ad) = split(/\t/,$address); >@data = split(/t\/, $line); @data = split(/\t/, $line); タブ区切りなら、\t だと思います。 ------------------------------------------------ これで解決しない場合、もう少し詳しく説明して下さい。 まず、newtype.txt と data.txt の内容は何でしょう? 説明と、具体的なサンプルをお願いします。 そして、どういう結果(出力)が欲しいのかも、 具体的な例を出して、説明して下さい。