トップページ⇒php
1001コメント404KB

Perlコーディング初心者質問スレ Part 60

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/09/03(木) 23:51:12ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1234752149/
0116nobodyさん2009/09/28(月) 20:04:40ID:???
>>115
早速のレスありがとうございます。
キーは分かってるんですが、それを毎回(メールフォームの項目が変わるたびに)Perlに記述していくのは面倒なので、
自動的にできないかと思って、メールフォームを作り直してます。

しかし、未選択のradioとかcheckboxのキーが送信されないという、
思わぬところでつまづいてしまいました。
0117nobodyさん2009/09/28(月) 20:16:08ID:???
考え方が、根本的に違っている気がする。
0118nobodyさん2009/09/28(月) 20:42:32ID:???
>>116
Perlとは直接関係ないけどさ、そうゆう場合はフォームのHTMLで、
全てのradioとかcheckboxにデフォルトの項目作って
checked="checked" とかしとくんじゃないのかな。

ただ、逆の使い方するほうが一般的な気がする。
例えば、必ず入れないといけないcheckやradioをあえて空にしといて、
そこをcheckしないと次のステップに進めないようにするとか、
"規約に同意「する」「しない」"で、「しない」にデフォルトでcheck入れとくとか。

これで、ある程度だけど自動スクリプトやロボットなんかの連投や、
一般ユーザーのボタン連打(いや、ほんとにいるんだって、極たまにだけど)
とかで、不意に高負荷になったりしないで済むし、なによりユーザーに
ちゃんとした入力を促すほうが大事かと思うが・・・。
0119nobodyさん2009/09/28(月) 20:47:50ID:???
sendmailで送信した宛先不明のメールをfromに指定したアドレスに返信したいのですが、
どのように設定したらいいのでしょうか? サーバーはlolipopです。
01201142009/09/28(月) 20:52:28ID:???
レスありがとうございます。

>>117
そうかもしれませんね。

>>118
おっしゃられることは分かります。

しかし、デフォルトでcheckedは設定してますが、checkboxやmultipleなselectは、
チェックを外すことができるんです(radioを除く)。

チェックを外すと、キー自体が送信されないので、
(キーをPerlに直接明示しない場合は)Perlでエラーを吐き出すことすらでません(JavaScriptでは可能ですが)。

PerlからメールフォームのHTMLを読み込んで、
nameを上から順に抽出して配列に代入する方法しかないかもしれませんね。
01211142009/09/28(月) 21:02:56ID:???
最終的に何がやりたかったかと言うと、Perl内の記述を一切いじることなく、
HTMLを変えるだけでメールフォームが簡単に作れるものを作りたかったんです。

そのHTML内の項目を読み取って、自動的にエラー画面・確認画面・自動返信メールが生成される感じです。
必須項目とか再入力が必要な項目とかもHTMLのみの変更で完結できるものです。
0122nobodyさん2009/09/28(月) 21:47:25ID:???
色々フレームワークをあたれば、そんなのもあるんじゃないか。
普通はデータベースのテーブルからフォームを起こすと思うけど。
0123nobodyさん2009/09/28(月) 22:09:35ID:Abs+b0wT
BBSのcgiについて質問です
海外からの書き込みを拒否にしたいです
多分このファイルがアクセスチェックのファイルだと思うのですが…
↓のプログラムで国内のみを通すにはどういじったら良いのでしょうか?
まだまだ勉強中なので指導していただけないでしょうか
よろしくお願いいたします

次レスにプログラムです
0124nobodyさん2009/09/28(月) 22:11:47ID:???
(^ω^)
0125nobodyさん2009/09/28(月) 22:13:49ID:Abs+b0wT
すみません、長すぎると出たので斧にあげました

ttp://www1.axfc.net/uploader/File/so/31637
0126nobodyさん2009/09/29(火) 00:16:08ID:???
>>116
スレちの希ガス。
毎回記述が面倒といっても、毎回記述するしかないのでは。
条件設定をするファイルを外部txtデータに書いておくとか。コード本体は変えないで済むように。
HTML::Parserなどを使って、htmlを丸ごと読み込んで、どんな入力項目があるかを解析するプログラムを外部で作ったらいかが。
htmlの中に条件指定をすると、いくらでも改ざんできてしまう。PCに保存してソースを書き替えて送信するとかできる。HTTP_REFERRERで確認しようにもクライアント側でどうとでも名乗れる。

>>119
envelopeアドレスを指定したらよろしい。
sendmailコマンドなら-fアドレス、Net::SMTPなら$smtp->mail(アドレス);
Mail::Sendmailならsendmail(Sender=>アドレス)のキーを渡すとセットされるみたい。
0127nobodyさん2009/09/29(火) 01:44:13ID:l3KIzeZ6
>>120のスクリプトに関するポリシーが間違ってるに一票。

>>118
チェックボックス外されたらアウトだし、
checkboxでF5回避できるとか、脳内で書いてるだろ。

> ちゃんとした入力を促すほうが大事かと思うが・・・。

チェックボックスのチェックを外すのはちゃんとした入力です。
で、キーは帰ってきません。

>>126
つYAML/JSON

パーサなんか使わなくても
perl -pe 's/</\n</g' foo.html | grep -i '\<input' | perl -ne '/<(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $M=$1 ; $M =~ tr/"//d ; print "$M\n";'

とかで充分じゃね?

渡された値のキーに依存するのは気持ち悪いというのは同意。
0128nobodyさん2009/09/29(火) 01:47:48ID:???
あ、grepいらねーな。print "$M\n" if $1でいけるかな?脳内ですまん。
0129nobodyさん2009/09/29(火) 01:50:43ID:???
ついでにtr/'\''"//dだし。これ以上修正するのめんどいからあとは任せた(誰に?)
0130nobodyさん2009/09/29(火) 02:05:25ID:???
結局ヒマだから書き直した。うざくてすまん。

perl -ln074e '/(?:input|select|textarea) [^>]*?\s+name=([^ >]+)/i; $_=$1 ;tr/'\''"//d;print if $1' foo.html
0131nobodyさん2009/09/29(火) 04:08:59ID:???
その辺はHTML::Formで取れるよ。
0132nobodyさん2009/09/29(火) 12:39:33ID:???
Module を作るのも手かもね

$form = HTMLFrom->new('POST', './test.cgi');
$form->setfield('hidden', 'action', '1');
$form->setfield('checkbox', 'sel', '1000');
$form->setfield('checkbox', 'sel', '1500');

ってやって、
$form->printform;
で表示するとか。

で、受け取りのときには
$form にはキーが保存されてるようにして、それを見れば一目瞭然みたいな感じ。



HTML::From がそうなのかもしれないけどw
0133nobodyさん2009/09/29(火) 19:44:30ID:AG6/8zJV
質問です。
$hogeにいろいろ含まれる<input type="text" name="iroiro" />のiroiroを
$q->param($1)に置換したいんですが可能でしょうか?($1はいろいろ変わります)

※$q->param($1)には、そのnameのvalueが入ってます。

while ($hoge =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$q->param($1)/s) {
}

こうやっても、当たり前ですが$q->param($1)が入ってるのでエラーになります。
でも、$value = $q->param($1)のようにしてから、その後の正規表現をどうすればいいのか分からないんです。
どうかお願いします。
0134nobodyさん2009/09/29(火) 20:00:59ID:AG6/8zJV
あ!すみません!できました!
while ($form =~ /<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/s) {
$value = $q->param($1);
$form =~ s/<input.*?type=\"text.*?name=\"(.*?)\".*?\/>/$value/s;
}
0135nobodyさん2009/09/29(火) 20:09:10ID:???
>>133
$hoge =~ s|(<input.*?type=\"text.*?name=\")(.*?)(\".*?/>)|$1.$q->param($2).$3|egs;

- e (Eval) 修飾子 (modifier) を付けると、その中が「式」として解釈されます。
- g (Global) 修飾子 を付けると、何度でもマッチを繰り返します。
0136nobodyさん2009/09/30(水) 04:32:12ID:???
$qが気になるな。エスケープとかしとかなくていいのか。
0137nobodyさん2009/09/30(水) 12:15:20ID:???
>>136
つeオプション
0138nobodyさん2009/09/30(水) 16:57:25ID:???
ごめん、言葉が足りなかった。
$qがCGI.pmのオブジェクトだったら、XSS脆弱性に気をつけようってこと。
ただのお節介かも知れないけどさ。
0139nobodyさん2009/09/30(水) 19:03:47ID:???
ちょっとお尋ねします。

-環境
winXP IE8
AN HTTPD + perl 5.8.8 (active perl)
-----------
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;

IEの「ダウンロード出来ません」とかいうエラー発生
-----------
my $str = 'テスト';
print "Content-type: text/html\n\n";
print $str;

問題なし
-----------
もしかしてIE8ってtext/plain表示出来ないんでしょうか?
0140nobodyさん2009/09/30(水) 19:11:04ID:???
糞環境乙。
IE のせいにすれば解決すると思ってる?
0141nobodyさん2009/10/01(木) 04:28:26ID:???
AN HTTPD は棄てろ
0142nobodyさん2009/10/01(木) 09:22:24ID:???
いい加減Windows厨はAN HTTPDもActivePerlもゴミ箱に突っ込んで
CoLinux立てて環境作れ。サービス&自動起動にしてしまえば遠くにLinuxマシンが
あるのと全く区別がつかん。パフォーマンスもそっちのがずっと高い。
そろそろいい加減にしないと時代に取り残されるぞ。

ちなみに>>139のようなことで騒いでるやつが居たから見てやったら

Content-Type: text/plane

になってた。飛ぶ気か。
0143nobodyさん2009/10/01(木) 09:50:29ID:???
Windows環境でしか使わないしなあ。
0144nobodyさん2009/10/01(木) 10:58:18ID:???
>>139
ダウンロードしようとするのはIEの昔からの挙動だね。
確か512バイト未満はダウンロードするんじゃなかったかな。
リクエストするアドレスの最後にスラッシュをつければ回避できる。

IEは昔から問題を抱えてるブラウザだから、テストに使わない方がいい。
AN HTTPDも昔と変わってなければ問題を抱えてると思う。
設定が面倒だと思うだろうけど、Apache等で信頼性の高い環境を構築した方が
トータルで考えると楽だよ。
0145nobodyさん2009/10/01(木) 12:25:45ID:???
>>144
アドレスの最後にスラッシュ付けたら表示されました。
IEだと512バイト未満の不具合があるんですね。
Content-Type無視の方かなと思ってたんですが。

[無視できない]IEのContent-Type無視 − @IT
http://www.atmarkit.co.jp/fcoding/articles/webapp/02/webapp02a.html
2008/7/2 - Internet Explorer 8 のセキュリティ : 総合的な保護
http://msdn.microsoft.com/ja-jp/ie/dd218483.aspx
2008/9/3 - Internet Explorer 8 のセキュリティ Part VI: Beta 2 の更新項目
http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx

AN HTTPDが古いっていうのも気になってたので
これを機にApache入れようと思います。
ありがとうございました。
0146nobodyさん2009/10/01(木) 12:28:42ID:???
IEって、昔、受け取ったデータの頭512バイトをちょんぎってしまう
バグがなかったっけか。あれの亜種かな?
0147nobodyさん2009/10/01(木) 12:44:02ID:???
$|=1
で解決出来たりねw
0148nobodyさん2009/10/01(木) 13:14:47ID:???
>>147
$|=1;
my $str = 'テスト';
print "Content-type: text/plain\n\n";
print $str;
$|=0;

これで使い方合ってますか?
これでもIEのエラーは変わりません。
Firefoxだと問題なく表示されます。
0149nobodyさん2009/10/01(木) 13:34:45ID:???
charset まで丁寧に指定してみては?
0150nobodyさん2009/10/01(木) 16:54:23ID:???
>>149
my $str = 'テスト';

#print "Content-type: text/html\n\n"; #OK
#print "Content-type: text/plain\n\n"; #NG
#print "Content-type: text/plain;charset=Shift_JIS\n\n"; #NG
print "Content-type: text/plain;charset=EUC-JP\n\n"; #NG

print $str;
#print "a" x 512; #NG
#print "a" x 1024; #NG
print "a" x 10240; #NG

charset指定しても変わらずです。
ついでに512バイト以上出力してもNGでした。
FirefoxはいずれもOK。
うちのIE周りがおかしいだけなんでしょうか?
0151nobodyさん2009/10/01(木) 18:10:20ID:???
>>150
my $str = 'テスト';
print "Content-type: text/plain; charset=Shift_JIS\n";
print "X-Content-Type-Options: nosniff\n\n";
print $str;

http://msdn.microsoft.com/ja-jp/ie/dd218497.aspx

IE8で、Content-typeに従わない機能が高性能化してるみたいだね。
Microsoftの製品だから、今度からは製造元のMicrosoftに聞いて欲しい。
IEに関わると不幸になるから。
0152nobodyさん2009/10/01(木) 18:27:00ID:???
これ試したらどうなる?うまく行ったApacheの出力そのままなんだけど。
3とか0とかは気にしないように。改行コードはCRLFで保存してね一応。

----------
#!/usr/bin/perl
print <<EOF;
Date: Thu, 01 Oct 2009 00:00:00 GMT
Server: Apache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/plain

3
aaa
0

EOF
0153nobodyさん2009/10/01(木) 19:30:54ID:???
>>151
これで普通に表示出来ました。
ちょっとスレ違いになってしまって申し訳ないです。

皆さん、ありがとうございました。
0154nobodyさん2009/10/02(金) 00:57:54ID:???
質問が落ち着いたようなのでお伺いさせてください
>>123>>124はここではスレチなのでしょうか?
もしそうなら該当スレを教えていただけますでしょうか…
0155nobodyさん2009/10/02(金) 01:08:41ID:???
ここは自分でソース書く人のスレだから、確か改造スレみたいのなかったっけか。
01561232009/10/02(金) 09:02:45ID:???
>>155
ありがとうございます
改造スレを見つけたのでそちらでお伺いをたてます

>>123取消しします
お邪魔しました
0157nobodyさん2009/10/07(水) 14:00:07ID:???
知恵が足りないので教えてください。
フォルダ内のファイルの、連番が最大のものを別フォルダにコピーしようと思っています。

ファイル名は「@」で各要素が区切られているので、
foreach my $file(@files){
  my @fact = split /\@/,$file;
という風にして、連番=$fact[3]が最大のファイルを取得しようとしたのですが、
現在のコードはforeach{ max($fact[3]) }となっているので全く意味を為さず、
どこかで$fact[3]を配列に入れてやらないといけない事までは気付いたのですが、
その書き方がわかりません。

尚、$fact[0]と$fact[1]はキーボードからの入力で絞込み、$fact[2]に入る固有名詞は無視(というか、全て取得対象)でこの辺は上手く動いています。

よろしくお願いします。
0158nobodyさん2009/10/07(水) 14:33:21ID:???
>>157
有名なシュワルツ変換を使ってみてはどうでしょうか?

my @sorted_files =
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [$_, (split /@/, $_)[3]], @files;

my $target_file = $sorted_files[0];
0159nobodyさん2009/10/07(水) 14:48:08ID:???
>>157
別解
my $max=0;my $max_file;
foreach my $file(@files){
      $file=~/\@(\d+)$/;
      if($1>$max){$max_file=$file;$max=$1;}
}
01601572009/10/07(水) 17:53:04ID:???
>>158-159
ありがとうございます。
今日はちょっと手が出ないので、後日チャレンジしてみます。
0161nobodyさん2009/10/09(金) 20:37:40ID:QHm3Fnkr
中身が全て(先頭から末尾まで)半角英字である正規表現はどー書けば良いのでしょうか?
0162nobodyさん2009/10/09(金) 21:51:14ID:???
/^[a-zA-Z]+$/
0163nobodyさん2009/10/09(金) 22:59:18ID:???
ブログURLリストから大量のRSSフィードURLを拾う用事が生じました。
Feed::Findモジュールをついさっきインストールして試しに
http://www.geekpage.jp/programming/perl-network/feed-find.php
のコードをコピペして実行してみたら
[error] [client 127.0.0.1] Premature end of script headers
が…

どなたか原因が思い当たる方いらっしゃいませんか?
0164nobodyさん2009/10/10(土) 00:05:42ID:???
Apache(Web鯖上)で実行したなら、そのエラーの通りだろ。
コマンドラインからやってみ。
0165nobodyさん2009/10/10(土) 07:05:07ID:???
http://hogehoge.jp/test/archive/test3.html

こういった URL で、最後のファイルは CGI であったり HTML だったりするなかで
最後のスラッシュ以降の文字列を取得したいのですが、正規表現でどう書けば
いいのでしょう?

どう書いても最初の / から行末にしかマッチするものしか書けず、
Split で対応してるとこです
0166nobodyさん2009/10/10(土) 07:40:33ID:???
>>165
こんな感じかなー

m{[^/]+$}
0167nobodyさん2009/10/10(土) 11:35:43ID:???
もっと素直に書いたほうがいい

/.*\/(.*)/

最長マッチ使って .*/ と書くといちばん最後の / までにマッチするからそれ以降全部を取得すればいい
0168nobodyさん2009/10/10(土) 11:50:35ID:???
>>166の方が目的が明確で好きだな。
0169nobodyさん2009/10/10(土) 12:07:50ID:???
ベンチマークとったよ。ずれてたらごめんね。

          Rate >>165 >>166 >>167
>>165 119048/s    --  -53%  -69%
>>166 253165/s  113%    --  -35%
>>167 389105/s  227%   54%    --

というわけで、167が偉いという結論になりました。
01701692009/10/10(土) 12:09:42ID:???
補足しておくと、
僕も166のように書いてしまいがちです。
へぼコーダーです。
修行が足りない。
0171nobodyさん2009/10/10(土) 12:12:10ID:???
ちなみにコード
#!/usr/bin/local/perl
use strict;
use warnings;
use Benchmark qw/timethese cmpthese/;

my $results = timethese(1000000,
    {'>>165'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; @_ = split("\/",$url); $_=$_[-1];',
     '>>166'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~m{[^/]+$} ; $_=$&;',
     '>>167'=>'my $url= "http://hogehoge.jp/test/archive/test3.html"; $url=~/.*\/(.*)/; $_=$1;',
    },'none');
cmpthese($results);
1行が長くてごめんなさい。
01721612009/10/10(土) 13:58:31ID:viNfW09K
>>162
ありがとうござます。

もう1つ聞きたいのですが、全部カタカナである文字列のマッチはどう書くのでしょうか?(文字コード:utf8)
0173nobodyさん2009/10/10(土) 14:26:26ID:???
>>169-171
追試。

#!/usr/bin/perl -w
use strict;
use Benchmark qw(cmpthese timethese);
my $url = $ARGV[0];
my $results = timethese(-5, {
  split => sub { my $file = (split qr|/|, $url)[-1] },
  match => sub { $url =~ m|^(?:.*/)?(.*)\z|s; my $file = $1 },
  rmatch => sub { $url =~ m|([^/]*)\z|s; my $file = $1 },
  replace => sub { (my $file = $url) =~ s|^.*/||s },
  substr => sub { my $file = substr $url, rindex($url, '/') + 1 },
}); print "\n";
cmpthese($results);

__END__

> perl test.script "http://example.jp/path/to/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.30 usr + 0.00 sys = 5.30 CPU) @ 725417.52/s (n=3843262)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 2177060.73/s (n=11292414)
rmatch: 6 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 95000.19/s (n=497326)
split: 4 wallclock secs ( 5.16 usr + 0.00 sys = 5.16 CPU) @ 175469.36/s (n=904720)
substr: 5 wallclock secs ( 5.08 usr + 0.00 sys = 5.08 CPU) @ 3129401.38/s (n=15897359)

Rate rmatch split match replace substr
rmatch 95000/s -- -46% -87% -96% -97%
split 175469/s 85% -- -76% -92% -94%
match 725418/s 664% 313% -- -67% -77%
replace 2177061/s 2192% 1141% 200% -- -30%
substr 3129401/s 3194% 1683% 331% 44% --
0174nobodyさん2009/10/10(土) 14:28:02ID:???
> perl test.script "file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 720711.14/s (n=3862291)
replace: 6 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 5086089.07/s (n=26381544)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 840637.43/s (n=4361227)
split: 6 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 285616.14/s (n=1503769)
substr: 4 wallclock secs ( 5.31 usr + 0.00 sys = 5.31 CPU) @ 3257009.79/s (n=17301236)

Rate split match rmatch substr replace
split 285616/s -- -60% -66% -91% -94%
match 720711/s 152% -- -14% -78% -86%
rmatch 840637/s 194% 17% -- -74% -83%
substr 3257010/s 1040% 352% 287% -- -36%
replace 5086089/s 1681% 606% 505% 56% --

> perl test.script "http://example.jp/l/o/n/g/l/o/n/g/l/o/n/g/p/a/t/h/t/o/file.html"
Benchmark: running match, replace, rmatch, split, substr for at least 5 CPU seconds...
match: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 714051.59/s (n=3737346)
replace: 4 wallclock secs ( 5.25 usr + 0.00 sys = 5.25 CPU) @ 2172917.32/s (n=11405643)
rmatch: 5 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 63767.54/s (n=330826)
split: 4 wallclock secs ( 5.19 usr + 0.00 sys = 5.19 CPU) @ 85094.45/s (n=441470)
substr: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 3018419.40/s (n=15185668)

Rate rmatch split match replace substr
rmatch 63768/s -- -25% -91% -97% -98%
split 85094/s 33% -- -88% -96% -97%
match 714052/s 1020% 739% -- -67% -76%
replace 2172917/s 3308% 2454% 204% -- -28%
substr 3018419/s 4633% 3447% 323% 39% --
0175nobodyさん2009/10/10(土) 14:48:50ID:???
>>172
decodeしてるなら、

/^\p{InKatakana}+$/

でいけるかもしれん。
0176nobodyさん2009/10/10(土) 15:08:34ID:???
>>165

正規表現で書くなら

m{[^/] (.+) \z}xms

jk
0177nobodyさん2009/10/10(土) 15:51:30ID:???
>>172
/^[ア-ン]+$/;

ちったあ試せばいいと思うよ
01781652009/10/10(土) 17:18:28ID:ia/oAbqC
>>166
>>167
>>176→(訂正っす) m{\z\/(.*)} ですよね?

ありがとうございます。

# 最長でマッチさせたあとに取得
$url =~ /.*\/(.*)/;

# / 以外が続く行末まで
$url =~ m{([^/]+$)};

# 最後に見つかった / より後ろ
# \z 文字列の最後にマッチする。(Perl5.005以降)
$url =~ m{\z\/(.*)};


/.*\/(.*)/ を使わせていただきます。


今思えば、正規表現が今より苦手なころは
「めんどくせーから、行頭から欲しい部分の直前までマッチさせて、その残りをマッチさせて得てた」
と思い出しましたw

個人的には \z もなかなかいい感じなので、\z の存在を覚えていきたいとこ・・・
0179nobodyさん2009/10/10(土) 18:16:02ID:???
>>177
おまえもちったぁ試したらどうだ。UTF-8のマッピングがどうなってるかとかさ。
0180nobodyさん2009/10/10(土) 18:23:47ID:???
>>179
ここ↓を見て本人が好きな範囲を選べばいいよね

http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF
0181nobodyさん2009/10/10(土) 20:45:28ID:???
179が何にキレてるのか分からない
0182nobodyさん2009/10/10(土) 21:21:15ID:???
子供の頃、お菓子類をよく食べてると切れやすいという研究結果が出てたよね
0183nobodyさん2009/10/11(日) 02:16:07ID:???
>>181
ァヴヵヶの文字でコケるからだと思う。
0184nobodyさん2009/10/11(日) 03:03:33ID:SfXKxhoo
>>178
まとめ乙。
勉強になりました。

いまちょっと試せないけど、これはどうかな?

m|/(.*?)$|

ハテナは最短一致の修飾子だから、
たぶん動くと思うんだけど。
0185nobodyさん2009/10/11(日) 14:51:42ID:???
全体でマッチさせるように頭に".*"を付けるだけで速くなる。
しかし、単純な".*"が最速になるようにチューニングされてるのか、
>>167を超えられない。
文字クラスマンセーだったけど、考え直さないとだめかもダメだね。
0186nobodyさん2009/10/13(火) 19:54:24ID:???
use utf8とかしていなければ、正規表現使わないで書いたほうが速い気がする

それはそうと、URL末尾に/が来ないことは考えなくていいの?
read.cgi/とかco.jp/とか、サニタイズされてないhoge.html/.././とか。
他にも、用途によるけど、拡張子jpgのGIFでしたとか偽装したのは弾かなくていいの?
0187nobodyさん2009/10/13(火) 20:02:30ID:???
>>186
誤爆?
せめてレス番つけないと、何を誰に言ってるのか分からん。
0188nobodyさん2009/10/13(火) 20:22:13ID:???
超初心者ですが質問させてください。

メールアドレスの@の前のピリオドが付いているアドレスは、
正しくありませんとエラーが出るのですが、
正規表現?のエラーだと思うのですが、対処法がわかりません。

ネットで色々調べたのですが、文字列を追加するとか…
$mail_regexの後の文字列のどこに追加すればいいのでしょうか?
初歩的な質問で申し訳ないです。。環境はwindowsXPです。
0189nobodyさん2009/10/13(火) 20:45:03ID:???
エスパー1名様お呼びです
0190nobodyさん2009/10/13(火) 21:40:42ID:???
>>188
当方、エスパー度かなり高いほうですが、一つだけ質問させてください。
$mail_regexにどのような文字列が代入されているのか教えてください。
0191nobodyさん2009/10/13(火) 21:44:18ID:pHeszieI
>>188
$mail_regex = quotemeta($mail_regex);
0192nobodyさん2009/10/13(火) 22:26:16ID:???
>>188
ってか、RFC絡みの(メールサーバー側の)エラーじゃねえの、
ドコモ携帯宛てのメアドとか。
0193nobodyさん2009/10/13(火) 22:31:50ID:???
>>188
これでどうだ?

$mail_regex = 〜〜 . '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';
0194nobodyさん2009/10/13(火) 23:40:03ID:???
本来、@ の直前に . がつくメールアドレスはメールの規格として正しくない。
だからエラーとして弾く処理は正しい。
しかしDoCoMoとauがこの規格外のメールアドレスを正しいものとして扱ってしまっているので話がややこしい。
ぶっちゃけDoCoMoとauは氏ね。
という前提知識が必要な話ですね。
0195nobodyさん2009/10/14(水) 00:25:09ID:???
DoCoMoもauもこれから新しく 〜.@〜 ってなるアドレスは取れなくなってるよ
まあ、今までに取ってるアドレスは有効なんだけどね
0196nobodyさん2009/10/14(水) 00:29:50ID:???
>>188
正規の規格はともかく、はじかなくていいピリオドをはじいちゃっているわけで、
$mail_regexに文字列を追加するんじゃなくて、文字列を変更する必要があると思われます。
ので、ここにその$mail_regex後の文字列を書いた方がいい。
0197nobodyさん2009/10/14(水) 01:29:31ID:???
188です。
皆様レスありがとうございます。

そうですよね。$mail_regexにどのような文字列が入っているかわからないと
答えようがないですよね…。
いま自宅なので書けないんです。なんせめちゃくちゃ長かったので…
申し訳ないです。

>>193さんが書いている文字列. '|^[\w.-]+@(?:[\w-]+\.)+[\w-]+$';を追加すると解決しますか?
管理システム側でのエラーなので、変更して解決しないと、恐ろしい事になる可能性があるんです 汗
0198nobodyさん2009/10/14(水) 02:14:04ID:???
エスパーして、Perlメモの正規表現だとしたら、
"foo."@example.net
みたいにダブルクォートすれば解決すると思う。
0199nobodyさん2009/10/14(水) 09:51:32ID:???
188です。
文字列を書いたのですが、本文が長すぎて書き込めなかったので、分けて書かせていただきます。



$mail_regex = '[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*
(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+
(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
[^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*
02001882009/10/14(水) 09:56:21ID:???
すいません。。
長すぎてくじけました 汗
かなりのスレ汚しになってしまうので、やめておきます。
ありがとうございました。
0201nobodyさん2009/10/14(水) 10:44:33ID:???
codepadとか使やいいのに
0202nobodyさん2009/10/14(水) 22:18:23ID:???
いっそ尊敬するわ
0203nobodyさん2009/10/15(木) 18:04:11ID:YQ/YK35J
>>183
マジレスするとヶとヵはカタカナじゃない。箇の略字(个・ケ)が回りまわってそうなった。
一箇所→一ヶ所
ヶなのに「カ」と読むので、不思議に思った人が「ヵ」を使い出してそれも普及した。
ヶやヵを使う日本語のカタカナ語って存在しないだろ。

んで、UTF-8はuse utf8しないとメチャクチャになるし、旧来の正規表現(ァ-ン)だと「ー」や「ヴ」なんかを取りこぼすな。
\p{InKatakana}だろjk。

>>188
@の前に「.」が付いてるメールアドレスは正当じゃありません。アドレスの方が悪い。
プログラムのせいにすんな。

>>193
メアドの正規表現なめんな。>>199で短く書いた方だ。
http://www.din.or.jp/~ohzaki/mail_regex.htm#RFC

>>197
その正規表現自体、2chが文字変換する関係?か何かでコケるんだが、6行目の
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
を
(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*\.?@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff]
に変更してみ。ものすごいクイックハックだが@の前に\.?を挿入してある。
0204nobodyさん2009/10/15(木) 18:09:09ID:???
>>197
あ、最後の行に対応する括弧がないな。まだ続きあるだろそれ。まあ多分>>203で間に合うからいいけど。

さらにInKatakanaの中にはしっかりヶとヵが入ってるんだな。まあ昔からマの間ではカタカナ扱いされてたけど。
02051832009/10/15(木) 18:59:55ID:???
>>204
マジレスすると、unicodeではカタカナ分類なんだ。
30F5 KATAKANA LETTER SMALL KA
30F6 KATAKANA LETTER SMALL KE

http://www.unicode.org/charts/PDF/U30A0.pdf
0206nobodyさん2009/10/16(金) 18:38:09ID:???
use Email::Valid::Loose;
0207nobodyさん2009/10/20(火) 12:41:02ID:???
each関数でリファレンスで受け取ったハッシュを引数にしてwhileに入れて使ったのですが一回もループせずにそのまま脱出してしまいました。
何故ですか?keys関数を使うとちゃんと値が返ってくるので中身がないことはないはずです。
0208nobodyさん2009/10/20(火) 12:57:20ID:kwSavA/j
earch(%{$chanko})
02092072009/10/20(火) 13:06:53ID:???
>>208
成る程、そうやって書くんですね!
解決しました、どうもです
0210nobodyさん2009/10/20(火) 20:18:27ID:???
こうしてエスパーたちは鍛えられていく
0211nobodyさん2009/10/20(火) 21:38:06ID:kwSavA/j
いや自分も初心者だから想像はついたw
0212nobodyさん2009/10/20(火) 22:24:14ID:???
初心者perlerは引かれあう・・・
0213nobodyさん2009/10/22(木) 06:34:07ID:???
えっとものすごい初歩的というかperlというものを知ったのが昨日なので
できるかどうかが知りたいだけなのですが、質問です
とあるCGIゲームでマクロというものを使うと楽という話を聞き、やってみようと思ったわけです
ですがどうも既存のツール等では上手くいかず、それならプログラムを自作してみようと思い立ったのですが
範囲内の色に反応して数をカウントしていくようにしたいのですが、こういうことは可能なのでしょうか?
0214nobodyさん2009/10/22(木) 07:51:32ID:???
とあるCGIゲーム、だけじゃ答えようがないような。
CGIゲームを提供する方なのか、それとも解く方なのか。
後者だとして、「CGIゲーム」といいつつ実はJavaアプレットだったりFlashだったりしそうな予感。
単純にHTMLを対象にどうこうするだけならJavaScriptが最適っぽい気がするが…たぶん関係ないな。
0215nobodyさん2009/10/22(木) 08:44:03ID:???
CGIゲームをプレイする側ですね
具体的に何をしたいのかは
画面内から特定の色を検出して、その出現回数をカウントしたあとに結果を表示するものなのですが・・・
特定の色の検出が調べてもわからなかったので質問してみたのですが・・・
■ このスレッドは過去ログ倉庫に格納されています