Perlコーディング初心者質問スレ Part 50
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/26(月) 00:46:38ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0219nobodyさん
2006/07/05(水) 01:05:56ID:???エスパー求めすぎ。
0220205
2006/07/05(水) 01:23:12ID:???http://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42709.txt.html
ソースうpしました。アドバイスお願いします。
>>217
$iは忘れてました。つけたら少しはまともな動作をするようになりましたが求めていたものとは違いました。
0221nobodyさん
2006/07/05(水) 01:44:31ID:???0222205
2006/07/05(水) 01:50:05ID:???0223nobodyさん
2006/07/05(水) 01:51:31ID:???@localsubject のどれかが、
@datname の最後の値 ( @datname[ $#datname ] ) にマッチしたら 1、マッチしなかったら 0
ってことなんだけど、それは処理としていいの?
どうみても @datname の最後未満の値は、マッチしようがしまいが関係ないって感じだよね。
0224205
2006/07/05(水) 02:27:35ID:???>@datname の最後の値 ( @datname[ $#datname ] ) にマッチしたら 1、マッチしなかったら 0
ってことなんだけど、それは処理としていいの?
@datnameは外側のforeachでまわしてるから全部にマッチしてるかどうか確かめてあるはずですけど…
判定ルーチンが内側のforeachのすぐ後ろに来るから判定はしてくれてるはずです。
いまいろいろやって、とりあえずローカルにsubject.txtを書き出すのはうまくいったみたいです。
あとは、これが2重に書き込まれないようにするためにしないとなんだけど、そこの処理をやってるのが96〜111行目なんですよね。
で、そこがうまくいってないみたいです。$localsubjectmatchswitch=0;になるときの処理に
print "nomatch";を加えたらすでにローカルsubject.txtに書き込んである場合でもnomatchを返されました。
だからif($loopsubject=~/$loopdat/)が問題ですかね?
それとも@datanameの内容が2つあるから違うほうの内容に反応してnomatchを返すことになってるのでしょうか?
でもforeach $loopsubject(@localsubject)で内容全部まわしてるから1つでもマッチしたら2重に書き込みはされないはずですけど…
なんでまずいのかわからないのでアドバイスお願いします。
0226nobodyさん
2006/07/05(水) 02:42:02ID:???こんなの保存して楽しいのか
0227nobodyさん
2006/07/05(水) 02:55:40ID:???0228205
2006/07/05(水) 02:59:19ID:???これが気になって眠れません。寝たほうがいいってか寝ないとなんですけど…
>>226
テスト用の検索ワードが思いつかなかったため適当に目に付いたスレを選んだのです。特に深い意味はありません。
原因が判明したっぽいです。103行目あたり、foreach $loopsubject(@localsubject){
でローカルのsubject.txtを解析するのですが、$loopsubjectをループ内でprintしてみたところ最後の1行しか表示されませんでした。
全部表示されるはずのローカルsubject.txtが表示されないということはマッチも出来ないわけですからnomatchになるということだと思います。
で、どうにかしたいんですがどうしたらいいんでしょうか?foreachで表示されないなんてことは初めてなのでわかりません。アドバイスお願いします。
0229nobodyさん
2006/07/05(水) 03:04:35ID:???> @localsubject=<F>;
これかwwwwwwww
>> とか < とかの区別もできない子だったんですね。
0230nobodyさん
2006/07/05(水) 03:07:22ID:???0231205
2006/07/05(水) 03:22:39ID:???ファイルオープンの時につけるのって>と>>しか知らなかった…今ググってはじめて知った…orz
読み込みは出来るようになりました。迷惑かけて本当すみません。
でも、2重に書き込んじゃうのがどうしてもなくならないんですけどどうしたらいいんですか?
もう散々どこが悪いのか探したけどわからないんです。多分これが最後の質問です。お願いします。
0232nobodyさん
2006/07/05(水) 03:33:40ID:???直したのはわかったけど、それでマッチするようになったのかマッチしないのかぐらい書いてよ。
どうでもいいけど、 chomp $loopdat; → $loopdat =~ s/[\r\n]+$//; とかのがいいかもね。
0233nobodyさん
2006/07/05(水) 04:07:21ID:???0234nobodyさん
2006/07/05(水) 04:27:05ID:???あ…ありのまま 今 起こった事を話すぜ!
『myの羅列とインデントにくらっと来たと
思ったらいつの間にか作り直していた』
「今時Perl4」とかそんなチャチなもんじゃあ 断じてねえ
もっと恐ろしいものの片鱗を味わったぜ…
>>231
漏れのところでは開くモードを適切に変更して関連部分を修正すれば一応動くがなぁ…
+<モードで開いた?それとも<で読み込んだ後、一旦閉じて>モードで開きなおし?
もし+<モードなら、seekしてないんでないのか。
あと直接関係無いが、112行目の$iのインクリメント位置が間違ってる。
>>232
いや、そもそも@datnameには改行は入ってこない。
<>でsplitした前半相当だから。
0237nobodyさん
2006/07/05(水) 05:00:47ID:???一応 use strict 通るけど、あんなじゃ kent local と変わんないっつー。
0238nobodyさん
2006/07/05(水) 07:41:25ID:???0239nobodyさん
2006/07/05(水) 14:04:38ID:???0240nobodyさん
2006/07/05(水) 14:08:45ID:???それって良くないことなのか?
むしろ推奨!みたいな感じだと思ってたので詳しく教えてくれ。
0245nobodyさん
2006/07/05(水) 17:04:50ID:???0247nobodyさん
2006/07/05(水) 18:10:57ID:???0250205
2006/07/05(水) 20:56:42ID:???foreach $loopdat(@datname){
chomp $loopdat;
$datmatchcheck{$loopdat}=0;
foreach $loopsubject(@localsubject){
if($loopsubject=~/$loopdat/){
$localsubjectmatchswitch=1;
print "match:$loopdat\n";
last;
}else{
$localsubjectmatchswitch=0;
print "nomatch:$loopdat\n";
}
}
if($localsubjectmatchswitch==0 && $datmatchcheck{$loopsubject}==0){
$datmatchcheck{$loopsubject}=1;
$writesubject=$datname[$i]."<>".$threadtitle[$i];
unshift(@localsubject,$writesubject);
}
$i++;
}
このようにしてみました。しかし、2重に書き込まれてしまいます。
多分@localsubjectの中身を何度もまわすので、それでマッチして無いのがマッチして無いとみなされるみたいです。
2重に書き込まれないようにするにはどのようにチェックしたら良いでしょうか?アドバイスください。お願いします。
$datmatchcheck{$loopsubject}のようにしてみましたがこれではうまくいきませんでした。
0251nobodyさん
2006/07/05(水) 21:10:50ID:???0252nobodyさん
NGNG0253nobodyさん
2006/07/05(水) 21:32:17ID:???$localmyforeach;
$elsifwhile;
$unshiftopen;
みたいな変数名つけたらエラく読みづらくなるんだろうな…。
0254nobodyさん
2006/07/05(水) 21:43:47ID:???$found = 0;
chomp;
foreach $tmpdatname(@datname){
chomp;
if($tmpdatname =~ /$tmpsub/){
$found = 1;
$founddat = $tmpdatname;
last;
}
}
if($found){
push(@founds, "$founddat<>$tmpsub\n");
}
}
print @founds;
myとかは略した
0255nobodyさん
2006/07/05(水) 21:45:05ID:???0257nobodyさん
2006/07/05(水) 21:48:29ID:???ttp://kasamatusan.sakura.ne.jp/cgi-bin2/src/ichi42797.txt.html
234のをさらにooっぽくしてみました・・・
当の205はまだ解決してないのかなw?
0258nobodyさん
2006/07/05(水) 21:54:53ID:???久しぶりにくらくら来ました。
0259nobodyさん
2006/07/05(水) 21:59:23ID:???0260nobodyさん
2006/07/05(水) 22:15:12ID:???0261nobodyさん
2006/07/05(水) 22:16:17ID:DDQKgTGLファイル名はcontak.lolです。
cgi-binフォルダにあるかないかを調べたいです。
globを使うんですか?
なんか混乱しちゃって。
0262nobodyさん
NGNG0263nobodyさん
2006/07/05(水) 22:31:31ID:???0264nobodyさん
2006/07/05(水) 22:36:23ID:???0265nobodyさん
2006/07/05(水) 23:19:27ID:???へええ、そうか、ファイルロックと同じように攻撃されるわけかw
結局 perl では安全にファイルを作ったり読んだりするのはどう書けばいいのだろう?
File モジュール使えって? そりゃそうですが。
0266nobodyさん
2006/07/05(水) 23:23:45ID:???0268nobodyさん
2006/07/06(木) 00:02:49ID:???0270nobodyさん
2006/07/06(木) 00:44:34ID:???ファイルを作ったのが自分かどうかはわからないが。
0271nobodyさん
2006/07/06(木) 00:59:56ID:FMcswvIHバッチ処理(これはなんとか解決)を実行後に、元のHPでリンクされた
urlを新しいブラウザで開きたいのですが記述方法がわかりません。
どう記述すれば良いのでしょうか?
つまらない質問ですがよろしくお願い致します。m(__)m
0272nobodyさん
2006/07/06(木) 01:26:41ID:???0273nobodyさん
2006/07/06(木) 01:30:44ID:???0274nobodyさん
2006/07/06(木) 02:13:42ID:???perlって、サーバで動きますよね。
自分のパソコンで動かそうと思ったら、
apache,activeperlとかインストールしないとだめです。
ここで質問ですが、exeファイルみたいなので、
activeperl無しで動かすことってできるんでしょうか?
perlでアプリケーション作ったら、
apacheとactiveperlもいっしょに入れて、
自分でインストールしてください。
ということになるんでしょうか?
たとえば、チャットのクライアントソフトなど
作るときってどうなりますか。
よろしくお願いします。
0275nobodyさん
2006/07/06(木) 02:26:05ID:???∩( ´∀`)∩ドウゾ (っ´∀`)っ))アチラヘ
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0276nobodyさん
2006/07/06(木) 02:45:14ID:???0277nobodyさん
2006/07/06(木) 03:58:15ID:???こんにちはこんにちは!
この辺を見るといいんじゃないかな…!
http://hamachiya.com/junk/memo_PAR.html
0279nobodyさん
NGNGttp://0xcc.net/diary/20040716.html
0280nobodyさん
2006/07/06(木) 14:12:07ID:???すごい便利なものがあったんですね。
でも、説明読んでみるとソースコードが
簡単に見れるのと、複雑なコードが正常に
動かないとか書いてありますね。
もうちょっとネットや本の資料探してみます。
0281nobodyさん
2006/07/06(木) 16:24:22ID://0K++zo変数を区別する記号付けってどうやるのか度忘れしたので教えて下さい。
検索ワードのご教示だけでも良いです。
[例]
$i = 1;
print "hoge$i_code";
等を正しく表示したい。
0282nobodyさん
NGNG0283nobodyさん
2006/07/06(木) 16:26:57ID:???0284nobodyさん
2006/07/06(木) 16:33:30ID:???0285nobodyさん
2006/07/06(木) 16:54:28ID:???OSはWINです。
すごい初心者で変な質問ですみません。
perlで、dosコマンドを実行することって
できるんでしょうか。
たとえば、
print "del a.txt";
というようにファイルを消そうと標準出力しても
実行できませんでした。
可能でしたら、方法ご教授お願いします。
0286281
2006/07/06(木) 16:56:24ID:gzQtm5v/それです!ありがとうございます。
>>283>>284
print <<HTML;
hoge$i_code
HTML
だとどうなんですかね。
汎用性に問題あり?
教えてクレクレ君の分際で偉そうにすみません。
ありがとうございました。
0288nobodyさん
2006/07/06(木) 17:11:28ID:???実行するだけならsystem関数、その出力が欲しいならバッククォートまたは、パイプでopen。
だが、そのファイルを消すというのが単なる例じゃないとしたらunlink関数を使うべき
>>286
284はこういう場合に問題ありだな
"${i}nhoge"
0294nobodyさん
2006/07/07(金) 12:05:06ID:???Perl5.8で、jcode.plやJcode.pmを使わずに
全角英数と半角英数の変換を行う方法があれば、教えてください。
0295nobodyさん
2006/07/07(金) 12:32:03ID:???step1. 文字コードについて理解する
step2. がんばる
0296294
2006/07/07(金) 14:25:27ID:???下記のようなスクリプトをUTF-8で保存し、
入力テキストファイルもUTF-8で記述したところ、うまく動作しました。
$_ = decode('utf8',$_);
の部分の意味がよくわからないので教えてください。
ここは何をしてるんでしょうか?
use strict;
use utf8;
use Encode qw/ encode decode /;
while (<>){
$_ = decode('utf8',$_);
tr/[0-9]/[0-9]/;
print;
}
0297nobodyさん
2006/07/07(金) 15:11:08ID:???オアエスゴイナww
0298nobodyさん
2006/07/07(金) 15:19:10ID:gJw2prbrやっぱforeachとかで中身を展開しながら1コずつ処理するしかない?
jcode.plとかJcode.pmとで配列そのものを扱う方法ってある?
>>294
英数字限定なら正規表現でどぞ。
0299nobodyさん
2006/07/07(金) 15:40:01ID:???0300298
2006/07/07(金) 16:19:58ID:???CGI.pmでフォームの内容を配列に入れて文字コードごにょごにょってのは
結構色んなとこで使われそうな処理なんで、実装されてたりするのかなぁ、と思ったもんで。
無いと分かれば、安心して配列回しまくれますわ。さんくす。
0301294
2006/07/07(金) 16:27:23ID:???[]は要らないよ、とおっしゃっているのでしょうか?
>>298
正規表現というと、具体的には?s///を使ってできるという意味ですか?
0302nobodyさん
2006/07/07(金) 17:13:35ID:???1byte 単位(正確には 8bite 単位)の処理から utf8 の文字列処理に
変換している。
$_ = decode('euc-jp', $_ ) ;
なら、8bite 単位の羅列を euc-jp でエンコードされてると見做
した上で、utf8 に変換。
0303294
2006/07/07(金) 17:26:00ID:???レスありがとうございます。
バイト単位から文字単位へ、という事が必要なので
読み込ませるテキストがUTF8でも必要、という事でしょうか。
読み込ませるテキストの文字コードがわかってない時はややこしそうですね。
0305205
2006/07/07(金) 20:47:14ID:???open(F,">$localsubjectpath")||die"subject.txtをopen出来ません:$!";
foreach(@localsubject){print F $_;}
close(F);
が追記モードになっていたために2重に書き込んでしまうという症状が起きました。
上書きモードで実行したらうまくいきました。
くだらない質問に答えてくれて本当にありがとうございました。
0306nobodyさん
2006/07/07(金) 21:37:02ID:???解決おめ。
234で指摘したのとほぼ同じ原因でないか…自力で二日も模索乙
まさか、まだ追記モードを使っていたとは夢にも思ってなかった訳だが。
0307nobodyさん
2006/07/07(金) 22:07:16ID:???おめ。
俺はがんばって >>234 のコードを読解して新しく書き直してるのかと思ってたw
少しは参考にすればいいのにね。
0308294
2006/07/08(土) 10:38:42ID:???こちらでの質問はこれで終わりとし、
別スレでこちらで回答していただいた事を元に
少しポイントをしぼって質問してみたいと思います。
回答していただいた方々、ありがとうございました。
0309294
2006/07/08(土) 10:40:49ID:???0310nobodyさん
2006/07/08(土) 13:48:22ID:???0311nobodyさん
2006/07/08(土) 14:50:57ID:9n4HcMAb「〜」の変換がうまくいきません。
変換できずに、「\x{ff5e}」になってしまいます。
JISにも「〜」ありますよね。
どうしたら回避できるでしょうか?
0312nobodyさん
2006/07/08(土) 14:58:49ID:???どの文字コでも設定と正規表現で2行だと思うけどw
0314nobodyさん
2006/07/08(土) 15:15:04ID:???Unicodeと既存のエンコーディングのマッピングを作る際に、〜のマッピングがメーカーによって
WAVE DASHとFULLWIDTH TILDEの二つに分かれてしまったことに起因する問題。
http://ja.wikipedia.org/wiki/Unicode
事前に"\xEF\xBD\x9E"(\x{FF5E})を"\xE3\x80\x9C"(\x{301C})に変換して統一してやればOK。
ちなみにUTF-8はASCIIとの兼ね合いは勿論のこと、1バイト目の範囲が2バイト目以降の範囲と
重ならないように設計されているから、utf-8フラグを使用しない場合でも、ずれてマッチする心配はしなくて大丈夫。
0316nobodyさん
2006/07/08(土) 15:28:25ID:???とってもまだるっこしいですが、
encode('iso-2022-jp', decode('shiftjis', encode('cp932', $x)))
とする手もあります。
日本は既存の文字コードとunicodeの対応表をつくるにあたって
統一に失敗して大きく2種類(JISとMS)できてしまったため、こんな
面倒を強いられるのです。恨むなら当時の関係者を恨んでください。
ちなみに「〜」を\x{ff5e}にするのはMS流で、JISだと\x{301c}に対応
させることになっています。
個人的には日本語に関してはunicodeはunicode-jisをunicode-msの
2種類あると思って、それらを自動判定して相互変換するJcode相当の
モジュールが欲しいなと思います。
0317nobodyさん
2006/07/08(土) 15:31:47ID:???そういう面倒を吸収してくれるライブラリがやっぱり必要なんじゃない?
0318nobodyさん
2006/07/08(土) 15:39:20ID:???→ Jcode (それ以下)
とかやって、その自作モジュのとこで対策すればいいのかもだね
0319nobodyさん
2006/07/08(土) 15:40:35ID:???ttp://search.cpan.org/dist/Encode-EUCJPMS/EUCJPMS.pm
使え的な指摘がありますよ。
■ このスレッドは過去ログ倉庫に格納されています