【Perl】初心者コーナーPart10
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
02/02/24 22:18ID:zOj6Yq/31:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0698nobodyさん
02/03/19 17:20ID:FUNiZ5qx皆してる?
流行のソースの記述きぼーん
メタキャラクタの場合、比較がうまくいかないのですが、こういうものなのでしょうか?
たとえば下記のような二つの文字列を代入した変数があります。
$ORIG="hello";
$TARGET="$$";
これを比較した場合、等しくなってほしくないのですが、eq で比較すると
等しいという結果になってしまいます。
↓こんな感じ。
if ($ORIG eq $TARGET) {
# この中に入ってしまう
} else {
#本当はこっちに来てほしい
}
変数にメタキャラクタが入っている場合、どのように比較すればいいのでしょうか?
あるいは、変数の最初の文字にメタキャラクタが入っている場合、
うまく比較できないのは perl の仕様なのでしょうか?
0703nobodyさん
02/03/19 23:07ID:???$TARGET = '$$'; # シングルクオートで囲ってあるの。
で大丈夫だよー。
0704nobodyさん
02/03/19 23:13ID:???0705nobodyさん
02/03/19 23:44ID:???Perlを勉強したいと思い、perlの本を買いました。
(すぐわかるPerl、CGI&Perlポケットリファレンス)
とりあえず、最初どうしたらよいのでしょうか?
プログラミングを参考書に習って書いていくにしても
どういう風に進めたらいいか分からなくて...
0708nobodyさん
02/03/19 23:50ID:???それでも等しくなるのはおかしい。
>>702
> うまく比較できないのは perl の仕様なのでしょうか?
なわけねぇだろ。
100%お前のミスだよ。
ifの前に print("$a $b\n") で変数の値を出力してみろ。
0710702
02/03/20 00:12ID:???レスありがとうございます。
すみません、ちょっと私の書き方がまずかったです。
perl においてシングルクォートでくくると、変数を展開しない、エスケープが使えないというのは承知しているのですが、
今回のケースは、正確には下記のようなケースなのです。
前提:
1.テキストファイルにデータが書かれている
2.テキストファイルには、1行に複数の項目が書かれており、デリミタでくくられている
処理:
1.テキストファイルから1行読み込む
2.splitで分割する(分割した文字列が $TARGET に入る)
3.その文字列を eq で比較する
という感じなので、$TARGET には、普通の ascii 文字列が入ってくるかもしれないし、
$ とか ? で始まる文字列が入ってくるかもしれないのです。
↓コード例==============
$ORIG="hello";
open(DATA, "ファイル名")
while(<DATA>){
@hoge = split(/,/, $_);
$TARGET= @hoge[0];
if ($ORIG eq $TARGET) {
# $TARGET の中身の先頭文字が $ などの場合は
# この中に入ってしまう
}
:
==============
さぁどうしようかという感じなのですが....
どこかに、「eq では、先頭にメタキャラクタが入っていると比較できない(perlの仕様)」
見たいなことが明文化されていると、ある意味幸せなんだけど...
みなさんこういうときどうされてますか?
0711nobodyさん
02/03/20 00:14ID:???そうすれば大体わかる。
っつーか全ソース晒せ。
0712nobodyさん
02/03/20 00:15ID:???709は読んだか?
大体メタキャラクタってなんだよ。"正規表現の"メタキャラクタならまだ解らんでもないが。
脳内定義は止めてくれ。
0714
02/03/20 00:22ID:fhi6exvTこういうことになるのかぁ
0715
02/03/20 00:23ID:fhi6exvThttp://DQN
http://DQN.jp
これではどうかな
0716
02/03/20 00:24ID:fhi6exvTではこれでは
>>DQN
0717
02/03/20 00:25ID:fhi6exvThttp://は半角文字じゃないとだめなのね
_φ( ̄ー ̄ )メモメモ
0718nobodyさん
02/03/20 00:26ID:???消えろ
0719
02/03/20 00:27ID:fhi6exvT>>5どきゅん
http://DQNんだ
0720
02/03/20 00:28ID:fhi6exvT>>718
0721nobodyさん
02/03/20 00:29ID:???たかが2ちゃんねるでもな、おもしれぇところで下らん事やると、
そこは面白くない場所になって寂れるんだよ。
下の方にいくらでも廃墟のスレッドがあるだろ?
そこで、sageでこっそりやるのがテストってモンなんだよ。
0722ネタ?ニマジレス
02/03/20 00:29ID:???> どこかに、「eq では、先頭にメタキャラクタが入っていると比較できない(perlの仕様)」
> 見たいなことが明文化されていると、ある意味幸せなんだけど...
僕は不幸だと思います。
0723
02/03/20 00:32ID:fhi6exvTあ、sageですればよかったすね
失礼しました。
ところでお聞きしたいんですが2ちゃんねるのレスの改行制限、文字数制限っていくつなんでしょうか?
いま2ちゃんねるのまねCGIつくってまして
0724nobodyさん
02/03/20 00:35ID:???↓とかで。
【スレッド】 2ch型掲示板その4 【フロート式】
http://pc.2ch.net/test/read.cgi/php/1010669197/l50
0725nobodyさん
02/03/20 00:52ID:???0726702
02/03/20 01:06ID:???レスどうもありがとうございます。(709は 710 を書いた後に気がつきました。)
すみません、結論から言えば私のミスでした。みなさん申し訳ありません。
perl の eq は間違っていませんでした(printしまくってみて、気がついた。)
別のところが問題だったのですが、そこがわかりません。
ソースを貼り付けます。
1 #!/usr/bin/perl
2
3 $ORIG="hello";
4 print "$ORIG\n";
5
6 open (DATA, "dat.txt");
7 while (<DATA>) {
8 chomp;
9
10 @hoge = split(/,/, $_);
11 $AA = @hoge[0];
12 $BB = @hoge[1];
13
14 print "\n";
15 print '$AA>>'."$AA"."<<";
16 print '$BB>>'."$BB"."<<\n";
17
18 if( $ORIG eq $BB) {
19 print "pattern 1\n";
20 } elsif($ORIG =~ /$BB/ ) {
21 print "pattern 2\n";
22 } else {
23 print "pattern 3\n";
24 }
25 }
0727702
02/03/20 01:06ID:???----------------
11,bb
22,$$
----------------
実行結果
----------------
$ ./hoge.pl
hello
$AA=11 $BB=bb
pattern 3
$AA=22 $BB=$$
pattern 2
----------------
気になるのは、2行目のデータを読み込んだときに
hello と $$ を比較していて、
部分一致になってしまっている点です。この二つを比較すると
不一致になる(だから pattern 3 が表示される)
はずなのですが、どうして pattern 2 にいってしまうのでしょうか?
0728nobodyさん
02/03/20 01:16ID:???0729702
02/03/20 01:42ID:???quotemeta(); をいれて print してみたところ、
$$ が \$\$ で表示されました。
この quotemeta(); で、今まで問題がなかったところに影響がないかどうか、
テストをしてみます。
(quotemeta されることにより、いままで正常に eq できていたところが
eq できなくなると、それはそれで困るので)
ついでに quotemeta() で、\ が挿入される文字についても調べて見ます。
(正規表現で特別な意味を持つ文字が対象? だからセミコロンとかは対象にならない?)
728 さん、どうもありがとうございました。
0730nobodyさん
02/03/20 09:35ID:???とりあえずquotemetaの「meta」が何を意味するのかを勉強しなさい。
どうもeqと正規表現の違いが分かっていないように見える。
0731nobodyさん
02/03/20 10:17ID:???$mesu{ 'manco' }{ 'size' } = '宇宙' ;
見たいな感じで、
合わせて、どっかいいポインター紹介してもらえないすか、
0733nobodyさん
02/03/20 10:28ID:???あとここの人間下ネタ嫌いみたいだから・・・(笑
0734
02/03/20 10:34ID:fhi6exvT0735nobodyさん
02/03/20 10:59ID:???7bitにエンコード(←合ってる?)したりかなりめんどくさいからオススメしません。
0737nobodyさん
02/03/20 11:35ID:???http://member.nifty.ne.jp/hippo2000/perltips/perlmail.htm
0738731
02/03/20 13:19ID:???>$mesu{ 'manco' }{ 'size' } = '宇宙' ;
>「どっかいいポインター」が何の事かは分かりませんが…。
URLって事で
0739
02/03/20 18:12ID:fhi6exvTmimew.plっての発見してできました。
0740735
02/03/20 19:29ID:???そらよかったやん。
語学のためにURLきぼんぬ。
0741nobodyさん
02/03/20 19:37ID:???コマンドプロンプトらしきものが立ち上がり
そこでperlが動いてるのが見えるんですが
これを見えないようにするやり方ありませんか?
バックグラウンド(?)で動かしたいのです
0743nobodyさん
02/03/20 19:41ID:???ひょっとしてApache か anhttpdのDOS画面のことか?
0745nobodyさん
02/03/20 19:55ID:???いや,おれのマシンではたまに出てくるのよ。4回に1回ぐらい。
0747nobodyさん
02/03/20 21:22ID:UA5ZBzLD全部一気に配列に読み込んで扱いますか??
データソートとかする場合、いちいち読みに行くと遅いかなあと思うけど
サーバに負担かかるだろうし、例えば5Mくらいのデータファイルだったら
普通みなさんどうしますか?
それから、データが後々増えることを考慮する場合どうしますか?
0749nobodyさん
02/03/20 21:28ID:???それは「表示するだけなら」じゃないのか?
0750出来の悪い子
02/03/20 21:32ID:K1AeGIQFメールをチェックする正規表現がうまく作動しないのですが
どうしたら良いですか?
} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
&Header('Insert Editor');
print "<H5> Emailが正しく入っていません<br>";
これだと素通りしてしまいます
とりあえず下記のやり方でごまかしているのですが。
} elsif ($email eq "") {
&Header('Insert Editor');
print "<H5> Emailを入力してください<br>";
これじゃチェックにならない(´・ω・`)ショボーン
どう記述すれば良いでしょうか?
0751nobodyさん
02/03/20 21:48ID:???その時散々煽ったおれも全部上に書き換えたよ。(笑
「^」使うとまぎらわしいね。「 !~ メールアドレスの書式」 にしてみろよ。
てきとーで書くけど $email !~ /\w\.-_@\w-_\.\w/ とか。
0752nobodyさん
02/03/20 21:50ID:???てきとーに書きすぎた。
$Mail =~ /^[\w\-\.]+\@[\w\-]+\.[\w\-\.]+$/i でどう?
0754nobodyさん
02/03/20 22:00ID:???0755nobodyおっさん
02/03/20 22:32ID:???メールユーザID文字数は何文字でもいいの?
. (ピリオド)が2つ続いてもマッチするのでは?
最後に . (ピリオド)がきてもマッチするのでは?
i オプションの意味は?
0756nobodyさん
02/03/20 22:38ID:???ならアンタが早く説明してやれよ。
どうせ初心者の相手する気なんてまったく無くて解答者に茶々入れるだけにここいるんだろけど。
0757nobodyさん
02/03/20 22:40ID:???1MB超えた辺りから、自前のエンジンより
DB_FileのBTREEとかXS拡張DBDを使うDBIが検索やソートは高速になってくるよ。
0758nobodyさん
02/03/20 22:56ID:???0)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*"))*@(?:[^(\0
40)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])(?:\.(?:[^(\040)<>@,;:".\\\
[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]))*){ &err("mailerrer"); }
0759nobodyおっさん
02/03/20 23:23ID:???生半可な知識だったら書かないほうがいいということを言いたかっただけ。
できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは?
0762nobodyさん
02/03/20 23:30ID:???生半可な知識でも書いてみるのはいいことだよ。
そこからより効率のいい正しい方法の話し合いがされて、間違いを書いた方も正しいやり方を覚えられる。
初心者は自分の知りたかった事が議論によって導き出され、より理解力が深まる。
答えだけ出されるよりよっぽど勉強になるよ。
0763nobodyさん
02/03/20 23:36ID:???とても簡潔なコードにはならんよ。
それならモジュール使って送信テストまでするよ。
0764nobodyさん
02/03/20 23:41ID:UA5ZBzLD遅れましたが、ありがとう!
なんかDBの知識もなく、また頼まれ仕事で納期もないので
取りあえずタブ区切りテキスト+自前エンジンでやるしかないんですが、
やはり動作速度を犠牲にしたほうがいいのかな。
サーバに負担かけたら怒られますかね。ド素人ですまんです。
0765nobodyおっさん
02/03/20 23:53ID:???>ドットが2つ続くかどうかなんてチェックしてたら
>とても簡潔なコードにはならんよ。
なぜそういいきれる? その根拠はなんなの?
やらないうちから決め付けるのはやめたほうがいいと思う。
0768nobodyさん
02/03/21 00:30ID:???場に出てきたモノにカウンターかます以外のこともやってみれっての。
0769nobodyさん
02/03/21 00:33ID:???2-3年前のサーバと、今のサーバでは、CPUやメモリやHDDの回転数なんて言った
処理系のスペックは比較にならないくらいあがってるよ。
だから無茶な処理して良いと言うことではないけど、ね。
問題は、先方がコーディングする人間に支払っているコストと、与えている開発日数、
そして、要求している仕様ですべて決まると思うよ。
0770nobodyおっさん
02/03/21 00:49ID:???761に非難するのは筋違い とありますが、わたしがはじめに書いたいくつかの
疑問点は非難しようというのではなくて助言のつもりで書いただけです。
この助言を書いた途端にどなたかがいきなりつっかかってきた上に非難される
のはこちらも困ります。
760に絶対な解答をとありますが、メールアドレスには[]付きのIPアドレス
を含むなどの予想外の形態のもの等もありますので不可能といっていいでしょう。
「Perlメモ」にも非常に長い正規表現が書かれていますが、これも絶対ではない
と書かれています。特殊な形態はマッチさせない条件でなら簡単に書けると思う
のですが、絶対な解答ということなので遠慮しておきます。
0771nobodyさん
02/03/21 00:52ID:???初心者スレではそういう説明が重要だよ。
それがわからない人が多いんだから。
なにかを否定する場合はきちんと説明もつけましょうね。
そうすればみんながハッピーになれる。
0772nobodyさん
02/03/21 01:51ID:KirJ6q/Uやはりそうですよね。過去レス随時削除するような掲示板くらいしか
作ったことなかったもので、そんなでかいのは検討も付かなかったのです。
>>769
おっしゃる通りです。俺みたいな素人に安く頼むんだから我慢しろという
姿勢で行きます。ただ、コストはそうですが、開発日数の方はちゃんとした
DBシステム覚えた方が早くて楽チンのような予感もするので、次の仕事が入るまでに
覚えることにします。
ありがとうございました。
0773nobodyさん
02/03/21 02:15ID:???正規表現はそれで合ってるよ。(意図したいことは分かる。)
漏れも、簡単なチェックならそう書く。
んで、>>751の指摘の要点は
} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
じゃなくて、
} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
ってしろってことだけど、これでダメだったの?
print "<H5>[$email]は不正なメールアドレスです</H5><br>";
に書き換えてみて、うまく行かない時の表示キボン。
0774773
02/03/21 02:17ID:???ミスった。
「} elsif ($email =~ /^[^@]+@[^.]+\..+/) {
じゃなくて
} elsif ($email !~ /^[^@]+@[^.]+\..+/) {
ってしろってことだけど、これでダメだったの? 」
でした。
0775nobodyおっさん
02/03/21 02:40ID:???また責められそうですが、助言として書いておきます。
762さんも「議論によって導き出され、より理解力が深まる」という認識ですので。
ユーザIDにドットを含んでいてもマッチします。
アットマークの後にアットマークがきてもマッチします。
末尾は何にでもマッチします。
0776774
02/03/21 03:43ID:???もちろん承知。助言さんきゅ。
ということで、いい加減な文字をemail欄に書いて書き込もうとする奴を
排除する目的じゃなくて、正しいメールアドレスしか受けつけないように
したいという目的の場合は、正規表現を改良するのもいいかも>>750
0777nobodyおっさん
02/03/21 04:00ID:???を知ることからはじめたほうがいいと思う。(特殊形式は除く前提で)
ということで、まずはメールアドレスのかんたんな構成を書いておきます。
[メールユーザID]@[メールサーバドメイン名]
0779nobodyおっさん
02/03/21 04:23ID:???を考えると、だいたい文字数は4〜10が妥当な線ダロウ。
文字の種類としてはなんといっても[@.]の2種類は含まないということで
[^@.]が考えられる訳だが、普通は[a-zA-Z0-9_-]あたりが使われる場合がほとんど
ということからエスケープシーケンスを使って表すと[\w-]と考えられる。
0780nobodyおっさん
02/03/21 04:33ID:???を見たことあるから余裕をもって3〜15と考えるのもいいネー。
つまり前段から /^[\w-]{3,15}@ の部分までは正規表現は決まったことになる。
0781nobodyおっさん
02/03/21 05:12ID:???762さんが言うようにいきなり最後まで書いてしまうのはチョットですぎた
行為というものです。考える余地を与えることも勉強になるものです。
それはそうとして、「正規表現道場」っていつのまにかなくなったのかナ?
あればそっちにメアドの正規表現ぐらいのってるだろうに。閑古鳥が鳴いてた
ようだから無理もないかー。
0782nobodyさん
02/03/21 05:26ID:???まだいきてるみたい。
http://pc.2ch.net/test/read.cgi/php/996105815/l50
0783nobodyおっさん
02/03/21 05:38ID:???電球
0784nobodyさん
02/03/21 07:03ID:???わかりやすく記載しているサイトってありますか?
ActivePerl入れてもなんか上手くいかなくて...
0785親切紳
02/03/21 07:18ID:???インストールはできたんだね。
じゃあ、コマンドプロンプト開いて
perl test.pl
とか入力すればtest.plが実行されるよ。
0786nobodyさん
02/03/21 07:29ID:???大口叩いてもその解答じゃ結局>>754より役に立たんな。(藁
>>763の言うとおりそれならモジュール使ってついでに送信テストまでするほうが速い。
まともに解答する気ないんなら解答者につっかかるなや。迷惑。
>>784
http://www5a.biglobe.ne.jp/~n_rieko/
0787nobodyさん
02/03/21 07:46ID:p3ZJIC7Xhttp://www.din.or.jp/~ohzaki/perl.htm#Mail
0788nobodyさん
02/03/21 09:40ID:???>この助言を書いた途端にどなたかがいきなりつっかかってきた上に非難されるのはこちらも困ります。
>生半可な知識だったら書かないほうがいいということを言いたかっただけ。
>できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは?
がホンネなんだろ?(藁
0789nobodyさん
02/03/21 09:42ID:???[\w-]は[\w\-]じゃなくていいの?
0790nobodyさん
02/03/21 10:14ID:???>生半可な知識だったら書かないほうがいいということを言いたかっただけ。
>できもしないのに嘘をはずかしげもなく語るほうがよっぽど迷惑なのでは?
んな事書くんだったら、http://www.puni.net/~mimori/rfc/rfc2822.txt
でも見てからスペック決めろよ。
0791nobodyさん
02/03/21 11:40ID:???local-part = dot-atom / quoted-string / obs-local-part
だから
$word = qq<(?:$atom|$quoted_str)>;
$local_part = qq<$word$X(?:$Period$X$word$X)*>;
では駄目。
0792nobodyさん
02/03/21 12:03ID:???PerlってCGI以外で何かに使います?
0793nobodyさん
02/03/21 12:07ID:???$_{manco}
と、するべきか、
$_{'manco'}
どっちだ?
0795nobodyさん
02/03/21 12:14ID:???元々レポート作成言語。
そのため文字列操作が異様に発展。
CGI使いからはマイナーだがレポートのテンプレートを指定する機能も。
と、言うか、
Perlってレポート作成以外で何に使います?
CGIとかです。
が正しい。
0797nobodyさん
02/03/21 12:15ID:???自分がよく作るのはなんちゃらコンバータとかかなぁ。
HTMLから,ある規則に従ってリンク抜き出したりとか。
>793
どっちも変わらないみたいなので,私は短い前者を使う。
■ このスレッドは過去ログ倉庫に格納されています