Perlコーディング初心者質問スレ Part 39
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
04/11/27 11:35:03ID:DJwiGeFM【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0002nobodyさん
04/11/27 11:35:47ID:DJwiGeFMCGI: Common Gateway Interface part 11
http://pc5.2ch.net/test/read.cgi/php/1055597189/
【Perl,CGI】参考書籍 第三版
http://pc5.2ch.net/test/read.cgi/php/1030209573/
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/
【 スクリプト改造依頼スレ 】(丸投げ) part2
http://pc5.2ch.net/test/read.cgi/php/1092304968/
△▲ WebProg 初心者の質問 Part10 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1095633323/
【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/
★負荷軽減対策委員会(Perl、PHP)★
http://pc5.2ch.net/test/read.cgi/php/1034645635/
【Perl】掲示板を使ろう!
http://pc5.2ch.net/test/read.cgi/php/988890976/
Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/
0003nobodyさん
04/11/27 11:36:08ID:???Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 http://pc.2ch.net/php/kako/1026/10269/1026977659.html
Part15 http://pc.2ch.net/php/kako/1028/10288/1028816385.html
0004nobodyさん
04/11/27 11:37:01ID:???Part16 http://pc.2ch.net/php/kako/1032/10320/1032070299.html
part17 http://pc.2ch.net/php/kako/1034/10345/1034583844.html
part18 http://pc.2ch.net/php/kako/1037/10377/1037797479.html
part19 http://pc.2ch.net/php/kako/1042/10422/1042260745.html
part20 http://pc2.2ch.net/php/kako/1044/10447/1044717887.html (タイトルに19と誤記)
part21 http://pc2.2ch.net/php/kako/1047/10479/1047980851.html
part22 http://pc2.2ch.net/php/kako/1050/10503/1050369328.html
part23 http://pc2.2ch.net/php/kako/1053/10530/1053051519.html
part24 http://pc2.2ch.net/php/kako/1054/10549/1054992610.html
part25 http://pc2.2ch.net/php/kako/1056/10567/1056730690.html
part26 http://pc5.2ch.net/php/kako/1059/10590/1059043704.html
part27 http://pc5.2ch.net/php/kako/1060/10608/1060808783.html
part28 http://pc5.2ch.net/php/kako/1063/10635/1063562491.html
part29 http://pc5.2ch.net/php/kako/1066/10662/1066286828.html
part30 http://pc5.2ch.net/test/read.cgi/php/1069846177/
part31 http://pc5.2ch.net/test/read.cgi/php/1072896288/
part32 http://pc5.2ch.net/test/read.cgi/php/1075545279/ (タイトルに31と誤記)
part33 http://pc5.2ch.net/test/read.cgi/php/1078076768/
part34 http://pc5.2ch.net/test/read.cgi/php/1081148490/
part35 http://pc5.2ch.net/test/read.cgi/php/1085557731/
part36 http://pc5.2ch.net/test/read.cgi/php/1089779036/
part37 http://pc5.2ch.net/test/read.cgi/php/1093106507/
part38 http://pc5.2ch.net/test/read.cgi/php/1097158988/ (前スレ)
0005nobodyさん
04/11/27 11:38:05ID:???[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/
[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/
[オンラインマニュアル]
Perldoc.com: http://perldoc.com
perldoc.jp: http://perldoc.jp
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/
[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
0006nobodyさん
04/11/27 19:29:38ID:yZ3pGjpn同じサーバーから取得しようとすると下記の情報だけしか取得できません。
今は、来たメールを別ドメインのアカウントへ転送して、
そのサーバーへ接続して取得しています。
ちなみにプロバイダの共用レンタルサーバー(FreeBSD)では
問題なく動作します。
なぜ同一サーバーから取得しようとすると
下記しか取得できないのでしょうか?
-mimemk00
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit
..(本文)..
--mimemk00
Content-Type: image/gif;
name="(添付ファイル名).gif"
Content-Transfer-Encoding: base64
..(以下添付ファイル)..
0007nobodyさん
04/11/27 19:45:57ID:/KXyQL2R掲示板で参加者募ってね
ttp://www.esuna.co.jp/chocobon/
0009nobodyさん
04/11/27 22:20:57ID:???関係ない文字に一致してしまいます(keywordがアルファベット一文字の時とか)。
これらを回避するにはどうすればよいのでしょうか?
sjisでやってます。
0010nobodyさん
04/11/27 22:32:48ID:???0011nobodyさん
04/11/27 23:57:09ID:???すいませんですた・・・
0012nobodyさん
04/11/28 01:30:44ID:UnlanLPTというような中身が順不同な配列があったとして、
cとeを配列から削除するにはどうすればいいのでしょうか?
0013nobodyさん
04/11/28 01:32:49ID:UnlanLPT順番ではなく、bやcといった、中身を見て削除する方法を教えてください。
0014nobodyさん
04/11/28 01:56:38ID:QZh49BOKperlメモ
0015nobodyさん
04/11/28 02:01:19ID:???削除したい要素がどれぐらいあるかにもよる。
その例の通りならこんなのでもいいし。
@list = grep(!/b|c/, @list);
0017!13
04/11/28 09:52:02ID:???その別の方法とはどんなものですか?
0018nobodyさん
04/11/28 11:26:37ID:???foreachで1周させつつ必要なものだけ別配列にpushするもよし。
1周させつつshiftとpushを繰り返すのもよし。
0019nobodyさん
04/11/28 14:12:35ID:???0020nobodyさん
04/11/28 14:43:17ID:???0024nobodyさん
04/11/28 16:48:00ID:???同時にアクセス -> スクリプトの開始(or ファイルのopen)が同時。
てな感じかねぇ。
話題がflockだからどっちでも通じると思うけど。
0027nobodyさん
04/11/29 02:47:51ID:???OOPっぽく書くの、どっちがパフォーマンス的に有利なんだろう。
一概には言えないだろうけど、一般論として。
0028nobodyさん
04/11/29 02:50:14ID:3ENBI+n/やっつけはベタ書き
0029nobodyさん
04/11/29 02:54:21ID:???そりゃOOPの方が不利。そのままソフトウェア設計の一般論に当てはまるかと。
(良く設計されたOOPのシステムはパフォーマンスが良いという事も)
ただしperl自体がそこそこでかいので、誤差程度でしかないと思うが。
0030nobodyさん
04/11/29 03:53:29ID:???特にHTML出力する部分はヒアドキュメントでずらずらと書かれてた方が
ぱっと見で解り易いしメンテも楽。
0031nobodyさん
04/11/29 04:14:04ID:???OOPはパフォーマンスを上げるためじゃなく開発性を上げるためのもの
確かに>>30のいうようにOOPにすると逆に小難しくなるのも確かだね
OOP自体は遠回りしてでも処理を分割するから
無駄に変数定義してたりするけど
よほどのことがない限り差が出たりはしないんじゃないかなぁ
0032nobodyさん
04/11/29 08:55:50ID:???あれ見やすいってことだろうけど、漏れは、ぜんぶメインで書く。
実際、ベンチやると、メインだけの方が速いんだよな。余りやったこと
ないが、別ファイルにしたモジュールのインクルードはさらに遅くなる
と思われ。
0033nobodyさん
04/11/29 09:29:08ID:???0034nobodyさん
04/11/29 10:04:31ID:???0035nobodyさん
04/11/29 11:19:34ID:vhU7fwVw$value =~ s/[\x00-\x20]+/ /g;
の記述についてです。
これはどのような意味を持つのでしょうか?
0036nobodyさん
04/11/29 11:22:53ID:???0037nobodyさん
04/11/29 11:26:06ID:???0038nobodyさん
04/11/29 11:30:40ID:???0039nobodyさん
04/11/29 11:33:46ID:???せいぜいデカいやつで100ステップ超えるぐらいだな。
0040nobodyさん
04/11/29 12:15:29ID:???0041nobodyさん
04/11/29 13:17:08ID:???馴染めなくて結局シェルとsedとawk一辺倒だった。
今思えばあの時ちゃんとやっとけば良かった。
0042nobodyさん
04/11/29 13:28:07ID:???その時は一回しか使わなくてもサブルーチンを作っておくことは良くある。
>>41
今からでも遅くないからがむばれ。
0043nobodyさん
04/11/29 13:53:05ID:???2. よく似てるが少しだけ違う処理のスクリプトを何本か copy&paste で作る
3. 共通部分に仕様変更が発生する
4. copy&paste したところをスクリプトの数だけ書き直し、嫌気がさす
5. サブルーチン化する
てのが誰でも一度は通る道だと思ってたんだが、ひょっとして漏れだけ?
0044nobodyさん
04/11/29 14:05:25ID:???OOPの書き方も人それぞれだから結局見にくいことに変わりはないケースもある
そもそも再利用するための書き方だからね
0046nobodyさん
04/11/29 14:45:43ID:???しかしレンタルの共用サーバとなると結構気になる。
実際、仕事より趣味のWebプログラミングの方がシビアだったりする。
0047nobodyさん
04/11/29 14:53:51ID:???javaはモデリング命だし、Cの場合は当然モジュール化しっかりやる。
でもperlだと・・・。
0048nobodyさん
04/11/29 21:07:05ID:???0049nobodyさん
04/11/29 21:07:26ID:???人格まではどうかはわからないけど、その言語の慣習に従う傾向はあると思う。
言語自身がそういった特定の用途向けに設計されてたりする事もあるから、言語毎に切替えるのが適切な対応なんじゃないかな.
細かいところでは、コーディングスタイルや変数/関数の命名規則なんかでも、その言語の標準に合わせたりするよ。
>>32
コストの判断を誤ってるような気がする。
関数呼出のオーバーヘッドの為、関数定義して使う方が遅いのは当然だけど。
ベンチ取ったとしても数千回回して1秒に届くかどうかの誤差の範囲内では?
ループ内で何度も呼ばれる関数ならインラインで展開する価値はあるかもしれない、
でも、一度しかつかわれないのなら、コードのみやすさとか保守性の方を優先させるべきだと思う。
0050nobodyさん
04/11/30 01:16:47ID:???言語によって変えるのは普通じゃないかな
逆に無理やり同じように書く方がプログラマに向いてない
0051nobodyさん
04/11/30 11:00:35ID:???エディタないですかね?
perlでコーディングする時、みんなどんなエディタ使ってるんだろ。
0052nobodyさん
04/11/30 11:03:00ID:???http://pc5.2ch.net/test/read.cgi/php/1014357485/l50
0053nobodyさん
04/11/30 11:10:45ID:???まあ精度はそれなり程度。
ちなみに俺は秀丸かvimでゴリゴリ書いてる。
0054nobodyさん
04/11/30 17:32:30ID:???他にそういう文字ありますか?
0055nobodyさん
04/11/30 19:53:20ID:???http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm
0056nobodyさん
04/12/01 01:41:08ID:???音引き記号だぞ
0058nobodyさん
04/12/01 07:54:01ID:???0059nobodyさん
04/12/01 15:56:42ID:???普段は仕事でシステム設計するしプログラミングもやる。
でも、いざWebをやろうとしたらHTMLよくわからない、CGIもよくわからない、perlもよくわからない。
CやjavaやVBならどんと来いなのに、業務アプリならおまかせ!なのに、なんか情けない・・・
そんな経験ないですか?
0060nobodyさん
04/12/01 16:00:30ID:???そういう時は勉強するんじゃないんですか?
0061nobodyさん
04/12/01 16:01:35ID:???0062nobodyさん
04/12/01 16:12:14ID:???知らなくても恥ずかしくない。必要なら勉強するかって感じだな。
「お前SEなんでしょ?ちょっとCGIってやつHPに置きたいんだけど協力して。」
って言われて「あ、そういえば良くわかんねーや」ってのがキッカケだった。
0063nobodyさん
04/12/01 16:24:25ID:???ヒアドキュメントのHTMLがどんどん長くなっていっちゃって・・・
0064nobodyさん
04/12/01 16:32:42ID:???自分の、あるいはそのスクリプトをメンテする人の技量ならびに忍耐力と相談して決めろ。
俺ならヒアドキュメント全廃して HTML::Template 使うが。
0065nobodyさん
04/12/01 16:57:25ID:???HTML::Template使う場合って、テンプレートを別ファイルにするか、
ソース内に組み込んでおくか、どちらがいいでしょうね?
余計なファイルアクセスは避けたいところ。
いずれにしてもHTML::Template使った事無いので、いったん今の状態で設置して、
テンプレート化も同時に進めてみます。
0066nobodyさん
04/12/01 17:22:27ID:???俺の作ったのなんか7486行あるぞ。
実行ステップ数は計ってないからわからんが。
その内、ヒアドキュメントは・・・どんくらいだろ。
別に長くてもいいんじゃね?
ヘタにいじくりまわして可読性が悪くなっても意味ねーし。
あと、実装してる機能にもよるだろ。
0067nobodyさん
04/12/01 17:25:59ID:???俺の環境で10000行ぐらいのやつでベンチマークとってみたら、
ヒアドキュメントにするよりも別ファイルにした方が20倍ぐらい速かった。
perl が立ち上がってスクリプトをコンパイルするときに
ヒアドキュメントの中まで構文解析するので、それに大きな時間を食われるのだと思う。
ただし環境によって違ってくる話だと思う。
コンパイル速度はCPU依存で、ディスクアクセス性能はHDD依存なので、
CPUが圧倒的に速くてHDDが無闇に遅いマシンだと、また違った結果が出るかもしれない。
0068nobodyさん
04/12/01 17:34:38ID:???うお、マジかよ。いくら環境次第とはいえ、そこまで変わるってのもすげーな。
0069nobodyさん
04/12/01 17:41:19ID:???場合だと、外部ファイルに分離した方が使うもの1つだけ
読めばよいのでお得てなこともあるかもしれんな。
0070nobodyさん
04/12/01 18:32:57ID:???オプションを適切に設定すれば、普通に埋め込むより速くても不思議じゃないよ、
HTML::Templateでも、ファイルからの読み込みは初回のみで、共有メモリにキャッシュを置く事とか出来る。
原理的にはメモリにキャッシュするのが最速なはずだし。
メモリと引き替えに実行速度重視とする場合は、
スワップとか発生すると逆にパフォーマンス低下するので、
コンテンツの規模、アクセス/更新の頻度、実行環境等を考慮して
パフォーマンスチューニングされてるのが前提だけど。
逆に言うと、こういった条件を無視して、
埋め込むほうがいいか、別ファイルに分ける方がいいかというのは、一概に判断出来ない。
条件次第では速くも遅くもなるのだから。
>>67
それくらいの規模になると、使われない処理のコードも毎回読み込まれてたりしないかな。
mod_perlだとまた結果がかわってきそう。
0071nobodyさん
04/12/01 19:47:44ID:ZtAPmMKL解決方法を教えてください。
どのスレで聞けばいいのか分からなかったので、スレ違いなら誘導をお願いします。
【症状】HTMLに埋め込むタイプの画像カウンタなのですが、カウンタが表示されるはずの場所に何も表示されません。
カウンタのCGIをアドレスバーに直接打ち込んだら、それは正しく表示されました。
CGI側の出力
Content-type:text/html\n\n
<HTML>
<IMG SRC="数値画像"><IMG SRC="数値画像">・・・(中略)
</HTML>
HTMLファイル側の記述は以下の二つを試しました。
1:<!-- #exec cgi="./count.cgi" -->
2:<!-- #include virtual="./count.cgi" -->
【環境】Apache 1.3.29(ローカルサーバー)
「 Includes 」 「 ExecCGI 」 設定済。
「 AddType text/html .html
AddType server-parsed .html 」 設定済。
0072nobodyさん
04/12/01 20:00:32ID:???>HTML::Templateでも、ファイルからの読み込みは初回のみで、共有メモリにキャッシュを置く事とか出来る。
マジ?
mod_perlでなくてもOK?
レン鯖だとどうなんろう。
0073nobodyさん
04/12/01 20:02:18ID:???1:<!-- #exec cgi="count.cgi" -->
2:<!-- #include virtual="count.cgi" -->
これでどうだ?
0074nobodyさん
04/12/01 20:05:08ID:???IPC::SharedCache無いとダメか・・・。流石にうちのレンタルサーバにはインストールされてなかった。
007571
04/12/01 20:13:12ID:ZtAPmMKLすいません、結果は変わりませんでした。
0076nobodyさん
04/12/01 20:39:49ID:???<!--#include virtual="count.cgi" -->
<!-- と # の間を詰める。のがポイント。
というか、Perlの問題じゃないじゃん。
0077nobodyさん
04/12/01 21:12:33ID:???すでにperldoc読まれたかと思うけど、
一応捕捉しておくと、mod_perlじゃなくてもOk, ただし、shared_cacheオプションを使う場合はIPCが必要.
共有サーバーだとしたら、資源の独占は返ってサーバー全体のパフォーマンスを落しかねないので。
もし使えたとしても、file_cacheに留めておくのが無難だと思う。
0079nobodyさん
04/12/01 23:30:32ID:???0080nobodyさん
04/12/02 01:00:15ID:???0081nobodyさん
04/12/02 05:32:13ID:???0082nobodyさん
04/12/02 12:10:08ID:WEQP3q+X●先頭から16個目のデータをキーにしてソートする場合
@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15]} @address;
●先頭から16個目のデータを1次キー、3つ目のデータを2次キーとしてソートする場合
@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15] or (split(/,/,$a))[2] <=> (split(/,/,$b))[2]} @address;
ここで、ソート部をサブルーチン化しろとの上司の命令。以下のように書いてみました。
#&datasort(データの型,並べ順,並べ替え時のキー,配列)
#データの型:数値は1、文字列は2
#並べ順:昇順は1、降順は2
#並べ替え時のキー:先頭は0、3番目なら2、5番目なら4という具合。
@address = &datasort(1,1,15,@address);
#並べ替え部のルーチン
sub datasort{
#$format:数値は1、文字列は2 $order:昇順は1、降順は2 $key:ソート対象のキー、先頭は0、5番目なら4など。
my ($format,$order,$key,@data) = @_;
if($format == 1){
if($order == 1){@data = sort{(split(/,/,$a))[$key] <=> (split(/,/,$b))[$key]} @data;}
elsif($order == 2){@data = sort{(split(/,/,$b))[$key] <=> (split(/,/,$a))[$key]} @data;}
}elsif($format == 2){
if($order == 1){@data = sort{(split(/,/,$a))[$key] cmp (split(/,/,$b))[$key]} @data;}
elsif($order == 2){@data = sort{(split(/,/,$b))[$key] cmp (split(/,/,$a))[$key]} @data;}
}
return @data;
}
で、複数のキーを使ってソートする場合の呼び出し方がわかりません。
@address = &datasort(1,1,15,@address) or &datasort(1,1,2,@address);
だと、当然のことながらorより後ろは動かない。
誰か教えてくださいませ。。
それか、サブルーチンの書き方がおかしい?
0083nobodyさん
04/12/02 13:59:06ID:???試しに書いてみた。
sub csvsort {
my $arrayref = shift;
my @cmps;
while (my($n,$cmp) = splice(@_,0,2)) {
++$n;
$cmp =~ s/(\$[ab])/$1\->[$n]/g;
push @cmps, "($cmp)";
}
my $fcmp = eval("sub {" . join("||", @cmps) . "}");
map $_->[0], sort { &$fcmp } map [$_, split /,/], @$arrayref;
}
# @csvを「要素2を文字列昇順、要素0を数値降順」のオーダーでソート
@sorted = csvsort(\@csv, 2=>'$a cmp $b', 0=>'$b <=> $a');
0085nobodyさん
04/12/02 15:06:46ID:???会員制のサイトを作る場合、
ユーザー個々のデータを保存するのは、
CSV形式、それともユーザーごとにファイルを作成してハッシュ配列で保存、
どちらが妥当でしょうか?
例えばハッシュのイメージとしては、
Id 1
Pass 1234
Name A男
Age 42
Job 会社員
というように考えています。
CSVだと、
1, 1234, A男, 男, 42, 会社員
2, 5678, B子, 女, 30, 営業
・
・
・
(以下リストが続く)
↑こういう形式で良いのでしょうか・・・。
よろしくお願いします。
0086nobodyさん
04/12/02 15:12:42ID:???CGIが動いているサーバーの種類がWin系かその他系かを判定する方法ってありますか?
ファイル名を指定してファイル出力を行なうCGIがあるのですが、
Win系ですと大文字小文字関係なく既に存在するものと同名のファイルは作成できませんが、
Linuxとかですと、大文字小文字が区別されるので、作成可能にしようと思っています。
0087nobodyさん
04/12/02 15:43:37ID:???サーバの返してくるhttpヘッダにあるかもしれないので取得するとか、
cgiで環境変数SERVER_SOFTWAREを調べるとかPATHから想像するとか、
systemとかopenとか使えるんだったらperlのバージョンとかを出力させてみるとか、
サポートに聞くとか
008882
04/12/02 17:39:29ID:???>>83
動きませんでした・・・。
もう少し考えてみます。
本心では「本当にサブモジュール化しないといけないのか?」と思いつつ
上司にも逆らえず。
>>83
間違ってる?
returnを省略しても同じ結果なのはわかるのですが。
>>87
system関数が使えるなら、win系に存在しないコマンド(lsとかcatとか)を
実行させればいいと思うのですが。
system関数は中のコマンドが成功すれば0を返すので
unless(system "ls -l"){
Unix系のサーバーでやりたいこと
}else{
窓系のサーバーでやりたいこと
}
でできないかな。
0089nobodyさん
04/12/02 18:24:52ID:???それだったらOSを識別できるコマンドで一度識別してから作ったほうがいいだろー。
unameとかでもいいし。
いちいちunless云々すんのかい?
まぁあくまでsystemやらopenやら使えるなら。
009083
04/12/02 18:26:51ID:???動かないってのはエラーが出るってこと?
それとも正しくソートされないってこと?
一応、動作確認(ActivePerl5.8.4)済みなんだけど・・・
よければ動かない〜の詳細をレス頼んます。
0092nobodyさん
04/12/02 20:54:21ID:???datasortを使う方向で考えてみました。
速度は遅いしメモリ食うしー。
sub bogosort
{
use sort stable;
my ($key, @data) = @_;
foreach(reverse(@{$key})){
my ($format, $order, $key) = @{$_};
@data = datasort($format, $order, $key, @data);
}
return @data;
}
my @new = bogosort([[1,1,0], [1,1,4]], @data);
要素0の数値昇順、要素4の数値昇順でソート。
$keyは[(1:数値/2:文字列),(1:昇順/2:降順),要素]の配列のリファレンス。
0093nobodyさん
04/12/02 21:57:32ID:???初めの頃にケン○やらレス○やらばっか参考にしてたが、
あんなソース見てたらダメだな。
0094nobodyさん
04/12/02 22:01:06ID:???0095nobodyさん
04/12/02 22:06:47ID:???超人業でもなく、ダサダサでもなく、丁度いい感じのソースとおもふ。
0096nobodyさん
04/12/02 22:16:47ID:???いきなり Wiki 設置しようとか思わないだろう
0097nobodyさん
04/12/02 22:24:41ID:???0098nobodyさん
04/12/02 22:39:28ID:???0099nobodyさん
04/12/02 23:04:37ID:???んじゃなかろうかという気がするが、もしあったら漏れにも教えて
0100nobodyさん
04/12/02 23:16:40ID:???インラインでHTMLだーっと書いて、途中から条件分岐で何か処理して、
続きのHTMLをまただーっと・・・ってなる。
0101nobodyさん
04/12/02 23:25:32ID:???HTML::template使うとヘッダ、フッタ、フォーム、メッセージ表示部分、って感じに
分けることはできないから、同じようなテンプレートをいくつか用意する事になるし。
0102nobodyさん
04/12/02 23:58:35ID:???それはそれとして、昔 DBI (Pgsql) + Template Toolkit で掲示板作ったが、
コードのほとんどは入力チェック・サニタイズのための if やら s/// やらの羅列で、
あまりコーディングの勉強に使って欲しくない出来に仕上がってしまった経験がある。
0103nobodyさん
04/12/02 23:59:56ID:???my @str = qw(うんこだ 素敵 ばかみたいだ 楽だ);
print <<"EOM";
ヒアドキュメントに埋め込みができるなんて、
Perlは@{[ $str[int(rand(@str))] ]}よね。
EOM
0105nobodyさん
04/12/03 00:27:48ID:DFUzRW8vperlでブログは作成できますか?
また、何処かに参考サイト、
ソースのおいてあるサイト等があったらご教授ください。
0107nobodyさん
04/12/03 00:40:12ID:???0108nobodyさん
04/12/03 00:44:17ID:???0109nobodyさん
04/12/03 02:26:08ID:???もう全く別物。作り直したほうが早かったなこれじゃ。
0110nobodyさん
04/12/03 03:04:29ID:???Class::DBIと、Data::FormValidatorあたり使えば、
コーディングなんてほとんどしないで掲示板作れるよ。
コーディングの参考にはならんけどね。。
011182
04/12/03 06:16:55ID:???それもそうだな・・・スマソ
>>90
配列が空になります。
実際はここでソートしたものをファイルに書き出す処理があるのですが、0バイト。
CobaltにPerl5.005の組み合わせです。
これがよくないのかな。
あ、エラーは出ません。
>>92
ありがとうございます。
会社でやってみます。
0112nobodyさん
04/12/03 09:03:42ID:dEjygVC1会員制のサイトを作る場合、
ユーザー個々のデータを保存するのは、
CSV形式、それともユーザーごとにファイルを作成してハッシュ配列で保存、
どちらが妥当でしょうか?
例えばハッシュのイメージとしては、
Id 1
Pass 1234
Name A男
Age 42
Job 会社員
というように考えています。
CSVだと、
1, 1234, A男, 男, 42, 会社員
2, 5678, B子, 女, 30, 営業
・
・
・
(以下リストが続く)
↑こういう形式で良いのでしょうか・・・。
よろしくお願いします。
0113nobodyさん
04/12/03 09:16:50ID:???設計考えてどうすか?ってのは
△▲ WebProg 初心者の質問 Part11 ▼▽
ttp://pc5.2ch.net/test/read.cgi/php/1101635909/
こっちが妥当だと思うが。
011482
04/12/03 10:50:46ID:???ダメでした。。
use sortでInternalServerError。
サーバーアナライザーで見ると、sortと書かれたモジュールが見つからないのですが
それが原因かな・・・。
もうちっと考えて見ます。
011582
04/12/03 11:23:05ID:???>>92
use sort〜の行を外すと動くのですが、
>my @new = bogosort([[1,1,0], [1,1,4]], @data);
の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。
上司に「サブルーチン化せず、1行にまとめてorで繋げたほうが素直」って
言ってはいるのですが・・・
「無理です」って言ってやろうかと思う今日この頃。
ありがとうございました。
0116nobodyさん
04/12/03 11:49:21ID:???@list = qw(3 5 8 4 2 9 6 1 7);
#この例だと9が保存されている位置の5が欲しい
foreachで回しながら比較していくしかないのでしょうか?
0117nobodyさん
04/12/03 11:53:46ID:25445hqZソートして先頭か末尾取り出せば?
とスレの流れを見て言ってみる
0118nobodyさん
04/12/03 11:54:48ID:25445hqZごめん。よく読んでなかった。orz
0119nobodyさん
04/12/03 11:56:11ID:???use sortはプラグマ、おそらく perl のバージョンが古いと使えないはず。perl5.6以降だったかな。
>>82 のコードは、条件が多くなるとsliptの回数がすごい事になりそうなので、
これをキャッシュする様な仕組みを考えるといいと思う。参考までに、CPANより
http://search.cpan.org/~jnh/Sort-Fields-0.90/Fields.pm
0120nobodyさん
04/12/03 12:17:33ID:???ファイルを開いたりせずに強制的にダウンロードダイアログを表示させる事は可能でしょうか。
例えば、<A href="hoge.txt">hoge</A>などのリンクがあって、これをIEで踏むとIEがファイルを開いてしまいます。
これをダウンロードダイアログを出したいと思っています。
現在使っているサーバー(@nifty)ではCGI設置ディレクトリにあるログファイルなどへの直接のアクセスはできないので、
CGIを通してダウンロードを行ないたいと考えています。
多分出力するContent-typeの周辺をいじればいいのではと考えているんですが、
参考になるようなサイトをご存知の方はいらっしゃらないでしょうか。
0121nobodyさん
04/12/03 12:23:42ID:???119が紹介したモジュール使った方が便利だと思うが
テキトーに書いてみた。
sub datasort {
my($spec, @list) = @_;
return sort {
my $r = eval {
my @a = split(/,/, $a);
my @b = split(/,/, $b);
foreach (@$spec) {
my($format, $order, $index) = @$_;
my $r = ($format == 1)? (@a[$index] <=> @b[$index]):
($format == 2)? (@a[$index] cmp @b[$index]):
die "型が変: @$_";
next if $r == 0;
return ($order == 1)? $r:
($order == 2)? (-$r):
die "並べ順が変: @$_";
}
return 0;
};
if ($@) { die "$@" }
return $r;
} @list;
}
0122nobodyさん
04/12/03 12:24:07ID:???http://www.google.com/
0123nobodyさん
04/12/03 12:28:49ID:???content-typeをapplication/octet-streamにしてやればたいてい
ダウンロードにいくとは思うが、ブラウザの類の挙動の話なので
perlとは関係ないからスレ違い。
0124nobodyさん
04/12/03 12:35:07ID:???List::Utilのreduce使って
reduce { $list[$a]>$list[$b]? $a: $b } 0..$#list
0125nobodyさん
04/12/03 13:54:20ID:???例えば<OPTION>で、0 時として送信したときに偽として処理されてしまいます。
0126nobodyさん
04/12/03 13:56:51ID:???if($input_data != ""){
}
0127nobodyさん
04/12/03 13:57:35ID:???0128nobodyさん
04/12/03 13:57:48ID:???if($input_data ne ""){
}
0129125
04/12/03 14:00:11ID:???ありがとうございました
0130nobodyさん
04/12/03 14:03:50ID:???昔は参考になるスレだったのに残念です
0131nobodyさん
04/12/03 14:18:51ID:???めでたいことじゃないか。
0132nobodyさん
04/12/03 14:26:10ID:OybfBlRlsub datasort($$$$\@) {
my ($separator, $types, $orders, $keys, $data) = @_;
die "ERROR: datasort()の引数が間違っています。\n"
unless ($#types == $#orders and $#orders == $#keys);
my $keys_len = scalar @$keys;
my $data_len = scalar @$data;
my %data_index = map {
$_ => [(split($separator, $data->[$_]))[@$keys]]
} (0..$data_len-1);
my @sorted_index = sort {
my $ret;
for (0..$keys_len-1) {
my $n = $data_index{$a}[$_];
my $m = $data_index{$b}[$_];
my $type = $types->[$_];
my $order = $orders->[$_];
($ret = $order * ($type?($n cmp $m):($n <=> $m))) ? last : next ;
}
$ret;
} (0..$data_len-1);
return map {$data->[$_]} @sorted_index;
}
my @data = ("1,2,3,4,5", "0,0,0,0,5", "0,9,7,6,0", "1,3,5,7,9", "2,4,5,7,0");
for (datasort(qr/,/, [1,1], [-1, 1], [4,2], @data)) { print "$_\n"; }
0133nobodyさん
04/12/03 14:26:46ID:???0135119,132
04/12/03 14:31:31ID:OybfBlRl132のdatasort関数の Usage:
# datasort(区切り文字, 型, 順序, キー, 配列)
#
# 区切り文字 ... splitの第一引数
# 型 ... true: cmp, false: <=>
# 順序 ... 降順 -1, 昇順 +1
# キー ... キーとなるフィールドのインデックス(0から数える)
# 配列 ... ソート対象のデータ
#
ベンチマーク取ってないけど、(テストも余りしてない)
データのsplitが(配列の数)回で済む為、少しは速くなると思う。
013783
04/12/03 15:31:58ID:???!?空になりますかそうですか。。。
>>115
>>my @new = bogosort([[1,1,0], [1,1,4]], @data);
>の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。
古いPerlのsortは、比較関数が0を返した時に元の並び順が保障されないので
そのようになるです。
というわけでPerlをバージョンアップすべし。
0138nobodyさん
04/12/03 15:37:24ID:???file_cacheでキャッシュされるのは、何がキャッシュされるんでしょう?
templateの構造や内部的なtemplateの解析結果とかがキャッシュされるのだろうか?
ページそのものじゃないよね、たぶん。
0139nobodyさん
04/12/03 16:13:56ID:???解析したデータ構造を Storable でシリアライズしてキャッシュしてるんだと思う
0140nobodyさん
04/12/03 16:29:48ID:???ありがとうございます。よく読んだらperldocに書いてありましたね・・・orz
これでおよそ50%パフォーマンス向上ってんだから、結構時間掛かるんですね。
014182
04/12/03 17:47:58ID:???素直に
>●先頭から16個目のデータを1次キー、3つ目のデータを2次キーとしてソートする場合
>@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15] or (split(/,/,$a))[2] <=> (split(/,/,$b))[2]} @address;
のように繋げて書く(というか人に使わせる)ようにします。。くすん。。。
また何かありましたら質問させてください。
ありがとうございました。
0142nobodyさん
04/12/03 20:25:23ID:???このような文字列があるとして、先頭から連続してる&gt;の数を数える方法ってないでしょうか?
できるだけ簡潔に書きたいのですが・・・。
0143nobodyさん
04/12/03 20:51:56ID:???その例だと4つって数え方でいいのか?
0144nobodyさん
04/12/03 21:11:40ID:???こんなんでどう?
$num = $a =~ s/(?:^|(?<=&gt;))(&gt;)/$1/g;
print $num; # 4
0145nobodyさん
04/12/03 21:12:08ID:???$n= length($n)/4;
0147145
04/12/03 21:24:55ID:???$n= length(($a=~ /^((?:>)+)/)[0])/4;
>>144
それだと、 >の連続が後半に再びあったときに・・・
0148nobodyさん
04/12/03 21:36:09ID:???そうです。先頭から>が幾つ連続してるか、って言い方するべきでした。
>>144-147
ありがとうございます。>>146さんのやり方だとそのまま>を任意の文字列への
置換にも使えそうですね。
0149nobodyさん
04/12/03 21:40:41ID:???0150nobodyさん
04/12/03 22:22:14ID:???0151nobodyさん
04/12/03 23:14:28ID:???0153nobodyさん
04/12/03 23:36:48ID:EsHuFZ1r0154nobodyさん
04/12/04 00:02:39ID:orEKzBU3はじめからutf8でソースを書いてuse utf8するか、
encodingプラグマのFilterオプション使えばいける。
後者の例はたとえば
use encoding 'euc-jp', Filter=>1;
package 日本語;
$変数 = 1;
とはいえ、あまり趣味は良くないね。
0155nobodyさん
04/12/04 00:03:00ID:10+aOFQr<!--#include virtual="****.cgi" -->を使いたい。
0156155
04/12/04 00:04:57ID:10+aOFQr0157153
04/12/04 00:17:56ID:U0vSojEFありがとうございます。utf8ですか。
OSもDBもeucなのでeuc以外では考えていません。ってことは無理なんですね(>_<)
"や'や{などで囲ったり色々してみましたが無理でした。あきらめます。
0158nobodyさん
04/12/04 00:21:06ID:???0160nobodyさん
04/12/04 01:35:43ID:???0161nobodyさん
04/12/04 15:38:15ID:???配列を使うと行数の数だけメモリを確保してしまって無駄遣いしてしまいますよね。行数は不明です。
配列を使って、shift→pushってする場合と、以下のようにする場合ではどちらのほうが効率的でしょうか。
open(W, "> file2.txt");
open(R, "file.txt");
$i = 0;
while(<R>){
next unless ($i++); # 先頭の行は除去
print W $_;
}
close(R);
print W time;
close(W);
unlink("file.txt");
rename("file2.txt", "file.txt");
また、他に効率の良い方法などはありますでしょうか。
よろしくお願いします。
読み書き共用で開くということもできるらしいのですが、どのサイトを拝見しても詳しい内容が載っていません。
実用的だと思うのですがなぜなのでしょうか。
0162nobodyさん
04/12/04 15:54:50ID:???で、rename するので unlink は不要かと。
<R>;
while (read(R, $buf, 10240)){
print W $buf;
}
print W time;
close(W) and rename("file2.txt", "file.txt");
0165nobodyさん
04/12/05 14:39:51ID:hMog6IUx取得したいのですがどうしたらいいのでしょうか
use LWP::Simple;
($content_type, $document_length, $modified_time, $expires, $server) = head "URL";
($sec, $min, $hour, $day, $mon, $year) = localtime($modified_time);
$year += 1900;
$mon = sprintf( "%02d" , $mon+1 );
$day = sprintf( "%02d" , $day );
$hour = sprintf( "%02d" , $hour );
$min = sprintf( "%02d" , $min );
$sec = sprintf( "%02d" , $sec );
print "$year年$mon月$day日$hour時$min分$sec秒 更新
0166nobodyさん
04/12/05 14:50:04ID:eDMBo65dShift_JISで作っていこうと思います。
ダブルクォーテーションの中で一部の日本語(「表示」など)が文字化けする問題について
知りたいのですが、どういう時に文字化けするのかがよく分かりません。
なぜフォームから受け取る時には文字化けしないんですか?
分かりにくかったらすいません・・・。
0167nobodyさん
04/12/05 14:50:45ID:???> LWP::Simple
> head($url)
> Get document headers. Returns the following 5 values if successful:
> ($content_type, $document_length, $modified_time, $expires, $server)
> Returns an empty list if it fails. In scalar context returns TRUE if successful.
0169nobodyさん
04/12/05 15:22:25ID:???0170166
04/12/05 15:49:18ID:???ありがとうございました。
0171nobodyさん
04/12/05 17:40:20ID:???HTMLファイルをShift_JISで書いていれば送られるデータはShift_JISだと期待してもよいのでしょうか。
0172nobodyさん
04/12/05 17:58:50ID:???HEADメソッドでだめならGETメソッドを使ってヘッダから取得。
LWP::Simpleではヘッダ部が取れないから、
LWP::UserAgent使うことになると思う。
>>171
一部のブラウザにはeuc-jp固定で送信するものがあるという話。
0173nobodyさん
04/12/05 19:37:19ID:???全てのサイト/ページが更新時刻を返してくれるわけではない。
特にページがCGIなど動的に生成されていたりすると、
更新時刻という概念自体が無かったりして、Date も Last-Modified も返さないことが良くある。
そういうときは、諦めるしかない。
0174nobodyさん
04/12/05 23:57:35ID:mQuG6gLO0175nobodyさん
04/12/06 06:14:11ID:???0177nobodyさん
04/12/06 10:08:16ID:???ファイルが生成されません。
サーバはRedhat9+Apacheで構成されているようなのですが
環境に依存して生成・書込みが出来ないことがあるのでしょうか。
以下のようなルーチンを使用しています。(パスは合っています。)
use MLDBM qw(DB_File Storable);
sub DbmWrite {
my($data, $filename) = @_;
my(%writehash);
tie %writehash, MLDBM, $ini::path.$filename, O_CREAT|O_RDWR, 0666;
%writehash = (%writehash, %$data);
untie %writehash;
}
0179nobodyさん
04/12/06 12:35:45ID:???# とりあえずお気に入りの一覧ということで
&showdir("C:\/Documents and Settings\/Administrator\/Favorites");
sub showdir {
my($dir) = @_;
opendir(DIR, $dir) || die $!;
my(@files) = readdir(DIR);
closedir(DIR);
foreach (@files){
if($_ ne '.' && $_ ne '..'){
$path = $indir . "/" . $_;
for($i=0; $i<$level; $i++){
print " ";
}
print $_ . ((-d $path) ? "/" : "") . "\n";
if(-d $path){
$level++;
&showdir($path);
}
}
}
$level--;
}
現在はこのように書いているのですが、このように書くとディレクトリやファイルなど関係なく、
名前順でソートされてしまうようです(Win2K SP4 ActivePerl 5.6.1)。
2レスに分けます、
0180nobodyさん
04/12/06 12:36:24ID:???aaa.txt
bbb
bbb.txt
ccc
ccc.txt
ddd.txt
このように表示されてしまいます。
これを、まずはディレクトリとファイルでソートして、
そこからファイル名でソートさせたいと思っているのですが、
ディレクトリかファイルかでソートするにはどのように記述したらいいでしょうか。
上の例で言いますと、
bbb
bbb.txt
ccc
ccc.txt
aaa.txt
ddd.txt
このような表示順序にしたいと思っています。
0183nobodyさん
04/12/06 13:36:20ID:???0184JAPU
04/12/06 13:51:45ID:???>>171
無関係の文字コードで送ってくるブラウザもあるようなので注意。古い例で恐縮ですが,たとえばBSD/386版Mozilla/3.xではJIS固定で送信していました。
INPUTはHTMLの文字コードで送られるが,HIDDENは別のコードで送られるという実装もあるようです。(何となく内部処理が想像つきますが…)
いまどきの主要なブラウザをターゲットにするのであれば,HTMLの文字コードがそのまま利用されるという仮定でも問題無いようです。
(FYI) HTMLでは送信されるエンコードを指定することができるが,現状まともに利用されてはいない模様。
cf. http://www.w3.org/TR/html401/interact/forms.html#h-17.3
0185nobodyさん
04/12/06 13:54:44ID:???例えば:
my %file_or_dir;
@file_or_dir{@files} = map { (-d "$dir/$_")? 0: 1 } @files;
@files = sort { $file_or_dir{$a} <=> $file_or_dir{$b} || $a cmp $b } @files;
0186JAPU
04/12/06 14:10:52ID:???>>132 で既に回答出てたの気づかずに >>82 用のコード書いてしまったよ… 悔しいのでとりあえず貼り付けておきます。(インデントずれるので http://www.japu.org/tmp/ayumoesort.pl にも置きました…) あ,手抜きなので注意して。
#! /usr/bin/perl -w
# This code is public domain; I never assert any rights.
# This code is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
use strict;
use constant COND_DTYPE_STR => 0;
use constant COND_DTYPE_NUM => 1;
use constant COND_ORDER_ASC => 0;
use constant COND_ORDER_DESC => 1;
MAIN: {
my @data = ("foo,bar,2,3,4",
"foo,bar,3,4,5",
"fog,bar,2,2,2",
"fgh,bar,3,4,2",
"foo,bar,4,5,6");
my @ordered = ayumoesort(\@data,
{dtype => COND_DTYPE_NUM,
order => COND_ORDER_ASC,
keyno => 2},
{dtype => COND_DTYPE_STR,
order => COND_ORDER_DESC,
keyno => 0});
print "$_\n" foreach @ordered
}
# つづく
0187JAPU
04/12/06 14:11:27ID:???# This code is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
sub ayumoesort
{
my $dref = shift;
my @cond = @_;
my @sgn = map { -($_->{order}*2 - 1) } @cond; # ASC: +1, DESC: -1
# Schwartz Transform; cf. Effective Perl or ask Google
# equivalent to:
# @tmp = map { ... } @$dref;
# @tmp = sort { ... } @tmp;
# @$dref = map { ... } @tmp;
@$dref = (map { $_->[-1] }
sort {
foreach my $i (0..$#cond) {
my $r;
if($cond[$i]{dtype} == COND_DTYPE_STR) {
$r = $sgn[$i]*($a->[$i] cmp $b->[$i]) and return $r;
} elsif($cond[$i]{dtype} == COND_DTYPE_NUM) {
$r = $sgn[$i]*($a->[$i] <=> $b->[$i]) and return $r;
} else {
die;
}
}
}
map { my $x = $_;
[(map { (split /,/, $x)[$cond[$_]{keyno}] } (0..$#cond)),
$_] } @$dref);
}
0188nobodyさん
04/12/06 14:14:23ID:???# コードは試してないけど、
まとめてソート
sort { (-d "$dir/$a" <=> -d "$dir/$b") or ($a cmp $b) } @files
ループをディレクトリとファイルに分ける
grep {-d"$dir/$_"}@files
grep {-f"$dir/$_"}@files
>>183
File::Find はソートしてくれないよ。
0189nobodyさん
04/12/06 16:21:10ID:???>>179-180です。<OPTION>で選択するファイル一覧を作っていました。
@files = sort { (-d "$dir/$b" <=> -d "$dir/$a") or ($a cmp $b) } @files; でやりたいことが出来ました。ありがとうございます。
0190nobodyさん
04/12/06 16:57:38ID:kMJjfrXb0191nobodyさん
04/12/06 16:58:07ID:kMJjfrXb0192nobodyさん
04/12/06 17:03:05ID:adgUx9sVほれ。
http://himatsubu.fc2web.com/22/fir/ かなりシュールな心理テストでオモロイ。
0198nobodyさん
04/12/06 22:54:57ID:???正直スマンカッタ
今は反省している
0199nobodyさん
04/12/06 23:45:58ID:PVGalzLMSocketにより他サーバーから読み込み表示させるのとでは
どの程度サーバー負荷は高まるものなのでしょうか?
0200nobodyさん
04/12/07 00:27:16ID:J98ZOjsq実行して・・という風な方法しかないのでしょうか
一度perlでcgiの短いプログラム(50行ぐらい)を作ったことがあるんですが、
こんな短いのでもバグをとるのにすごく骨を折りました。
0202nobodyさん
04/12/07 00:36:00ID:???二分検索法って知ってるかい?
アルゴリズムってのは、なにもプログラムを組む時にしか使えないものじゃないぞ。
0203nobodyさん
04/12/07 05:39:36ID:???そうか?エラーメッセージを読めばどこが悪いかなんてすぐ分かるが。
まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
0204200
04/12/07 15:33:29ID:???文法チェックはブラウザ上でソースを入力するとやってくれる
サイトがあったんで、それを使っていました
(cygwin?がうまくインストールできなかったってのもあります)
コマンドでデバッグをするのと違いはあるんでしょうか
>>202
どんどんせばめていけばいいんですね
>>203
>まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
そのとおりです。なんで500エラーがでるのかが分からなくて
どこも修正してないに、何回も実行してみたりして・・
結局原因のひとつはcgiのファイルのパスをフルパスで書いてたのが
いけなかったんだと思います。ほかにもあったけど少し前なんで忘れてしまった。
0206nobodyさん
04/12/07 15:51:19ID:9tRllW3iきれいなコード書いて公開してる人のURL教えてください!
0207nobodyさん
04/12/07 16:09:37ID:???「perl excellent source code」でググった。
ttp://www.perl.com/pub/q/documentation
0208nobodyさん
04/12/07 16:27:59ID:9tRllW3iんーと、コードが載ってませんね。
きれいなコード見て、学びたいので、
そういう感じでお願いします。
0210nobodyさん
04/12/07 17:04:28ID:???0211200
04/12/07 17:38:09ID:???コードはインフォシークの無料HPスペースにアップロードして
実行しています。最終的には動作させることができました。
>Perlいれてローカルで動かせ
意図がわからないのですが、これをするとどんな利点があるんでしょうか?
アップロードして実行するのも慣れてくると短時間でできるので。。。
0213nobodyさん
04/12/07 18:08:01ID:???Perl の吐くエラーメッセージを読める
ひょっとして、Perl が行番号入りでエラーメッセージを吐いてくれる
ということを知らなかったりする?
0214nobodyさん
04/12/07 18:11:19ID:???もし仮に
while (@hoge) {
処理
}
と書こうとして @hoge を $hoge と書き間違い、さらに $hoge に何かしら文字列やら入ってたら
無限ループ作っちゃうでしょう。
それを鯖にUPして実行したら鯖に負荷がかかりっぱなしになる。
鯖が落ちたら君の責任。共有鯖なら鯖会社だけでなく他の鯖利用者にも迷惑がかかる。
ローカルなら君のPCに負担かかる。君だけが被害を受けるが全て君の責任。
どっちがいいよ?
0215nobodyさん
04/12/07 18:29:20ID:Oi1PFFsCフォームから受け取ったメールアドレスが携帯電話のメールアドレスかどうか
を判断したいのですが
$nb = $FORM{mail};
if($nb ne $nb !~ /(.*)\@docomo\.ne\.jp/
and $nb ne $nb !~ /(.*)\@ezweb\.ne\.jp/
and $nb ne $nb !~ /(.*)\@(.*)\.vodafone\.ne\.jp/){
"携帯電話メールアドレスとして処理"
}else{
"携帯電話以外のメールアドレスとして処理"
}
としてみたのですが、どうも上手くいきません。
(何のアドレスを入れても携帯以外のアドレスとして処理されてしまいます。)
何が間違っているかどなたか教えていただけますでしょうか。
よろしくお願いします。
0216215
04/12/07 18:41:14ID:???処理が逆になってました。
(携帯外メルアドでも携帯メルアドでも同じ処理になってしまうので大差ないんですが。)
よろしくお願いします。
0217JAPU
04/12/07 18:44:27ID:???$nb ne $nb !~ /(.*)\@docomo\.ne\.jp/
これを,演算子の優先順位をもとに括ると
$nb ne ($nb !~ /(.*)\@docomo\.ne\.jp/)
ここで,() 内は "" (偽) または "1" (真) を返す。これを $nb と(文字列として)比較しているため,多くの場合はこの式全体として「偽」となる。
これを踏まえて,書き直すと
if($nb =~ /\@docomo\.ne\.jp$/i or $nb =~ /\@ezweb\.ne\.jp$/i or $nb =~ /\@\w+\.vodafone\.ne\.jp$/i) {
# 携帯電話のアドレス
} else {
# NG
}
もしくは,
if($nb =~ /\@(?:docomo\.ne\.jp|ezweb\.ne\.jp|\w+\.vodafone\.ne\.jp)$/i) {
# 携帯電話のアドレス
} else {
# NG
}
入門書は「はじめてのPerl」をおすすめする。
i 修飾子については Perl のマニュアル等で熟知すべし。(「プログラミングPerl」または http://www.perldoc.com/)
0218215
04/12/07 18:56:42ID:???迅速で的確なレスありがとうございました。
希望道理のCGIが実行できました。
入門書や教えていただいたURLにも早速行って勉強します。
本当にありがとうございました。
0219nobodyさん
04/12/07 20:20:42ID:???$nb=~ m!\@(?:docomo|ezweb|vodafone)\.ne\.jp$!i
0220nobodyさん
04/12/07 20:58:48ID:???0221JAPU
04/12/07 21:17:03ID:???「初めてのPerl」が正解。
どうも最近「はじめての」と平仮名で書く習慣が…
# There's more than one way to do it.
0222nobodyさん
04/12/08 04:01:02ID:CFZe8E7O記号ばっかで検索もできない…
0223nobodyさん
04/12/08 07:01:35ID:???@{shift};
ソフトリファレンスと解釈される。
# use warningsで曖昧と指摘される。
@{+shift};
+は変数名に使えないから、@{+shift()}と解釈される。
@{shift()}と等価。
0224nobodyさん
04/12/08 07:14:20ID:???×ソフトリファレンスと解釈される。
○@shiftと解釈される。
0225nobodyさん
04/12/08 10:38:37ID:???@{shift()}または@{shift(@_)}が無難。
0226222
04/12/08 20:32:23ID:???ありがとうございます。
+{ hash_ref } とか {; block } とかと同じような原理だとは思ったんですが、
どうしても探し出せなかったので助かりました。
0227nobodyさん
04/12/08 23:28:15ID:???1: getメソッドで送信されてきた文字列$wordの文字コードを判定して、
utf-8だったらsjisに変換して以後の処理に使いたいです。
2: 使ってるサーバー(arenaのsuite2)がPerl5.6.1です。Perl5.8ならなんとかなりそうだとか、
5.6.1でもjcode.pmが入っていればいけそうだというのはグーグルで発見したんですが、
jcode.plしか入っていないようですhttp://web.arena.ne.jp/suite2/support/manual/hp/script.html#cgi
3: sjis,jis,euc-jpに関しての処理の説明は多く発見できるんですが、jcode.plはutf-8は対応していない?ようです。
本当にちょっとしたことなんですが、jcode.plで色々やってもダメだったです。
jcode.pmをインストールしないと無理でしょうか?
0229nobodyさん
04/12/08 23:38:50ID:???この時点で、まだ何もやってないのに質問してる教えて君ってのが丸出しだな
0230nobodyさん
04/12/09 01:34:56ID:???0231nobodyさん
04/12/09 01:35:08ID:???0232JAPU
04/12/09 03:19:09ID:???Unicode 絡みは XS でかかれていますが,Pure Perl の環境でも動作するよう Jcode::Unicode::NoXS が用意されています。
実際にはユーザが意識することは無く,自動的に Jcode::Unicode or Jcode::Unicode::NoXS が読み込まれるので安心です。
0233nobodyさん
04/12/09 11:37:19ID:???注意しろよ。この辺がまとまってると思う。
ttp://www.debian.or.jp/~kubota/unicode-symbols.html.ja
Jcode.pmはこの辺の問題どう扱ってるんだろうか。$Jcode::Unicode::PEDANTIC
関係以外を除くとマニュアルには
Unicode conversion table used here are based uponon files at
ftp://ftp.unicode.org/Public/MAPPINGS/EASTASIA/JIS/, Copyright (c)
1991-1994 Unicode, Inc.
としか書いてないのでJISの変換表決めうちと読めるけれども。
0234nobodyさん
04/12/09 19:33:11ID:???0236nobodyさん
04/12/09 20:26:49ID:???複数行にわたっており正規表現のやり方がわからなくて困っています。
どのようにしたら、取り出せるでしょうか?
<dl>
<dt>title1
<dd>aaa<br>
bbb
ccc
<dt>title2
<dd>aaa<br>
bbb<br>
ccc
</dl>
0237236
04/12/09 20:30:31ID:???よろしくお願いします。
$i = 0;
while(<>){
if(m/<dt>(*.)$/){
push($dt[$i]);
}
if(m/<dd>(*.)$/){
push($dd[$i]);
}
}
0238nobodyさん
04/12/09 20:58:18ID:???0239236
04/12/09 21:41:05ID:???どのようにすればいいかが浮かばないです...
2個目の<dt>または</dl>がくるまで読み込んで、そこでフラグを
立てて...
すると一組目の<dt><dd>セットまでしか読めないし...
??
0240nobodyさん
04/12/09 21:45:54ID:???push(@{$1}, $2) while m#<(d[td])>((?:(?!<d[td]>|</dl).)+)#gsi;
0241236
04/12/09 22:21:16ID:???ありがとうございます。1行でできるなんて思いませんでした。
<dt>aaa
bbb
ccc
<dd>ddd
eee
fff
となってる場合、行にまたがってる部分、bbb,ccc,eee,fffが取り込まれ
ないようです...
この一行を理解しようと頑張ってみましたがムズカシすぎました。
複数行にわたるのでやっぱりフラグが必要ですかねぇ...
0242nobodyさん
04/12/09 23:14:04ID:???JIS 0208 SJIS CP932 APPLE 0213 IBMGLY IBMIRV JCODE
0x005C ------ U+00A5 U+005C U+00A5 ------ U+00A5 U+005C ------
0x007E ------ U+203E U+007E U+007E ------ U+203E U+007E ------
0x2131 U+FFE3 U+FFE3 U+FFE3 U+FFE3 U+203E U+FFE3 U+FFE3 U+FFE3
0x213D U+2015 U+2015 U+2015 U+2014 U+2014 U+2014 U+2014 U+2015
0x2140 U+005C U+005C U+FF3C U+FF3C U+FF3C U+FF3C U+FF3C U+FF3C
0x2141 U+301C U+301C U+FF5E U+301C U+301C U+301C U+301C U+301C
0x2142 U+2016 U+2016 U+2225 U+2016 U+2016 U+2016 U+2016 U+2016
0x215D U+2212 U+2212 U+FF0D U+2212 U+2212 U+2212 U+2212 U+2212
0x216F U+FFE5 U+FFE5 U+FFE5 U+FFE5 U+00A5 U+FFE5 U+FFE5 U+FFE5
0x2171 U+00A2 U+00A2 U+FFE0 U+00A2 U+00A2 U+FFE0 U+FFE0 U+00A2
0x2172 U+00A3 U+00A3 U+FFE1 U+00A3 U+00A3 U+FFE1 U+FFE1 U+00A3
0x224C U+00AC U+00AC U+FFE2 U+00AC U+00AC U+FFE2 U+FFE2 U+00AC
そのページのスクリプトをいじってテストしてみた。
JIS-0208.TXTをそのまま実装してるみたいだね。
0243nobodyさん
04/12/09 23:26:10ID:???0244nobodyさん
04/12/10 00:28:10ID:???おお、なるほど。ASCIIの範囲はそのままになるように
してる関係で0x2140(\)を0x5cにしちゃうと、もとから
0x5cだった場合と区別つかなくなって不便だからあえて
変えてるんだろうね。
世の中この変換表だけだったらすっきりしたんだろうけど
なぁ。
0245JAPU
04/12/10 03:47:06ID:???$_ にすべての行を取り込んでいます?
{ local $/ = undef; $_ = <> }
んで,>>240 のスクリプトはシンボリックリファレンス使用しているので,あまり初心者にお勧めできません。
私ならこう書くという例。(考え方はほとんど同じですが。)
while(m{(?:<dt>(.*?)(?=</d[tl]>|<d[td]>)) |
(?:<dd>(.*?)(?=</d[dl]>|<d[td]>))}gixs) {
push @dt, $1 if(defined $1);
push @dd, $2 if(defined $2);
}
それぞれの修飾子についてはマニュアル等にて熟知すべし。
0247nobodyさん
04/12/10 08:58:58ID:???深すぎるけどね。
0248nobodyさん
04/12/10 09:37:21ID:???Perlメモのタグの削除について質問です。
こちらのページでは「$str には HTML文書全体を入れておきます」と書かれていますが、
open (DATA, "<index.html");
@line = <DATA>;
このようにして読み込んだ場合、一行ごとに分けられて配列に入れられますよね。
どのようにして$hensuにHTML全体を格納するのでしょうか。
現状では、HTMLを配列に入れた後で
$data = join ("", @lines);
などとして、一行にまとめているのですが。
0249nobodyさん
04/12/10 09:39:49ID:???local $/;
$data = <IN>;
}
0251nobodyさん
04/12/10 10:05:09ID:???レス感謝です。ファイルハンドルに対してもreadや-sが使えるのですね。
試してみたところ、期待通りの動きをしてくれました。
0252nobodyさん
04/12/10 10:08:09ID:???0253nobodyさん
04/12/10 10:19:42ID:???0254nobodyさん
04/12/10 13:16:03ID:???BBSに書き込みがあった場合にNet::SMTPでメール送信を行おうと思っているのですが、この場合に使われるモジュールはSMTP.pmですよね。
use Net::SMTP;と書くとエラーで蹴られるので、require "SMTP.pm";と記述しようと思います。
まだコーディング中で実際には動かしていないのですが。SMTP.pmの中を見てみると、
use strict;
use vars qw($VERSION @ISA);
use Socket 1.3;
use Carp;
use IO::Socket;
use Net::Cmd;
use Net::Config;
などと書かれています。これらの全てのuse宣言を取り払ってrequire "******.pm";などと書き換えて、
該当する.pmのファイルをアップしていけば、使えるものなのでしょうか。
0255nobodyさん
04/12/10 13:28:42ID:???そもそもファイルを置けるのなら置いた場所を適切にuse libして
やればあとはそのままいけそうなものだが。それともuse機能自体を
つぶすような改造入ったperlなのか?
0256nobodyさん
04/12/10 13:33:14ID:???鯖変えれ
0257nobodyさん
04/12/10 14:21:04ID:???Net::SMTPに関連する.pm全てそろえてからuse libすればいいんじゃね?
0258nobodyさん
04/12/10 15:01:04ID:???use libとかはプラグマなはずだけど。
lib.pmもなくて使えないとしたら @INC で代用。
pathさえ通せばrequireにする必要ないよ。(requireする場合だとimportも必要)
0259nobodyさん
04/12/10 15:21:53ID:???($a,$b,$c)=@hoge[1,3,5]
とかやってもだめでした
0260nobodyさん
04/12/10 15:45:23ID:???$a=b $b=d $c=f
できるけど?
0261259
04/12/10 16:04:27ID:???($a,$b,$c)=@hoge[0][1,3,5]
ができず
0262nobodyさん
04/12/10 16:17:39ID:tDYU+a6sプロジェクトマネージャが変わった関係で、ソースは全てSJIS
に統一しなければならなくなってしまいました。
今までは、出力はSJISに変換してSJISのページを出し、そこからの
入力はまず全てEUCに変換し、処理を行っていたわけですが、
SJISに変更となると、一見変換処理は必要なくなって楽になるかとも
思えますが、SJIS特有の問題(「表」の文字等の)もあるので、入出力
時にこれだけは必ずやっておけということがあればご教授いただきたい
次第です。
個人的対策としましては、フォームからの入力を全てハッシュに入れる
段階で、今までは $form{name} = 入力値 としていたものを、
$form{name} = quotemeta(入力値) にすることによってなんとかなるん
じゃないかと安易に考えております。
0263nobodyさん
04/12/10 16:45:53ID:???0264nobodyさん
04/12/10 16:57:05ID:???@fuga = qw(a b c d e f);
$hoge[0] = \@fuga;
($a,$b,$c)=@{$hoge[0]}[1,3,5];
print "\$a=$a \$b=$b \$c=$c\n";
$a=b $b=d $c=f
リファレンス、デリファレンスがわかってないだけ
0265259
04/12/10 17:08:40ID:???精進します
0266nobodyさん
04/12/10 17:18:07ID:???入力をquotometaしてもほとんどどうにもならない。ソースコードの中に
出てくる「表」とかがやばい。というあたりを理解してないあたりで、
たぶんはまるだろうな。合掌。
まあperlのソースをSJISにしようというあたりで終わってるので、不運だ
と思ってあきらめなされ。
いっそ5.8以降にしてuse encoding 'Shift_JIS'で内部処理は全部unicode
にするのがいいかも?
0267nobodyさん
04/12/10 17:25:03ID:???0269nobodyさん
04/12/10 21:11:53ID:???それがSJISに起因する問題の根本じゃないし。
0270nobodyさん
04/12/10 21:40:25ID:???0271nobodyさん
04/12/10 22:30:33ID:???正直、問題がある部分個別に対応するってのがFAかと。
一発でこうすりゃ大丈夫なんて解決策があったら、そもそも問題にならない。
そのプロジェクトマネージャーはきっと馬鹿で、PCと同じエンコードにした方が
作業効率が上がると思ってるんだろう。
0272nobodyさん
04/12/10 22:58:04ID:???プロジェクトの敵は文字コードでもなく、バグでもない。
馬鹿なマネージャーの無意味な口出し。
0273nobodyさん
04/12/10 23:05:15ID:???バグと格闘した方が楽だったり...
0274nobodyさん
04/12/10 23:32:53ID:???一生フリーター気分ならそれでもいいだろうけど。
0275nobodyさん
04/12/10 23:56:20ID:???それはそれで問題出るんだけど。〜とか。
0276nobodyさん
04/12/10 23:59:18ID:???0277nobodyさん
04/12/11 00:02:57ID:???0278nobodyさん
04/12/11 00:15:28ID:???perl特有の問題というわけではなく、そもそもunicodeとsjisの
マッピングに問題があるというべきだな。既存の文字コードに
対してちゃんと変換表を決めなかったので複数並立してわけわか
というのが現状で解決の見込みほとんどなし。
>>233のリンク先読んでみ。
0279nobodyさん
04/12/11 00:26:52ID:???サンクス。
javaだとSJISだったりMS932だったりフラフラしてて「どっちだよオイ!」
って時期があったんだが、perlはどうなのかと思った次第でした。
0280nobodyさん
04/12/11 00:37:20ID:???0281JAPU
04/12/11 00:57:12ID:???下請けに出すときは,use strict パスしないと一切認めない(no strict は原則不可),
-w で警告つぶせ,が条件でした。
# なので,出せるところがかなり限定されてしまったのですが。
--
> useが使えないって事は無いだろ。
実はPerl4 (ギャー
0282nobodyさん
04/12/11 01:05:57ID:???俺もそれ気味だけど
0283nobodyさん
04/12/11 01:17:40ID:???あくまでデバッグ用。Cのassert()に近い感覚なんだが。
0284nobodyさん
04/12/11 01:25:27ID:???ネット配布スクリプトにあるとちょっと萎える。
0285nobodyさん
04/12/11 02:07:29ID:???use CGI::Carp qw(fatalsToBrowser set_message);
BEGIN {
$CGI = new CGI;
sub handle_errors {
my $msg = shift;
print $CGI->start_html(-title=>'システム-エラー');
print $CGI->h1('システム-エラー'),
$CGI->p($msg),
$CGI->hr,
$CGI->center( $CGI->a({href=>"javascript:history.back()"},"[戻る]") );
print $CGI->end_html;
}
&set_message(\&handle_errors);
}
みたいな風にして、エラー時dieで殺してエラー表示するのってやめた方がいいかな?
0286262
04/12/11 03:33:34ID:???とりあえずまずやることをまとめてみました。
月曜日にプロジェクトマネージャを説得してみます。
0287nobodyさん
04/12/11 07:30:08ID:tdpIuDpB日付のところが
Win32::OLE::Variant=SCALAR(0x19e99fc)
となってしまいます
これを元の H16.12.9 の文字列に戻すにはどうしたらよいのでしょうか?
0288nobodyさん
04/12/11 07:44:59ID:???http://search.cpan.org/~gsar/libwin32-0.191/OLE/lib/Win32/OLE/Variant.pm
元号表記がどう処理されてるかは知らんけど。
0289nobodyさん
04/12/11 08:47:42ID:tdpIuDpBuse Win32::OLE::Variant; すると
普通に 2004/12/09 の文字列が取れるようになりました
元号はこの際どうでもいいです。
どうしても必要なら2004から16に変換します。
0290nobodyさん
04/12/11 11:53:42ID:???でundefな変数参照の警告が鬱陶しい。ヒアドキュメントに埋め込むときは特に。
みんなどうしてる?
0291nobodyさん
04/12/11 13:18:29ID:i36zMpTHどうしたらいいのでしょうか?
0292nobodyさん
04/12/11 13:23:00ID:???バグだと思う個所を修正してcontribすれば?
0294291
04/12/11 13:30:20ID:i36zMpTHバージョン1.xxならば解決されるらしいです。
そこで1.xxの最終バージョンを入れてやってみたのですが、エラーの量が増えましたorz
0295291
04/12/11 14:18:27ID:i36zMpTHさっきオフィシャルページからダウソしたやつにはなぜかHTMLタグが入っていました。
HTMLタグを削除してもエラーの個数は変わりませんでした。
もう俺の手元にあるjcode.plはわけがわかりません。
0296nobodyさん
04/12/11 14:27:42ID:???0298291
04/12/11 14:49:05ID:i36zMpTH[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Premature end of script headers: c:/yukino/mb.cgi
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Operator or semicolon missing before & at ./jcode.pl line 171.
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Ambiguous use of & resolved as operator & at ./jcode.pl line 171.
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Bareword found where operator expected at ./jcode.pl line 171, near "$&"
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] (Missing operator before amp?)
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Operator or semicolon missing before & at ./jcode.pl line 171.
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Ambiguous use of & resolved as operator & at ./jcode.pl line 171.
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] syntax error at ./jcode.pl line 171, near "$&"
[Sat Dec 11 14:07:24 2004] [error] [client 127.0.0.1] Compilation failed in require at c:\yukino\mb.cgi line 22.
#この22行目に require "jcode.pl" を記述してある。
今はエラーの解決よりもちゃんとしたjcode.plが欲しいのですが・・・
0299nobodyさん
04/12/11 14:52:29ID:???0300291
04/12/11 14:56:04ID:i36zMpTHすいません、どこで質問すれば教えてもらえますか?
0301nobodyさん
04/12/11 14:59:10ID:???ウザいから終わらせてやる。
jcode.plではなくスクリプトのせい。
作者に聞け。
0303nobodyさん
04/12/11 17:22:34ID:???undefな変数参照の警告って
Use of uninitialized value in string at 〜
ならそれはstrictじゃなくてwarnings(または
-wオプション)で出てるものだよ。
普通に書けばはじめから出ないようにできる
と思うけど、どうしてもうざければなるべく
狭い範囲をブロックで囲んで
{
no warnings qw(uninitialized);
...
}
ですかね
0304nobodyさん
04/12/11 18:16:16ID:???0305nobodyさん
04/12/11 21:28:10ID:???それっす。
-wとusr strict;は常に使えとしつけられたので...
HTML::Template使うと良く遭遇した気がします。(最近perlでの開発から離れてるから忘れ気味)
0306nobodyさん
04/12/12 21:09:08ID:LYqEO+UH↓
aaa<br><img src="img/hoge.jpg"><br>bbb<br>ccc<br><img src="hoge.jpg"><br>;
このように置換したいのですが、うまくいきません。
$hoge =~ s/IMG=(\S+(.jpg))/<img src="$1">/g;
1回目の「.jpg」をスルーして、最後の「.jpg」までいっちゃいます。
教えてください。
0308306
04/12/12 23:13:37ID:???0309nobodyさん
04/12/13 01:12:16ID:UkWYfRd/テンプレのサイトを見てもよく分からなかったので自分で検索して、
このページが出てきたので書いてある通りにやってみたのですが、
できませんでした。
ttp://mind.f.fiw-web.net/program/perl/tips0502.html
0310nobodyさん
04/12/13 01:20:10ID:???>1: 自分はこういう事がしたい。
>2: それでこんな風にやってみたが・・・
>3: こんなエラーが出て上手く行かなかった。
0311309
04/12/13 01:54:21ID:UkWYfRd/すいません。
>1: 自分はこういう事がしたい。
2バイト文字(Shift_JIS)をパターンマッチさせたい
>2: それでこんな風にやってみたが・・・
テンプレのサイト([テクニック])を見てもよく分からなかったので自分で検索して、
このページが出てきたので書いてある通りにやってみた
ttp://mind.f.fiw-web.net/program/perl/tips0502.html
>3: こんなエラーが出て上手く行かなかった。
エラーは出てません。。
一致したら変数に1が入るようにしてあるのですが、それが入らないんです。
1byte文字ならマッチしたときにちゃんと1が入ります。
0313JAPU
04/12/13 03:47:58ID:???Perlの正規表現では繰り返し("*", "+") を指定するとなるべく長くマッチしようとします。
なので,
1. "*?", "+?" などの最短マッチ
2. [^<]* のように文字を限定
のいずれかを使用する必要があります。
寝よう…
0314nobodyさん
04/12/13 10:17:09ID:???use Net::SMTP;
$smtp = Net::SMTP->new('mailhost');
$smtp->mail($usr);
$smtp->to('postmaster');
などと記述しますが、
この場合の$smtpというのはインスタンスのようなもので、
上記の場合のmailやtoというのは、引数を指定した関数呼び出しということでしょうか?
0315nobodyさん
04/12/13 10:30:32ID:???この場合だとSMPT.pmな
サブルーチンでmailとかtoとかdatasendとかあるから
0316309
04/12/13 11:10:21ID:rJW07thIコピペでやってみましたができませんでした。
検索対象の文字コードと、検索語句の文字コードはどちらもsjis。
出力して確認してみたのですが、
双方とも同じ文字列かつ、同じ文字コードであるにも関わらずパターンマッチしません。
関係あるか分かりませんが・・・
検索対象の文字列はサーバー側に保存してあるデータを取り出し、
それをsplitで区切って準備しています。
その文字列は保存する際にsjisに変換して保存しています。
検索語句の文字列はブラウザから入力された文字列をCGI内部でデコードし、
jcode.plを使用してsjisに変換しています。
0318309
04/12/13 13:32:52ID:rJW07thIこれです。
最小コードで、コマンドラインから確認しました。
#!C:/perl/bin/perl
require "jcode.pl";
$word="変数の型";
$s="型";
&jcode::convert($word,"sjis");
&jcode::convert($s,"sjis");
$sjis=q{
[\x00-\x7f]|[\xa0-\xdf]|
[\x81-\x9f\xe0-\xfe][\x40-\x7e\x80-\xfc] };
########マッチするかどうか
if ($word=~/(?:$sjis)*?$s/){
print"OK\n";
}else{
print"NG\n";
}
exit;
0319nobodyさん
04/12/13 15:32:49ID:???(?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc])
ではないかと。
0320nobodyさん
04/12/13 16:29:18ID:hnMBax6Xsendmailでつまづいております。
if (!open(MAIL,"| $sendmail -t $to")) { return(1); }
ユーザが入力したメールアドレス($to)に不正なアドレスが
入力されるとsendmailでエラーを吐いて、落ちてしまいます。
(Invalid host name・・・・)
メールアドレスを正規表現を使って全てチェックするのが
困難なのでsendmailのエラーをキャッチしたいのですが
無理なのでしょうか?
0321nobodyさん
04/12/13 16:58:37ID:???0323nobodyさん
04/12/13 17:37:37ID:???ありがとうございます。
携帯(docomo等)でも受け付けるため Email::Valid::Loose
を使用するということまではわかりました。
少し試してみます。
0324nobodyさん
04/12/13 17:39:15ID:???ところで・・・sendmailのエラーをそのまま
キャッチする方法はないのですか?
無いなら、無いで結構です。
調べてもなかったので気になったもので・・・。
0325nobodyさん
04/12/13 18:04:58ID:???MySQLが使えるレンタル鯖を借りてMySQLを使用する
ショッピングカートのCGIを設置したのですが、まったく動きません。
レンタル鯖のサポートへ確認したところ
「うちの鯖はMySQL+PHPだけのサポートでPerlからのMySQL操作はサポートしていません。」
と言われましたorz
んで、色々と調べたところDBI.pmやDB.pm、mysql.pmとかをCGIファイルと同じ場所に置いて
requireで呼び出せば use DBI が使用できるというようなことがわかったのですが、
それを呼び出してもやっぱりエラーが出て使用出来ませんでした。
require "./DBI.pm";
require ",/DB.pm";
require "./mysql.pm";
use DBI;
としているのですが、他に必要なモジュールがありましたら教えて下さいm(_ _)m
ちなみにDBIを使用しないCGIは正常に動作しています。
ショッピングカートCGIも、ローカルPCのWin環境での動作確認はOKでした。
結構高いお金払ってるのでなんとかこのレンタル鯖でCGI-MySQLを動かしたいのです。
どうしようもなければPerlでMySQLの操作をサポートしているレンタル鯖へ乗り換えますが・・・
レンタル鯖の仕様は
Sun Cobalt RaQ550 / Linux
Apache(バージョン不明)
Perl 5.6.1
Mysql 3.23.56
です。
宜しくお願いしますm(_ _)m
0326nobodyさん
04/12/13 18:15:35ID:???DBI だけでなく DBD::mysql が必要。
ただし DBD::mysql は xs モジュールなので、mysql.pm を置くだけでは動かない。
make する作業が必要 (Cコンパイラ必須)。
0327nobodyさん
04/12/13 18:19:59ID:???>>321 が答えているし、公式ドキュメントの FAQ にも書かれている。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_capture_STDERR_from_an
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#How_can_I_capture_STDERR_from_an
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq8.html#Why_doesn_t_open_return_an_err
>>325
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html#Perl_Modules
http://homepage3.nifty.com/hippo2000/perltips/module_install.htm
0329325
04/12/13 18:33:18ID:???回答ありがとうございます。
DBD::mysqlのコンパイルにチャレンジしてみます。
ちなみにCPANからのモジュールインストールはやってみたんですが、
「モジュールインストールは許可していません」ってレンタル鯖業者から怒られましたorz
0331nobodyさん
04/12/13 20:21:11ID:???if ($word =~ /(?:$sjis)*?\Q$s\E/){
クォートメタを忘れずに。
型は\x8c\x5eというコード。
\x5eこと"^"は正規表現の先頭にマッチだから、
マッチすることなく常にNGとなる。
>>54-58あたりを参照。
0332nobodyさん
04/12/13 23:51:01ID:a6u3bRjNスクリプトがMySQLサーバに送信するデータの漢字コードってどうやって決まるの?
多分MySQLサーバに接続するときに、このキャラクタセットを使いますよって言ってる
と思うんですけど、そのキャラクタセットはどうやって決められてる?
0333nobodyさん
04/12/14 06:27:56ID:???http://dev.mysql.com/doc/mysql/ja/Charset-connection.html
以後、MySQL の質問は DB 板へ。 http://pc5.2ch.net/db/
少なくとも Perl::DBI スレへ。 http://pc5.2ch.net/test/read.cgi/php/1015943725/
0334nobodyさん
04/12/14 07:07:42ID:???$num = "20041214";
$num =~ s/[\x82]//g;
$num =~ tr/O-X/0-9/;
こういうのって何か問題あったりしますか?
0x82はSJISの2バイト目にも現れないようなのですが、他にいい方法があったりしますかね。
0336nobodyさん
04/12/14 09:23:02ID:???&jcode::tr (\$value, "0123456789", "0-9");
これで動かない?
0337nobodyさん
04/12/14 12:41:51ID:???$numがSJISの数字のみからなる文字列と保証できるなら
それでいけるだろう。
でもSJISは何かとperlでは扱いにくいので避けたほうが
いいと思うけどな。入り口出口で変換して内部はEUCが
楽だと思う。
unicodeが日本語についてあんなに変じゃなけりゃ5.8
以降でunicode使うともっと楽だったんだろうけどね。
0338nobodyさん
04/12/14 14:14:33ID:XUzVLI8W=========================
・・・・・・・・
・・・・・・・・
open(OUT,">> log.csv");
print(OUT "$count\n");
close(OUT);
exit;
=========================
のような感じでログを出力するスクリプトを作成しました。
しかし、コンソールから直接起動すると正常に出力が完了するのですが、( # /フルパス/script.pl )
同じコマンドをcronにて実行すると、上記の出力の部分のみが実行されません。
(上記の出力部 以前は実行されます)
この原因として何が考えられますでしょうか?
ちなみに、コンソール、cronともrootで実行しており、
出力先フォルダ、出力ファイル(log.csv)の所有者名・グループ名はともに「root」
実行ファイル(script.pl)の権限は「755」、出力ファイル(log.csv)は「644」です。
スクリプトに問題がありそうということでしたら、
詳細の内容を記載させていただきます。
よろしくお願いします。
0339nobodyさん
04/12/14 14:22:22ID:???0340338
04/12/14 14:26:55ID:XUzVLI8W上の書込みでは 「 /フルパス/script.pl 」のように書いてしまいましたが、
実際に起動してるコマンドは以下です。
( script.sh から script.pl を読込み )
「/フルパス/script.sh」
コンソールからは正常に動作しcronでは実行されない現象は、
1.「/フルパス/script.pl 引数1 引数2」
2.「/フルパス/script.sh」
1,2 のどちらのコマンドでも発生します。
また、script.shの権限も「755」です。
■crontab の内容(毎時5分に実行)
5 * * * * /フルパス/script.sh
■script.sh の内容
/フルパス/script.pl 引数1 引数2
/フルパス/script.pl 引数1 引数2
/フルパス/script.pl 引数1 引数2
・・・
・・・(全20行)
なんかPerlの質問じゃないみたいになってしまいました、すいません
0341338
04/12/14 14:30:57ID:XUzVLI8W所有者(root)の書込み権限があれば良いと思い
「-rw-r--r--」
と設定してます
0342nobodyさん
04/12/14 14:47:00ID:???1. 実行権限に問題は無いか
2. スクリプトや入出力先をカレントからの相対パスで指定していないか
0344nobodyさん
04/12/14 15:00:03ID:???0345338
04/12/14 15:06:20ID:XUzVLI8W解決しました!
> 2. スクリプトや入出力先をカレントからの相対パスで指定していないか
が原因でした。
open(OUT,">> log.csv"); の部分を
open(OUT,">> /フルパス/log.csv");
とすることで目的の動作を行うことができました。
基本的なミスで、板汚し申し訳ございませんでした。
でもとても参考になりました。ありがとう!
0346nobodyさん
04/12/14 15:41:30ID:???- - - - - ここまでは、ご覧の釣堀の提供でお送り致しました - - - - -
0347nobodyさん
04/12/14 16:09:00ID:???0348nobodyさん
04/12/14 18:58:59ID:???文字列に数字以外が混じると嫌だから、もうちょっと安全に書くかな。
(規格上は\x82も2バイト目に含まれるから、頭からかじらないとダメなんだけど…。)
my %z2h_num;
@z2h_num{qw(0 1 2 3 4 5 6 7 8 9)} = (0..9);
my $num = "20041214";
$num =~ s/(\x82[\x4f-\x58])/$z2h_num{$1}/g;
元の仕様のままでいいなら、
$num =~ tr/O-X\x82/0-9/d;
とかが効率良さそう。
0349nobodyさん
04/12/15 00:07:10ID:8kSVNViR場合に文字化けしてしまいます。
この場合に、文字化けしたかどうかを調べるにはどのようにしたら良いのでしょうか?
0350nobodyさん
04/12/15 09:24:08ID:3pwV+643クラス(と言っていいのかな)の要素に配列を含めるとうまく動きません。
下のコードだと配列の 0 番目しか認識できませんでした。
どこが間違っているかわかりますか。
ってか、そもそも要素に配列を含めること自体は可能なことなんでしょうか。
package Test;
sub new
{
my $this=shift;
my @list=(9,8,7);
my $test={
"list" => @list
};
bless $test,$this;
return $test;
}
package main;
$test=new Test();
print "test->list[0]=",($test->{list})[0],"\n";
print "test->list[1]=",($test->{list})[1],"\n";
print "test->list[2]=",($test->{list})[2],"\n";
0351nobodyさん
04/12/15 09:29:58ID:8kSVNViR0352350
04/12/15 10:02:46ID:3pwV+643解決しました!ありがとうございます!
すみませんがもうひとつ質問させてください。
package Test;
sub new
{
my $this=shift;
my @list=(9,8,7);
my $test={
"list" => \@list
};
bless $test,$this;
return $test;
}
sub set
{
my $this=shift;
# @$this->{list}=localtime(); #←だめぽ
my @t=localtime();
$this->{list}=\@t;
}
set っていう関数の中で list の中身を localtime に入れ替えたかったのですが
「だめぽ」の行だと「Not an ARRAY reference」と言われ失敗したので、
その下の2行にしたらうまくいきました。
配列をまるごと入れ替える場合はこうやって2行にするしか方法がないのでしょうか。
もうちょっとスマートな定番の方法があったら教えてください。
0353nobodyさん
04/12/15 10:28:54ID:???@{$this->{list}} = localtime();
これと352の下の2行は意味が違うのに注意。これは
$this->{list}に入っているリファレンスが示す配列の
中身を置き換えるが、352の方法では$this->{list}を
新しく作った配列へのリファレンスで置き換えること
になる。
0354350=352
04/12/15 11:13:34ID:3pwV+643ああ、なるほど。意味はわかっていました。
中身を書き換えたかったんです。リファレンスの置き換えは苦肉の策でした。
自分では、
@($this->{list}) = localtime();
ってのも試してましたがエラー。カッコの種類が違ったんですね…。
ありがとうございました!ほんと助かりましたです。
0355nobodyさん
04/12/15 11:49:23ID:???0356nobodyさん
04/12/15 13:02:39ID:???の最後の全角スペースがどうやら引っかかっていない
みたいなのですが、全角文字は違った表記で書かなくては
ならないのでしょうか。
ご教授いただけると有難い次第です。
0359nobodyさん
04/12/15 17:17:16ID:???それもあるが、1バイトずれてマッチすることもあるから
注意してね。
たとえば$testの値が「a@」なんてときは(?:\x81\x40)に
マッチしちゃうよ。(「a@」は"\x82\x81\40"なので。)
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0360nobodyさん
04/12/15 20:07:39ID:M/kRzQtl引数のデータとログ中の一致するデータを表示する物です。
ページ送りがあるので配列の行数を得たいので
読み込んだログを配列に入れたいのですが、ここで悩んでます。
100KBのログの読み込みを250回繰り返した結果です。
1番目 2.6秒
open(FL, "パス");
while(<FL>){
push(@dump, $_);
}
close(FL);
2番目 4.3秒
open(FL, "パス");
@dump = <FL>;
close(FL);
上記の様になりました。
1行ずつ処理すると軽いといいますが、
1番目の物でも1行ずつ処理している事になっているのでしょうか?
いったん全て読み込む必要のある物は1番だと手順が増えて
2番の方がよさそうに見えていたのですが。
現在、ローカルでしかテストできる環境がないため、
実動作でも有効なのでしょうかご教授下さい。
0362nobodyさん
04/12/15 20:51:19ID:???> 実動作でも有効なのでしょうかご教授下さい。
(´-`).。oO(何のためのローカルテストなんだろう)
0363nobodyさん
04/12/15 20:58:10ID:???0364nobodyさん
04/12/15 21:55:29ID:tOkXdbQQ#!/usr/bin/perl
require './jcode.pl';
print qq(Content-type:text/plain\n\n);
print qq(OK);
exit;
では、きちんとOKと表示されるのに
#!/usr/bin/perl
use Jcode;
print qq(Content-type:text/plain\n\n);
print qq(OK);
exit;
だと「'c:\www\test.cgi' script produced no output」
と表示されてしまいます。何か考えられる原因を教えてください。
perl.plとperl.pmは同じ階層に置いてあります。
環境はWindow2000,ActivePerl5.8.4,AN HTTP1.42nです。
0365nobodyさん
04/12/15 22:17:01ID:???私のところでは問題ないけど。
二行目にこれを入れてみそ。
use CGI::Carp qw(fatalsToBrowser);
0366nobodyさん
04/12/15 22:18:04ID:???sjisという話ですが、実際はWindows code page 932(cp932)使ってませんか?
ttp://www2d.biglobe.ne.jp/~msyk/charcode/cp932/Windows-31J-charset.html
文字化けするのは、IBM拡張文字じゃないかと思います。
from_to("cp932", "euc-jp")で、変換できない文字は諦めるとして、
変換できない文字は'?'に置き換えられるので、そこをチェックするとか。
予め、変換できない文字のテーブルを作るのもいいかも。
EncodeモジュールはUnicodeを介して変換しているようで、
Unicodeに無い文字は変換できないようです。
直接計算で変換するjcode.plやJcode.pmを使えば89区から92区は
変換できるようです。
0367364
04/12/15 22:39:07ID:???回答ありがとございます。
2行目という事は↓こんな感じで良いんですよね?
#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use Jcode;
print qq(Content-type:text/plain\n\n);
print qq(OK);
exit;
↓こんなエラーが出ました(T_T)
Software error:
Can't locate Jcode/Constants.pm in @INC (@INC contains: c:/Perl/lib c:/Perl/site/lib .) at Jcode.pm line 61.
BEGIN failed--compilation aborted at Jcode.pm line 61.
Compilation failed in require at C:\www\test.cgi line 4.
BEGIN failed--compilation aborted at C:\www\test.cgi line 4.
0369364
04/12/15 22:53:50ID:???ごめんなさい。ちゃんとインストールされてませんでした。
ご迷惑をおかけしました。
…ところで、*.pmを扱うのは初めてなのですが
*.plの場合は*.cgiがあるディレクトリに置いておくだけで
動作しましたが、*.pmの場合はインストールしないと
動作しないのでしょうか?
無料ホスティングサービス等を利用する場合に
自分が希望する*.pmが無い場合は、どうすれば良いのでしょう?
0371364
04/12/15 23:06:50ID:???なるほど、鯖管じゃないと*.pmのインストールは
できない訳ですね。>>329-330等を見てる限り
自分の望む*.pmが、鯖にインストールされて
なければ、使えないって考えた方が良さそうですね…
色々とありがとうごさいました。
0374nobodyさん
04/12/15 23:39:27ID:???アーカイブの中身で必要・不要の判断がつかないなら全部そのままサーバの好きな場所にぶち込め。
で、use lib "ぶち込んだディレクトリ";とやってからuse Jcode;だ。
0376nobodyさん
04/12/16 00:14:20ID:jXnHIVD70377nobodyさん
04/12/16 01:29:55ID:B5pcTDRphtmlに表示したいのですが、
その際常に10番目には同じ文字列を表示させたいのです
どのように書けばいいのでしょうか
0382nobodyさん
04/12/16 13:56:27ID:???2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0383nobodyさん
04/12/16 14:55:31ID:kPNHSAIcセキュリティ上何に気をつけたらいいですか?漠然としていてすいません。
とりあえずtaintモードで、use re 'eval'は宣言してません。
0385nobodyさん
04/12/16 16:35:35ID:ZCA0MXpEなるほど、それはまったく考えてませんでした。
バックトラックを大量に発生させる正規表現の検出なんて
思いつきません_| ̄|○
自鯖なので、ちょっとの負荷ぐらいならいいのですが、
タイムアウトさせることにします。
0386nobodyさん
04/12/17 09:17:36ID:???CGI::Sessionはセッションの有効期限があり、有効期限を
過ぎるとエラーになるまでは良いのですが、有効期限が
切れたセッションデータ(ファイル)がディレクトリに無限に
溜まっていきます。
ユーザーがログアウトするなりして、セッションを閉じれば
消えるのですが、ブラウザを閉じられたりするとセッション
を消すタイミングがわかりません。
これらの有効期限切れのセッションデータは、どのように
して削除すれば良いのでしょうか?
0388nobodyさん
04/12/17 11:00:46ID:???ありがとうございます。
…しかし、ファイルが消えてくれません。
use CGI::Session::ExpireSessions;
CGI::Session::ExpireSessions->new(temp_dir=>'./session', verbose=>1)->expire_file_sessions();
↑こんな感じで消そうとしてるのですが…。
作る側は↓こんな感じなのですが。
my $session = CGI::Session->new(undef,undef,{Directory=>'./session'});
$session->expire('+1m');
$session->param( 'id', $id );
どこか、間違ってる所はあるでしょうか?
0389nobodyさん
04/12/17 11:12:36ID:???examplesにある例もそんな感じだから、動きそうなもんだけどね。
verboseを1にしてるからなんかメッセージでてないすか?
ありがちな間違いとしては、カレントディレクトリが適当でない
(temp_dirが相対パスなので)か、実行するユーザが適当でない
あたりかと。
0390nobodyさん
04/12/17 11:27:29ID:???ごめんなさい。消えました。
原因はセッションファイルの頭に付く'cgisess_'を
変更してた為でした。ExpireSessions.pmの中の
'cgisess_'を同じように変更したら、うまく動きました。
どうもご迷惑をおかけしました。
0391nobodyさん
04/12/17 15:54:21ID:???ループを0〜8と10〜99に分けるとか
ループの中でif分噛ませるとか
配列に入れといてあとから[9]を上書きするとか
0392nobodyさん
04/12/18 00:47:15ID:l7mnvpO6timelocal 内のエラーメッセージを表示させずにエラーを検出し、
自分で定義したエラー処理を行いたいのですが、どうすればいいでしょうか。
0394nobodyさん
04/12/18 06:04:33ID:???my $t = eval{ timelocal(0, 0, 6, 18, 12, 104) };
$@ and print "エラーですな $@";
0395392
04/12/18 16:45:30ID:l7mnvpO6おお!できますたよ。ありがとうございます。
0396nobodyさん
04/12/18 22:25:58ID:Zy8umN1o誕生記念age
0397nobodyさん
04/12/18 22:34:22ID:???0398nobodyさん
04/12/18 23:29:49ID:???. ,,-'''~;;;;;;;;;;;;;;;;;;;;;;~'-_,,,,_
. /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~ヽ,
. /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;;;;;;;;;;;;;;ヽ
/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;i;l;;;;;;;;;;;;;;;;;;;l
. /;;;;;;;;;;;;;;;;,;;;;;;;;;;;;;;;;;;;;;;;/l;;l;l\;;;;;;;;;;;;;;;l
l;;/;;;;;;;;;;;/l;;;;;;;;;;;;;;;;;;/;///l;l \;;;;;;;;;;l
. l;;l;;;;;;;;;;;;/;l;;;;;;;;;;;;;;;;;//// l/ ヽ;;;;;;;;l
l;l;;;;;;_,,,,l- '''''''''~~~''~ ' ~''''''--,, .ll;;;;;;;l
''-l',-'l _,,-'''(~)' '~l~(~),-,_'' l;l;;;;;;l
. l.l l ' l;;;;;;ol .lo;;;;;;l ' /~ヽ;;l
. l;ヽ l ~~~ , ~~~ / ノ;;;l
. .l;;l;;;i~''l ,__, /-i''l;;;;;;l
l;;l;;;l;l;;;;ヽ,_ ./;;;;l;l;l;;;;;;l
. l;;ll;;;l;l;;;;;;;;;l~'''i-,,_ _,,,-i'''~;ll;l;;;;;l;;ll;;;;;;l
l;;ll;;;l;;l;;;;;;;;;ll,/'l ~~ lヽ,_ll;l;;;;l;;;l;;;;;;;l
l;;ll;l;l;;l;;;,-''~ lノ '/ '-,,_;l;;;;l;;;;;;l
. l;/;l,,-'~ l_ _/ ~'-,;l;;;;;l
l,-i~l l l~'' '~/ .//'-,;l
i'l l. l l l ./ .// / 'l
. l. l. ヽヽヽ _,,-'~-l /-'''-,_ /./. / l.l
. l iヽ ヽヽ,''~,---,ヘ,-,ヘ--,,~''-'//.i /,.l
l| lヽl ヽ,_~ヽ ,-/l~lヽ,, /~'',/ .l // l
/l ヽ l /\/.l l l lヽ-'ヽ~'' .l// .l
. /;l ヽl. \ l l l l / l/ l
0399nobodyさん
04/12/18 23:30:21ID:???(⌒\:::::::::/⌒(⌒∨⌒)
( ̄>::( ゚Д゚)<(⌒\:::::::/⌒)
( ̄/:::::::: (_>::( ゚Д゚)::<
/((⌒∨⌒(_/U::U\__)
/ (⌒\::::::::/ (_∧_)`∨⌒) 、@,
<(__>::( ゚Д゚)::<__し//J\::::::/⌒;@@^
|ヽ(_/::::::::\_)(_>::( ゚Д゚).つ|/`
| ヽ. (_∧_) // (_(ノ:::::::\_)
| \し|.|J ////(_∧_)
l `.:7 ̄ ̄ ̄ ̄ ̄/ し"J
ヽ / .:::/
/ ̄ ̄ヽ(,,゚Д゚) ~ ̄ヽ < おめでとうございます!
ヾニニ=/./ハゞ\=ニン
/ / /| |ヽ \
(__ ̄l/__U"U V`"
0400nobodyさん
04/12/20 08:55:27ID:???いや、絶対なんか便利なモジュールがあると思うんですが、ちょっと検索してもスパッとでてこないので……
0402nobodyさん
04/12/20 10:07:18ID:???txtファイルのアドレスを送ってファイルオープンしようとしたら出来ませんでした
アドレス自体は、確認したところちゃんと送られてるようでしたし
ファイルも、送られてくるアドレスでなく、相対パスをいれたら開くことが出来たんですが
urlではファイルのオープンは出来ないのでしょうか?
0404nobodyさん
04/12/20 11:17:15ID:???mod_perl 環境下で Apache::Request の headers_in() を使え
という話になるわけだな
0405nobodyさん
04/12/20 13:25:42ID:???ただ、どうしても生のヘッダ全てが欲しいならしょうが
ないが、CGIでも環境変数経由である程度は情報もらえる
ので、それでなんとかなることもある。
0407400
04/12/20 13:51:18ID:???む、mod_perl必須ですか。mod_phpがなかったのでPerlならと思ってみたんですが……今のレン鯖じゃだめかー
やりたかったのはIf-Modified-Sinceをぶんどることなので環境変数経由じゃダメっぽい。
レスありがとうございました。
0409nobodyさん
04/12/20 15:59:24ID:???次のような状況で、エラーは出ないのですがこれは問題ないのでしょうか。
ご指導下さい。
script.cgiでuse strict;って書いてコーディングを厳格化しています。
そこで、require "library.pl";としてあります。
library.plには、宣言されていない変数が使用されていますが大丈夫でしょうか。
library.plではstrictしていないのでこれは問題ないのでしょうか。
よろしくお願いします。
0410nobodyさん
04/12/20 16:07:28ID:???use strict;でもscript.cgiの記述が対象になるだけで
requireされたライブラリの中身までは見ない。
0411nobodyさん
04/12/20 22:25:10ID:???FTP使えなくてTeraTermからviでコーディングさせられてて、超しんどいです。
できたら予約語ハイライトがあったら嬉しいですが
これよりマシな環境なら何でもいいので、どうかお願いします。m(_ _)m
0412nobodyさん
04/12/20 22:28:11ID:???0414nobodyさん
04/12/21 00:58:35ID:???自分のPCからFTPクライアントが使えないのか、shからもFTP出来ないのか、
>>412って事だから、この際PerlでFTPクライアント組んじゃえ。
そしたら自分でFTPサーバ立てれば(もしくはどっかにUP)、shから落とせるな。
Net::FTP使えば、ワンライナー程度でも十分いけそうな感じ?
ま、別にFTPにこだわる理由は無いのだが・・・
0415411
04/12/21 01:59:02ID:???レス有難うです。
とりあえず入力補完があるらしいemacsで頑張ります。
非武装サーバにログインして、そこからssh経由で開発サーバに接続
という2段構えになっていて、どっちのサーバも設定触れないので・・。
スレ違い申し訳ない。平にご容赦を。
0416nobodyさん
04/12/21 06:35:50ID:???scpとか。
コピペでviに流し込むとか(teratermだと無理かな?)。
Unix板の方が適切なレスもらえると思うけど。
0417nobodyさん
04/12/21 20:22:36ID:???0418nobodyさん
04/12/21 22:20:45ID:???Perlについての質問箱 14箱目
http://pc5.2ch.net/test/read.cgi/tech/1101649274/
0419nobodyさん
04/12/22 01:13:08ID:???0420nobodyさん
04/12/22 02:02:21ID:???Windows上からアップしたいならWinScp使えば?
0421nobodyさん
04/12/22 19:14:08ID:PL97VF7o配列に格納したいのですが、なかなか上手くいきません・・。
全部グローバル変数とかでやるなら、
open FH '<', "data.csv";
$i = 0;
while(<FH>){
chomp;
$count = sprintf("data%03d", $i);
@$count = split(/;/);
$i++;
}
close(FH);
と記述して一応は出来たのですが、最近use strict;なるものを知ってからは全く手が出なくなってしまいました。
どういった記述をすれば別々の配列に格納することが出来るのでしょうか?
まだuse strict;について全然理解していない段階で聞くのもどうかと思ったんですが、思い切って書いてみました。
説明も上手く出来なくて申し訳ありませんが、何かご指導お願いできないでしょうか。
よろしくお願いいたします。
0422nobodyさん
04/12/22 19:23:36ID:???何これ???
0425nobodyさん
04/12/22 20:06:11ID:???ワラタ
0427nobodyさん
04/12/22 20:45:13ID:???配列の配列を使う。
my @count;
open(FH, '<', "data.csv") or die $!;
while(<FH>){
chomp;
push(@count, [ split(/;/) ]);
# これはこんな意味
# my @dummy = split(/;/);
# push(@count, \@dummy);
}
close(FH);
アクセスするには?
$count[$i]->[$attr]; # 明快
$count[$i][$attr]; # 同じ意味だけど、私は嫌い
例えば$count[1]->[1]とは?
$count[1]に配列のリファレンスが入っているので、
それを->[1]を使いデリファレンスする
ということ。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html#LISTS_OF_LISTS
0429nobodyさん
04/12/22 22:48:45ID:???>>427の通りで出来ると思うけど、こっちもついでに >
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
0430nobodyさん
04/12/22 22:56:49ID:???ま、なんとなくそういう前提で書こうとしてるだけの気はするけどな。
どうしてもそうしなければならない理由はいくら考えても思いつかないし。
0431nobodyさん
04/12/23 00:32:14ID:???use strictを記述すると 変数名に型宣言をしないとエラーが表示される
ということで、早速以下のようにコードを書いて試してみたのですが
エラーがまったく出ずに
ブラウザには「test : 0」と通常通り表示されるのみです。
何故エラーが出ないのでしょうか。
#!/usr/bin/perl -w
use strict;
$a = 0;
print "Content-type: text/html\n\n";
print "test : " . $a;
0432nobodyさん
04/12/23 00:37:33ID:???0434431
04/12/23 00:45:14ID:???$aでなく$abcにしたら見事エラーがでてページが表示されませんでした。
知りませんでした…
ありがとうございました。
0435nobodyさん
04/12/23 00:49:46ID:???つーかperldocに思いっきり書いてあるから。
0436nobodyさん
04/12/23 00:52:21ID:???これですね。
Because of their special use by sort(),
the variables $a and $b are exempted from this check.
0438nobodyさん
04/12/23 01:48:55ID:???となると本当に極めるにはPerlのソース読むが一番と。
ま、確かにそうだな。
0440nobodyさん
04/12/23 14:15:05ID:???9を16回(4.9999999999999999)繰り返すとなんで5以上の判定なんだ。
print "数値を入力: ";
$value = <stdin>;
chomp ($value);
if ($value >= 5)
{
print "5以上\n";
}
else
{
print "5未満\n";
}
0441nobodyさん
04/12/23 14:49:47ID:???0442nobodyさん
04/12/23 15:00:41ID:???0を足してみれば分かるかも。
$value = 4.9999999999999999;
print(0+$value);
Perlの内部で値を正しく表現できないと表現誤差が出る。
そういうときは、
use bignum;
を宣言する。
0443nobodyさん
04/12/23 15:37:47ID:???0444nobodyさん
04/12/23 23:37:19ID:a8M2UJvQ使いたいモジュールが入ってるか調べたいのですがどうやって調べられますか?
0445nobodyさん
04/12/23 23:41:49ID:???0446nobodyさん
04/12/23 23:59:18ID:???expires値も食わせてるし、IEの設定をヤワにしても駄目。
Firefox1.0はちゃんと食ってるんですが…。
IEに独特な制約とかって、ありましたっけ。
0450nobodyさん
04/12/24 00:58:03ID:???use PHP::Perlinfo;
perlinfo();
こうやってみましたけど、500エラーになっちゃいました。
0454nobodyさん
04/12/24 08:09:11ID:o66Ux/q0やりたいことは、画像ファイルをアップしてもらったときに、その画像を表示させる際、widthとheightの指定をするために、数値が必要なのです。
表示する際に取得しても、アップされたときに取得してdatファイルに書き込んでもどちらの方法でもいいんですが、
いいやりかたがありましたらお教え下さい。
0455nobodyさん
04/12/24 08:22:07ID:???Image::Magickが使えるならもっとお手軽。
0456450
04/12/24 10:56:48ID:tsjI5bY5だからレンタルサーバーだからわかりませんて。
0457nobodyさん
04/12/24 11:24:35ID:???別に.pm無くても調べれるし、そういうスクリプトも配布されてるけどな。
てめーのその書き方が気に入らないから教えない。
勝手に調べろ。どーせすぐ見つかる。
0458nobodyさん
04/12/24 11:42:50ID:???RPM使うのが手っ取り早いんじゃ?
0461nobodyさん
04/12/24 13:21:51ID:???0462nobodyさん
04/12/24 13:30:52ID:???0463nobodyさん
04/12/24 13:36:23ID:???-> レンタル業者のサポートセンターに電話して確認汁
「500エラーになってしまいます」
-> レンタル業者のサポートセンターに電話してエラーログを教えてもらう
一番確実、簡単、早いヽ(゚∀゚ )ノ
0464nobodyさん
04/12/24 13:48:24ID:???use CGI::Carp qw(fatalsToBrowser);
を頭の方にいれとくだけでエラーメッセージが
ブラウザに出るようになるからかなりやりやすく
なると思うのだが。
0465nobodyさん
04/12/24 17:25:57ID:???0466nobodyさん
04/12/24 17:30:09ID:???結局サーバでやるしか無い場合もちらほら。
0468nobodyさん
04/12/24 21:08:00ID:???ActivePerl ならリポジトリに以下のサイトを加えると PPM で入るな。
http://www.bribes.org/perl/ppm
0469nobodyさん
04/12/24 22:32:19ID:cTzXcA78通常のPC宛には正常に届きますが、ドコモに送ることができません。
画面上ではエラーにはなりません。
携帯のドメイン指定受信は間違いありません。
require "jcode.pl";
$mailer = '/usr/lib/sendmail';
$mlfrom = '[email protected]';
$mlto = '[email protected]';
$mlsb = "件名";
$body = "ほげほげ";
jcode'convert(*mlsb, "jis");
jcode'convert(*mlms, "jis");
$mlhd = "From: $mlfrom" . "\n" . "To: $mlto" . "\n" . "Subject: $mlsb" . "\n\n";
$err = 0;
open(MAIL, "| $mailer -t") or $err = 1;
if ($err == 0) {
print MAIL $mlhd;
print MAIL $mlms;
print MAIL $body;
close(MAIL);
$msg = 'メール送信正常に処理しました。';
} else {
$msg = 'メール送信エラー';
}
0470nobodyさん
04/12/24 23:08:26ID:???0471nobodyさん
04/12/24 23:12:43ID:cTzXcA78前に、Net::SMTPとかいうの使ったら送れたんですが・・・。
0472nobodyさん
04/12/24 23:13:38ID:cTzXcA780473nobodyさん
04/12/24 23:20:03ID:???sendmailのログを見ろ。これ以上はperlいじってもわからない。
「メール送信エラー」になるのなら、$!を表示させるべし。
0474nobodyさん
04/12/24 23:23:02ID:???・送信を規制しているIPアドレスがある(らしい)
・スクリプトを実行しているドメインは$mlfrom と一致しているか?
0475nobodyさん
04/12/25 13:35:49ID:???0476nobodyさん
04/12/25 15:46:52ID:???$bodyはjis変換しないの?
$mlmsってどっから出てきた?
MIME-VersionとかContent-typeとかのヘッダー付けないの?
ちなみにbase64使って件名を変換するならこれでいいはず・・・
use MIME::Base64;
&jcode'convert(*mlsb, 'jis');
$mlsb = encode_base64($mlsb);
$mlsb =~ s/\n//g;
$mlsb = "=?ISO-2022-JP?B?" . $mlsb . "?=";
0477nobodyさん
04/12/25 16:12:32ID:???http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64
0478nobodyさん
04/12/25 23:20:20ID:bFVNXg4wchmod 0777,<*>;
単純にやるならこれで大丈夫なものの、
ディレクトリ > ディレクトリ > ファイル
のように階層が深くなると書き方が判りません。
何か定石はないでしょうか?
0479nobodyさん
04/12/25 23:31:08ID:???http://www.itmedia.co.jp/help/tips/linux/l0647.html
0481478
04/12/25 23:49:48ID:bFVNXg4wありがとうございます。
ただ、Perlでの記法が知りたいのです。
言葉足らずで申し訳ありません。
0482nobodyさん
04/12/26 00:16:31ID:???type="file"を使うときはenctype="multipart/form-data"にしろ、とあったので、
form要素にそれを記述したら、書き込み自身できなくなりました。
サーバーによってファイルのアップロードができない、とかそういうのはあるんでしょうか?
0485482
04/12/26 01:58:00ID:???データの受け取り方がテキストとは違うようですね。
0486nobodyさん
04/12/26 02:11:01ID:???フォームからCGIへ値を渡す時、何を使ってデコードしてるんだい?
CGI_Lite.pmあたりを使ってりゃ、問題は無いはずだよん。
0487nobodyさん
04/12/26 02:14:01ID:???0488482
04/12/26 02:24:06ID:???if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
とやって、$bufferを散々弄繰り回しておりました。
type=fileを使うのは初めてなので緊張してます。
CGI_Lite.pmというものを探して使い方を勉強してみます。
有難う御座いました。
0489482
04/12/26 03:25:48ID:???あとは、これを画像ファイルとして生成するだけなんですが、
GIF89aから始まる文字列の中のどこに元々のファイル名が含まれてるんでしょうか。
抽出方法がありましたら教えてくださいますようお願い致します。
単純に文字列の中には見つかりませんでした。
0490nobodyさん
04/12/26 03:28:57ID:???0491482
04/12/26 03:31:54ID:???回答有難う御座います。
ということは、<input type="file">のパスを抽出出来るようにしなくちゃいけないわけですね。
なんだかいろいろ見えてきたような気がします。頑張ります。
0492nobodyさん
04/12/26 04:28:34ID:???0493nobodyさん
04/12/26 09:31:51ID:mhqMgdk4PHPからperlをexecで実行させる処理を書いてるのですが
perlスクリプトへの引数で
エスケープが必要な文字ってなにがあるのでしょうか?
試した限りでは
" は \"
\ は \\
にして " で囲えばいいかなと思ったのですが。
0494nobodyさん
04/12/26 10:04:43ID:???print qq|ここに"でも\でも好きなだけ書くがよい|;|
0495nobodyさん
04/12/26 10:08:15ID:???0496493
04/12/26 10:28:19ID:???ごめんなさい
実行スクリプトの引数の話しです
第一引数:aaa
第二引数:aa"a
第三引数:a\a
xxx.pl "aaa" "aa\"a" "a\\a"
こんな感じなのですが
0497nobodyさん
04/12/26 13:04:55ID:???PHP なら escapeshellarg 使えば済むような気がするが、スレ違い気味だ
0498nobodyさん
04/12/26 13:06:01ID:RQ2dyxHHprint join("\n", @ARGV),"\n"; とかやって確認できない?
0500nobodyさん
04/12/26 23:47:49ID:???PHPでPerlなんか起動するなよ。
0502nobodyさん
04/12/27 08:22:06ID:???俺もmySQL使う時はPHP使うよ。
Perl+DBは遅いイメージがあるし、mod_perl使えないし。
誰かこのイメージ払拭させてくれませんか?(スレ違い)
0504nobodyさん
04/12/27 14:15:25ID:Wb/eo+Oruseの行で
$ ../xxx.pl
Can't locate xxx.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-
linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /
usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl /usr/local/lib/
site_perl/5.6.1/i386-linux /usr/local/lib/site_perl/5.6.1 /usr/local/l
ib/site_perl .) at ../xxx.pl line 39.
となってしまいます。
useの行の前で
push(@INC, '/xxx/xxx/xxx');
としてxxx.pmがあるパスを指定してるのですが
それがエラーメッセージの「@INC contains」に表示されていません。
@INCに追加できていないということなのでしょうか?
0505nobodyさん
04/12/27 14:18:01ID:???かuseの前に
BEGIN
{
push(@INC, '/xxx/xxx/xxx');
}
0506504
04/12/27 14:28:57ID:???ありがとうございます!
スクリプトを読み込むと同時にuseが処理されてたということ
だったのですね
ずっと悩んでました m(__)m
0507nobodyさん
04/12/27 15:51:41ID:???私は今までずっと引数でセッションIDを引き回す方法をとって
いたのですが、とある案件でmod_perlの「PerlTransHandler」と
いうものを使うことにより、自作モジュールをプログラム読み
込み前にロードし、セッションIDをsubprocess_envというものを
使用して環境変数に埋め込むという方法を知りました。
これであれば引数を使用することはなくなりますし、静的ペー
ジでもセッションIDを保持することが出来ます。
これからこの方法を使っていこうと思ったのですが、今回の
案件がモジュールのインストール関連を許可してくれない
関係で、この方法はとれなくなってしまいました。
この他に似たような方策があれば、ご教授いただきたく思っ
ております。
宜しくお願いいたします。
0508nobodyさん
04/12/27 17:19:58ID:d87nS7mBmy $a = "123456789";
$a =~ s/(?:\xA3([\xB0-\xB9]))/ chr(ord($1)-0xB0+ord('0')) /eg;
print $a;
>123456789
↑自分で全角数字を半角数字に変換するコードを考えたのですが、
マルチバイト文字などの中間に誤ってマッチしてしまいます。
例→隠隠
1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには
完全に誤作動してしまいます。
どうすればよいでしょうか?
0509nobodyさん
04/12/27 20:29:10ID:???ほとんどFAQだが、
(1) 5.8以降のユニコード機能を有効にすればtr/0−9/0-9/でいけるが
いろいろ落とし穴が(笑)
(2) Jcode.pmのtrを使う
(3) 自分で書きたければ ttp://www.din.or.jp/~ohzaki/perl.htm
あたりが参考になるだろう
0510nobodyさん
04/12/27 20:32:05ID:???Apache::ClickPath かあ。URLのパス部分にセッションIDを埋め込むやつだよね。
頑張れば mod_rewrite で似たようなことを実現できそうな気もする。
ただその場合「Perl コーディングの質問」では無くなってしまうのだけれど。
「mod_rewrite すらダメ」と言われると厳しいかも。
0511nobodyさん
04/12/27 21:12:19ID:???そうです!まさにそれでございます!
mod_rewriteでしたらできる可能性があるんですね。
ちょっと上司に使用許可を求めてみたいと思います。
0512nobodyさん
04/12/28 11:03:41ID:???1を渡したら、ab
(略)
25を渡したら、az
26を渡したら、ba
(以下略(ただし、zzまでの有限配列))
となるようにしたいのですが、どうすればいいのでしょうか?
全部記載した配列を使ってるのですが、重そうなので簡単な方法があれば知りたいです。
おねがいします
0513nobodyさん
04/12/28 11:16:40ID:???キミがしたいのは、こうゆうことか?
foreach ('aa' .. 'zz'){
$list[$count++] = $_;
}
0514508
04/12/28 11:18:22ID:/d0b1jT1jcode.plでもできるようです^^;
アホなことをしてしまいました。
しかしどうやってるのでしょうか?
>1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには
>完全に誤作動してしまいます。
これをどうやってクリアにしたのか気になってjcode.plのtrの中身を
見てみましたが・・・・・・・orz
字句解析でもしてるんだろうか
0516512
04/12/28 12:11:25ID:t9GmHYc3> >>512
> foreach ('aa' .. 'zz'){
> $list[$count++] = $_;
> }
今、それとほぼ同じコードなんだけど、676個も要素をメモリに読み込んでるから軽く出来る方法はないかとカキコしますた
0517nobodyさん
04/12/28 13:22:09ID:???掲示板のCGIで半角カナを使用するために半角カナが使用できるjcode.plを入れたのですが、
どうやら掲示板のCGIの方でも改変すべき箇所があるみたいです。
jcode::convert(\$value,$gl->{mycode});
if ($gl->{mycode} eq 'sjis') {jcode::h2z_sjis(\$value); }
if ($gl->{mycode} eq 'euc') {jcode::h2z_euc(\$value); }
か
jcode::convert(\$message,'jis');
あたりだと思うのですが半角カナ→全角カナへのコンバートをしないようにするためにはどうすればいいのでしょうか
0518nobodyさん
04/12/28 14:48:39ID:???hankaku to zenkaku の意味
0519nobodyさん
04/12/28 14:58:26ID:???0520nobodyさん
04/12/28 16:02:26ID:???jisコードには半角カナが無いので、jisコードに変換した時点でアウト
0523nobodyさん
04/12/28 16:31:52ID:???それだったらJISへ変換は当然として、そこは半角にはできないな。
いずれにしても改造スレのほうが適切じゃないか?
0524nobodyさん
04/12/28 18:23:28ID:???0526nobodyさん
04/12/28 20:08:29ID:???$var1='あかさたなはまやらわ';
$var2='亜加差多菜羽真矢裸和';
この二つの変数を使って
s/あ/亜/g;
s/か/加/g;
s/さ/差/g;
…
みたいな置換をしたいのですがグルっても分かりませんでした。どういう処理をすれば良いんでしょうか。
0527517
04/12/28 21:20:58ID:???レスありがとうございました。
良く考えたら半角→全角変換しないでいいのならjcode.pl自体使う必要がないので、
cgi中からjcode.plを抜き取ればいいだけでした。
0528nobodyさん
04/12/28 21:36:42ID:???my @key = ('a'..'z');
my $keynum = scalar @key;
# my $d = 675;
my $code = $key[$d/$keynum].$key[$d%$keynum];
# 繰り返し使うなら、配列の方が負荷は軽いと思う。
>>526
文字コードとPerlバーションを書くべし。
>>527
JISコードへのコンバートはしなくていいの?
0531nobodyさん
04/12/28 23:30:38ID:???微妙だね。
String::Multibyteを使ったもの。
use String::Multibyte;
my $mbcs = String::Multibyte->new("shiftjis");
my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
print $mbcs->strtr('あめんぼ あかいな あいうえお', $var1, $var2);
0532531
04/12/28 23:32:16ID:???require 'jcode.pl';
my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
my $tr = sjis_tr($var1, $var2);
print $tr->('あめんぼ あかいな あいうえお');
exit;
sub sjis_tr
{
my ($from, $to) = @_;
jcode::euc(\$from, "sjis");
jcode::euc(\$to, "sjis");
return(
sub {
my $line = shift;
jcode::tr(\$line, $from, $to);
return($line);
});
}
--
encodingを使ったもの。
use encoding "shiftjis";
my $str = 'あめんぼ あかいな あいうえお';
$str =~ tr/あかさたなはまやらわ/亜加差多菜羽真矢裸和/;
print $str;
0533531
04/12/28 23:38:14ID:???my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
my $tr = sjis_tr($var1, $var2);
print $tr->('あめんぼ あかいな あいうえお');
exit;
sub sjis_tr
{
my ($from, $to) = @_;
my $sjis = '[\x00-\x7e]|[\x0x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]|[\xa1-\xdf]';
my %keys;
my @key_code = ($from =~ /($sjis)/g);
@keys{@key_code} = ($to =~ /($sjis)/g);
my $key = '('. join('|', map{ quotemeta($_) } @key_code). ')';
my $pattern = qr/\G((?:$sjis)*?)$key/;
return(
sub{
(my $str = shift) =~ s/$pattern/$1$keys{$2}/g;
return $str;
});
}
0534531
04/12/29 00:18:35ID:???sub sjis_tr
{
my ($from, $to) = @_;
jcode::convert(\$from, "euc", "sjis");
jcode::convert(\$to, "euc", "sjis");
return(
sub {
return jcode::sjis(jcode::trans(
jcode::euc(shift(), "sjis"), $from, $to), "euc");
});
}
0537nobodyさん
05/01/03 03:52:58ID:BvOHark/例えば
@foo = qw(1 2 3 4 5 6);
という配列があったら
1:2 3 4 5 6
2:1 3 4 5 6
3:1 2 4 5 6
4:1 2 3 5 6
・・・
というように取り出したい。
foreachとifを使って地道にやらないとだめかなぁ
0539nobodyさん
05/01/03 04:17:37ID:Jw9YIMiU今作成中のアクセス解析でshift_jisで出力した際
検索文字列に上のような文字化けが出るんですが、
これ元がどの言語コードが分かりますでしょうか?
漢字 \ x アルファベット 数字
という規則的な並び方してるのですが、
お分かりの方いたらご教授お願いしますm(__)m
0540nobodyさん
05/01/03 04:35:28ID:???俺だったら、おとなしくforeachを使うと思う。
少し考えてみて、いい方法があったら、後で書き込みます。
>>538
それだと、配列中に要らない値が重複して存在する場合、
その値に対応する要素が複数削除されるぞ。
0541nobodyさん
05/01/03 04:44:00ID:???>それだと、配列中に要らない値が重複して存在する場合、
>その値に対応する要素が複数削除されるぞ。
元質問だといらない値以外が残ればいいんじゃないの?
0543540
05/01/03 05:39:41ID:???を使えば楽みたいね。今まで使った事なかった、鬱 orz
例(※検証してません):
@foo = qw(1 2 3 4 5 6);
splice(@foo, 1, 2);
print join(',',@foo) , "\n";
結果:
1,4,5,6
0544nobodyさん
05/01/03 06:08:27ID:???CPAN 経由でインストールしたモジュールをアンインストールするには
どうすればいいの??
0546nobodyさん
05/01/03 14:59:35ID:???0550540
05/01/03 16:01:28ID:???読んでるよ。
offsetとlengthは、537に合うように変えてくれれば良い。
その意図で543の様に書いたんだし。
ま、549の言う通りだな。
540の指摘が癇に障ったなら謝るわ。
0551nobodyさん
05/01/03 16:02:09ID:???>1:2 3 4 5 6
>2:1 3 4 5 6
>3:1 2 4 5 6
>4:1 2 3 5 6
これは表示結果なのか、あるいは1を任意の要素(の値)とすると
残りの要素(の値)である2 3 4 5 6を取り出したいのかわからんね。
まあ、>>537が再度書くまで放置するしかあるまい。
0552nobodyさん
05/01/03 16:02:10ID:???中身を見て、取り出すなら。('3'を取り出してみるとすると)
my @foo = qw(1 2 3 4 5 4 3 2);
my @found = grep{ not index($foo[$_], '3') }(0..$#foo);
defined $found[0] and splice(@foo, $found[0], 1);
# grepがちょっぴり優雅だから、普段はforeach回すかなぁ。
0553nobodyさん
05/01/03 16:21:47ID:???だったらそこまで複雑にしなくても>>543のように
splice(@foo, 2, 1); でいいのでは?
0554nobodyさん
05/01/03 16:24:24ID:???「@foo[2]の3だけ除かれる」
0555nobodyさん
05/01/03 17:05:07ID:???>>552は中身が'3'の最初のものを削除するんだけど、
'3'が常に$foo[2]にあるとは限らないとしたら?
または、配列に'3'が含まれていなかったら?
質問では、配列の内容は
> 例えば
だから実際は、
use List::Util qw(shuffle);
my @foo = shuffle (1..10);
なんて物かもしれないしね。
0556nobodyさん
05/01/03 17:15:15ID:???>'3'が常に$foo[2]にあるとは限らないとしたら?
>または、配列に'3'が含まれていなかったら?
全然影響しないでしょ。
>splice(@foo, 2, 1);
foo[2]を1個取り除くだけなんだから。
元質問が複数の要素を一度に取り除いたものを得たい、または
要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
0557nobodyさん
05/01/03 17:35:35ID:???> 中身を見て、取り出すなら。('3'を取り出してみるとすると)
> 中身が'3'の最初のものを削除するんだけど、
これは無視?
> 要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
別も何も、これをコード化したものですが。
>>549さんの
> というか元質問自体が曖昧なので、同じ値を削りたいのか
> n番目の値を削りたいのかどちらともとれるし。
という意見の"同じ値を〜"の方のコードを書いたまでです。
0558537
05/01/03 19:03:14ID:BvOHark/深夜に作業するもんじゃないですね。
n番目の値以外の要素を取り出したい、と言うのが真意でした。
#n番目の値以外を全て足し合わせると言うルーチンを作りたかった
#
#@foo = qw(1 2 3 4); という配列があったら
#$bar[0] = 2+3+4
#$bar[1] = 1+3+4
#$bar[2] = 1+2+4
#$bar[3] = 1+2+3
要素は重複する可能性があります。
#grepでそのままやるのは無理そう?
0559nobodyさん
05/01/03 19:39:41ID:BmWNnWLw例↓
open IN, "aaa.txt";
open(IN, "aaa.txt");
私の持っている本には、括弧が書いてある本と書いていない本が
あるのですが、括弧についての説明がなくてよく分かりません。
説明しているサイトも見つけられませんでした。
よろしくお願いします。
0560nobodyさん
05/01/03 20:13:20ID:1lDTWYQSほとんどの場合プログラマの意図したとおりに補ってくれるが、
ごく稀に、意図しないところに括弧を補って恐ろしい動作をしてくれることもある。
まあ演算子の優先順位を厳密に考えてれば防げることなんだが、
それよりは括弧を明示的に付ける方が楽ではある。
0561nobodyさん
05/01/03 21:21:18ID:???配列を壊していいならspliceで、壊したくなければ>>546の配列
スライスでいいんでない。要素の位置で指定する場合は配列を
そのままgrepでは無理です。どうしてもgrepつかいたけりゃ
0..$#fooでインデックスの配列作ってそっちにgrepする手はある
けど。
オーバーフローや浮動小数点の誤差を気にしなくていいのならば、
配列を加工しようとせずに全部の要素の和からn番目の要素の値を
引き算する方がいいかもね。
0562nobodyさん
05/01/03 21:30:46ID:???どこをブロックすればいいの?
正規表現で全部チェックすれば良いのかな。。。
あと、安全のためにブロックした方が良い文字ってある?
0563nobodyさん
05/01/03 21:37:14ID:???どの文字をブロックするか考えるより、何を通していいか考えて
それだけ通すようにした方がいいと思うよ。
あとは出力するときに過不足なくエスケープすること。
-Tフラグを使うとすこし安心かもね。汚染除去するときの正規
表現を適切なものにしないと意味ないけど。
0564559
05/01/03 22:38:42ID:???それじゃ、Perlでは括弧は常につけておいた方がいいということなんですね。
他の言語はVBしか知らないのでVBですみませんが、
VBだと関数の戻り値がある場合は括弧が必須で、
ない場合はどちらでもいいようです。
Perlでも何か違いがあるのかと思っていました。
どうもありがとうございました。
0565nobodyさん
05/01/04 01:14:24ID:WiFbXIfdPerlは変幻自在な妖怪みたいな言語
0566nobodyさん
05/01/04 02:41:43ID:???┏┓ ┏━━┓ /.,;彡;, ..,;,. ゙ミヽ、 ┏━━┓ ┏┓ ┏━┓
┏┛┗┓┃┏┓┃ /ソノ;彡;彡;彡;彡'゙ヽ;゙i;,ヽ ┃┏┓┃┏┛┗┓┃ ┃
┗┓┏┛┃┗┛┃┏━━━{i;゙|il|l!ノ彡';彡;'','⌒ ゙!l!l}i゙!━┓┃┃┃┃┃┏┓┃┃ ┃
┏┛┗┓┃┏┓┃┃ {ノl!|!;ソ;ノリノ'″Perlノ;li|l!1 ┃┃┃┃┃┗┛┃┃┃ ┃
┗┓┏┛┗┛┃┃┗━━━'{i|{il{li゙!ソ;' ` ' `"″!l}!i|!━┛┃┃┃┃ ┃┃┗━┛
┃┃ ┃┃ '{;l!|{i!リ'' _ノ ;i|!レ' ┃┗┛┃ ┏┛┃┏━┓
┗┛ ┗┛ '゙i!|!;'、,_´__,ノ '″ ┗━━┛ ┗━┛┗━┛
0567nobodyさん
05/01/04 18:05:38ID:???例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」
が入っていたときに<p>から</p>までの間の「あああいいい」を取り出すにはどうしたら良いでしょうか?
よろしくお願いします(;´Д`)人
0568567
05/01/04 18:09:51ID:???0569nobodyさん
05/01/04 18:16:31ID:ufv1QlyO例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」が入っていたときに
<p>から</p>までの間の「あああいいい」を編集して例えば「いいいううう」等にして
$mesが「あああああ<p>いいいあああ</p>いいうええええ」となるようにしたいのですが
どのようにしたら出来るでしょうか?
0570nobodyさん
05/01/04 18:27:37ID:???0571nobodyさん
05/01/04 18:47:37ID:???0572nobodyさん
05/01/04 19:20:58ID:???# <p>〜</p>までを抜き出す
$mes =~ m|^(.+)<p>(.+)</p>(.+)$|;
$before = $1;
$inside = $2;
$after = $3;
# 中身を書き換える
$inside = "いいいううう";
# つなげる
$mes = "$before<p>$inside</p>$after";
ってこと?
0573nobodyさん
05/01/04 19:27:40ID:???0574nobodyさん
05/01/04 23:16:36ID:Y/b3Mf5iUse strict;
を使って書いてるのですが、サブルーチンの中から複数の値を返したい時はどうすれば良いのでしょうか?
例えばですが、
sub a{
my $a = 1;
my $b = 2;
my $c = 3;
}
というサブルーチンがあったとして、$a, $b, $c, それぞれの値を参照したいという感じなんですが・・・・。
既に出たような質問だったらすみませんが、よろしくお願いいたします。
0575nobodyさん
05/01/04 23:21:43ID:???配列で返す
($a1,$b1,$c1) = a();
sub a {
my $a = 1;
my $b = 2;
my $c = 3;
return ($a, $b, $c);
}
既に何度も出ているような気はまあ確かにする
0576574
05/01/04 23:38:07ID:???早速レスして頂いてありがとうございます。
配列で返すとは思いつきませんでした。まだまだ知らないことだらけです(汗
教えて頂いたことを試してみます、どうもありがとうございました☆
0577574
05/01/05 00:13:08ID:???勢いでもう一つ質問してしまいますが、複数の配列を返したい場合はどうしたら良いでしょうか?(とりあえず同じように試したらダメでした)
調べてみた所、リファレンスを使って返すとあったのですが、それが最良の方法でしょうか? ↓こんな感じで・・・。
sub foo {
return \%hash, \@array;
}
いろいろ聞きまくってしまって申し訳ありませんが、よろしくお願いいたします。
0578nobodyさん
05/01/05 00:15:45ID:???13 <= $teens && $teens <= 19
という評価式はなんだか冗長なのでもっと見やすくすることはできませんか?
$teens == 13 .. 19 くらい簡単に書けてもいいような気はするのですが。
0579nobodyさん
05/01/05 01:25:20ID:???一緒くたにしたあと長さで分離する手もあるにはあるが
普通はリファレンス使うのが良いと思う
>>578
perl 6 になるとなんかその手の書き方ができるようになると聞いたが
今のところは我慢しる
0580nobodyさん
05/01/05 02:10:00ID:V9sS6I44現在9個の要素が入っている配列@arrayの0から4までの要素を
my ($a, $b, $c, $d)にいれて、コピーした要素を配列から消去
したいのですが、スマートな方法はありませんか。
my ($a, $b, $c, $d) = shift @array;感じとしてはこんな風に・・・
よろしくお願いします。
0581580
05/01/05 02:14:50ID:V9sS6I440582nobodyさん
05/01/05 02:16:38ID:???調べろ
sub a {
my %hash = ( a => 1, b => 2 );
my @array = ( "a", "b", "c" );
my $ref = [ \%hash, \@array ];
return $ref;
}
0583nobodyさん
05/01/05 02:18:17ID:elOzKoqYspliceを使えばよいかと。
こんな感じで。
splice(@array, 0, 4);
0584580
05/01/05 03:11:37ID:V9sS6I44なるほど、こんな便利な関数があったのですね。
ありがとうございました。
0585nobodyさん
05/01/05 03:37:03ID:???}
これって一つの条件式、あるはもっと簡単に出来ないでしょうか
0587nobodyさん
05/01/05 04:02:01ID:???すいませんでした。。&& thx;
0589nobodyさん
05/01/05 04:39:44ID:???0590nobodyさん
05/01/05 07:39:31ID:???# 1以下
if ($hoge - $foo <= 1) {
# 処理;
}
ただし、0.5とかも入っちゃうけど…。
0593nobodyさん
05/01/05 15:36:47ID:???>| <strong>
文章 → 文章
|< </strong>
みたいな事をしたいのですが、どうしたらよいでしょうか。
自分で考えたのは
$mes =~ s/(>\|)((\n*.*)*)(\|<)/<strong>$2<\/strong>/g;
この場合
>|あああ|< → <strong>あああ|<
>|いいい|< >|いいい</strong>
となるので
$mes =~ s/(>\|)((\n*[^(<\|)]*)*)(\|<)/<strong>$2<\/strong>/g;
としたのですが、これだと >| |< の中にlやtがあっても駄目です。
0594nobodyさん
05/01/05 18:04:47ID:???正規表現の部分にちょっと無駄な部分があるような希ガス
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
(Perl5以上で)これでいいんじゃないかな。
解説
・ >| と |< を括弧でくくる理由がわからない。
・繰り返し記号の後に ? を使ったら、最短でマッチする。
・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
0595nobodyさん
05/01/05 18:07:50ID:???ごめん、ちょっと電波が
$mes =~ s/>\|/<strong>/g;
$mes =~ s/\|</<\/strong>/g;
じゃだめなの?
0596nobodyさん
05/01/05 18:39:11ID:???>|
ちりぬるを
|<
いろはにほへと|<
とかなっていた時に困った事になるんです。
なので、「>|を発見したら、以降に|<があればそれぞれを置換し、これを最後まで繰り返す」ような事を
したい訳なのですが、いい案が思いつかないんですよね・・・。
0597nobodyさん
05/01/05 18:43:18ID:???「>|」とかっていうのは記号の例えでして、掲示板でタグを使えない代わりに
そういう記号でマークアップさせようという意図からです。・・・が正直厳しいです。
>・繰り返し記号の後に ? を使ったら、最短でマッチする。
>・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
勉強になりました!ありがとうございます。
0598nobodyさん
05/01/05 19:11:13ID:???$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
ってやってしまおう。
括弧でくくる、ってのは
(>\|)
これね。グルーピング、説明不足ですまん
0599nobodyさん
05/01/05 21:09:19ID:fN7gQymPあいうえおかきく
print "@$row[0]\n"; を実行した結果が、
あいう
えおか
きく
となる配列の要素を、
「あいう」、「えおか」、「きく」
それぞれ別の変数(もしくは配列)に入れる方法を教えてください。
print "$a, $b, $c"; を実行すると、
あいう, えおか, きく
(↑例えばこのように出力したい)
chomp、 split(/\n/, @$row[0]) では不可でした。
0600nobodyさん
05/01/05 21:40:56ID:???print "@a"; を print "@a\n";にかえただけで改行が
少なくとも2箇所増えるような@aはオレには思いつかない。
0601nobodyさん
05/01/05 22:30:59ID:DtV5vUlCDBに格納してあるutf8の文字列を取得するとき、その都度 utf8::decode($str)
としてUTF8フラグを付けているのですが、自動的にUTF8フラグが付くようにする
にはどのようにしたらよいのでしょうか?
0602593
05/01/05 23:36:16ID:???ありがとうございます。
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
にしたら動くには動いたのですが
>| <strong>
>|ああああ|<→ >|ああああ</strong>
|< |<
となってしまいました・・・結果を見れば多少納得しつつも改善策が思いつかないです・・・。
Wiki的記法スクリプト作ってる人って凄い・・・orz
0603nobodyさん
05/01/05 23:40:02ID:???$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
を2行連続して書く事で602の現象は回避できました・・・が、
これだと激しく手順がおかしい・・・(;´Д`)
0604nobodyさん
05/01/05 23:40:55ID:???文章の整形や修飾に関しては全然難しい事やってないよ。
0605nobodyさん
05/01/05 23:49:42ID:???その質問の真意はよくわからんけど、
馬鹿正直に答えるとまずprint関数の定義をいじらんとダメかな。
perlはめちゃくちゃな言語なんでいじる手段は複数あるよ。
でも、きっと君が望む回答じゃないと思う。
まず本当に自分がやりたい事を整理しなされ
0606nobodyさん
05/01/05 23:59:20ID:???そうなんですか。
実は読んだのですが、2日前にPerl始めたばっかりなんで結構チンプンカンプンでした・・・。
精進します。
0607nobodyさん
05/01/06 03:24:55ID:???0608nobodyさん
05/01/06 06:40:28ID:???括弧の種類が一つならば、ネストは考えなくてもいい。
my ($open, $close);
$data =~ s/(>\|)|(\|<)/$1 ? ($open++, "<strong>") : ($close++, "<\/strong>")/ge;
($open > $close) and die "開き括弧が多すぎます";
($open < $close) and die "閉じ括弧が多すぎます";
0609608
05/01/06 12:23:08ID:???my ($open, $close);
$data =~ s/(>\|)|(\|<)/
$1 ? ($open++, "<strong>") :
(($open <= $close and die "対応する開き括弧が見つかりません"),
$close++, "<\/strong>")/ge;
($open > $close) and die "対応する閉じ括弧が見つかりません";
0610ty8it
05/01/06 12:31:38ID:???0612nobodyさん
05/01/06 12:49:00ID:???|<あああ>| →</strong>あああ<strong>
|>| →</strong>strong>
この辺りを許容するかどうかだけどね。
許容するなら、>>595のでもいいし。
0613599
05/01/06 13:53:22ID:???回答ありがとうございました。解決しました。
print文がLoopされていて
@$row[0] がそのつど書き換わっていただけでした。
素人甚だしく申し訳ございませなんだ
0614nobodyさん
05/01/06 17:38:48ID:???許容でいいんじゃないの?
>609みたいに親切にエラー表示しなくてもいいような気がする・・・
意図する表現にならなかったらユーザーが文法間違えたってことだから、
入力したユーザーが修正で再度入力すればいいだけじゃないの?
掲示板で使うってことだから、書き込む前に変換後のプレビュー画面でも見せて
そこで修正するかそのまま書き込むかユーザーに選ばせればいいと思う。
0615nobodyさん
05/01/06 20:45:08ID:???XMLをハッシュに変換したいのですけどどうしたらよいでしょうか
0616nobodyさん
05/01/06 21:25:44ID:VJDwnbh+思っても上手く行きません・・。何が原因なのでしょうか?
sub a{
my $input = <STDIN>;
if($input eq "a"){print "a\n";}
}
こんな感じのソースで、入力時に「a」と入力してもその後の文字列比較が上手く
いかないようで、printが行われません。何でなのでしょうか?
初歩的な質問ですいません。
0617nobodyさん
05/01/06 21:35:38ID:???chomp $input;
if($input eq ...
0618nobodyさん
05/01/06 22:40:43ID:???なんか久々に見る大胆な質問だな
DOMツリーを作るなら XML::DOM とかあるが、どういう形のハッシュで出力させたいんだ?
0621nobodyさん
05/01/07 09:45:47ID:???このケースに限らないが、困った時はまず変数の中身を確認しろ。
use Data::Dumper;
print Dumper($scalar);
print Dumper(\%hash);
print Dumper(\@array);
0622nobodyさん
05/01/07 11:48:48ID:???別のサブルーチンで扱うにはどうしたら良いのでしょうか?
リファレンスを渡すだけだと、
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY ref while 〜
と怒られてしまうのですが・・・・。
よろしくお願いいたします。
0623nobodyさん
05/01/07 11:55:12ID:???リファレンスを返すだけで普通は扱える。つか俺は使えている。
たぶん君の書いたコードが間違っているのだろう。
動かないコードと、何を読んでその書き方を憶えたか、を晒すと、
後学のためになると思う。
0624622
05/01/07 12:20:19ID:tb1n+4Nwそうなのですか、まだ苦戦してます。やろうとしてるのは次みたいな感じです。
sub a {
open FH, '<', "$_[0]";
my @data;
while(<FH>){
push(@data, [ split(/;/) ]);
}
close(FH);
return \@data;
}
で生成した多次元配列@dataを別サブルーチンで扱いたいです。
my $ref = &a();
でリファレンスを受け取って、別のサブルーチンに引数として渡したのですが、
上手くいきません。
例えば、
sub b{
my $abc = $_;
foreach my $dummy (@{$$data[2]}){
print "$dummy";
}
}
とすると前述のエラーが出て怒られてしまいます。
何故なのでしょうか?
最初の質問が説明不足でしたが、よろしくお願いいたします。
0626nobodyさん
05/01/07 13:53:30ID:???sub b{
× my $abc = $_;
○ my $abc = $_[0];
○ my $abc = shift;
0628624
05/01/07 14:30:35ID:tb1n+4Nwレスありがとうございます。
$abc = $_[0];
で受け取って、$abc でデリファレンスしてみましたが、同じ様に
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY 〜 と出てしまいました。
$abc を表示したところ、ARRAY(0x810e7f0) と表示されたので、引数の受渡し自体
は上手くいっていると思いますが、そこからのデリファレンスがどうしても出来ません。
@{$abc}
@{$$abc}
とか、いずれも前述のエラーの対象となるようです・・・。
ここらへんざんまり良く分からないのですが、教えて頂けないでしょうか?
たびたびすみません
0630624
05/01/07 14:51:20ID:tb1n+4Nwsub b{
$abc = $_[0];
print "$abc\n"; #ARRAY(0x810e8c4) を出力
print "@$abc\n"; #Can't use string〜
print "@{$$abc[1]}\n"; #Can't use string〜
}
でした・・・・。
何故なのでしょうか?
サブルーチンの外で print "@$abc\n"; を実行すると
ARRAY(0x8118f74) ARRAY(0x8118fb0) ARRAY(0x8118ff8) ・・・・・
と表示されます。
構文がおかしいのでしょうか?
0631nobodyさん
05/01/07 15:08:26ID:???○b($ref)
0633624
05/01/07 15:19:31ID:???問題解決しました!
引数として指定するときに""で囲ってました、リファレンスを渡す場合はいらないのですね。
気づいてみると単純なものでしたけど、ハマってました。
どうもありがとうございました!
>>632
use strict;
してました。もし同じことをするのにuse strict;を外すと、これまたエラーになってしまうのでしょうか?
0634nobodyさん
05/01/07 19:09:58ID:???0635nobodyさん
05/01/07 19:29:23ID:???これなんですけど、名前の部分とフォームの部分を一緒のformにいれることはできませんか?
1 スーパーひとし : テスト3 01/07’18:54
例えばこういう感じに。。
あと日付の表示のところに「'」が入ってしまいます。どうすればいいでしょうか。
0636nobodyさん
05/01/07 19:30:21ID:???0639nobodyさん
05/01/07 22:09:18ID:???例えば
「今日は(・∀・)な日だった」
という文があったとして、この文から日本語だけを削除して
「(・∀・)」
このような文にしたいのですが、どのようにプログラミングすればいいでしょうか?
0640nobodyさん
05/01/07 22:54:19ID:???$data =~ s/.*(\Q(・∀・)\E).*/$1/s;
0641nobodyさん
05/01/07 22:57:48ID:???$hoge=~s/今日は//og;
$hoge=~s/な一日だった//og;
は間違いです
0642nobodyさん
05/01/07 23:27:50ID:GrSDiTmV本によって、PF_INETと書いてあったりAF_INETと書いてあったりします。
よろしくお願いいたします。
0644nobodyさん
NGNG記号を残すということかな?
Shift-JISでひらがなを削除するにはこんな感じ。
$data = '今日は(・∀・)な日だった';
$data =~ s/\x82[\x9F-\xF1]//g;
あとは>>5のPerlメモから「日本語を扱う」とか、正規表現について調べたらいい。
0647639
05/01/08 00:01:23ID:oXOik1WL>>641
>>644
みなさんご丁寧な回答、本当にありがとうございます。
ひらがな、漢字、カタカナ、英語の文字を削除したかったのです。
644さんの通りやったら、ひらがなを削除することができました。
ASCIIコードで範囲を指定してやればいいのですね。
次は漢字、カタカナを頑張って調べてみます。
0648nobodyさん
05/01/08 00:19:58ID:???条件下で、サブルーチンの中で宣言したローカル変数は、返り値として外部に渡したらグローバル変数になるのでしょうか?
0649nobodyさん
05/01/08 01:04:43ID:???0650nobodyさん
05/01/08 02:39:34ID:???返り値は値であって変数ではない。その辺の概念を
勉強しなおすことをおすすめする。
my $r = 1;
return $r;
は、$rという変数を返すのではなくて$rという式
の値(=1)を返す訳だ。
0651nobodyさん
05/01/08 03:06:03ID:???sub a{
my @array = (1, 2, 3);
return \@array;
}
$a = &a();
で返り値受け取ったとすると、リファレンス使って@arrayの値を参照したり、
配列をしたり出来る訳だけど、となるとmyで宣言したローカル変数はいずこへ・・・と思ったりした。
これって、シンボリックリファレンスの@arrayは消滅するけど、そこで確保された値は残っていて、
ハードウェアリファレンスを用いることで@arrayを参照できる・・・・ってことでいいのかな?
(一度確保した値はメモリ上にいつまで残っているのだろうか?)
適当に覚えた知識ゆえ間違ってたらすまん。
玄人の方訂正やつっこみよろしく頼みます。
0652nobodyさん
05/01/08 03:14:24ID:???0653nobodyさん
05/01/08 07:34:20ID:???実体は参照カウンタ型ガーベッジコレクション付きのメモリに確保される。
実体は参照されている数がカウントされていて、カウントが0に(誰も参照していなく)なると破棄される。
変数がサブルーチンから抜けるなどでスコープから外れると、
変数の名前が破棄されて、参照カウント値が一つ減らされる。
しかし、リファレンスによって参照されている限りカウントは0にならないから実体は破棄されない。
(ここでのリファレンスはシンボリックではない、ハードリファレンスのこと)
C,C++の(一般的な実装の)ローカル変数のようにスタック上にメモリを確保する訳じゃないから、
こんな芸当ができる。
0654nobodyさん
05/01/08 07:35:17ID:???誰かに注目されている限り神様が生かしてくれます。
友達のお婆ちゃんはこれが原因で亡くなりました。
0655nobodyさん
05/01/08 09:37:13ID:???この辺は「初めてのPerl」読めばすっきりすると思う。
クロージャとかも混乱しやすいね。
0656nobodyさん
05/01/08 13:05:23ID:???split(/\s/);を使ってスペースで区切ると"と"の間のスペースでも、区切られてしまいます。。。
,で区切る場合は、realmで,が現れるとそこでくぎられてしまいます。
また、スペースがない場合はrealmは"と"で区切られないこともあるかもです。
誰か助けてください。。。
パターン
Basic realm="Secret Zone"
Digest realm="Secret Zone", nonce="RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de",
algorithm=MD5, qop="auth"
取り出したい値
$type = Basic 又は Digest;
$realm = Secret Zone;
以下$type=Digestの場合のみ。BasicのときはNull。
$nonce = RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de;
$algorithm=MD5;
$qop=auth;
0657nobodyさん
05/01/08 13:25:08ID:???言ってることがよく分からん
0658nobodyさん
05/01/08 14:09:43ID:???ファイルの中身が「abcCLEてすと」である文章をopenして、
$text = "abcCLEてすと"
とし、これから「abc」を削除しようと思って
$text =~ s/a|b|c//g;
print "結果:$text\n";
として、結果を表示すると
「結果:bkEてすと」
と表示されます。
abcは削除されているようですが、他の文字が文字化けしています。
文字化けさせない為には、どうすればいいでしょうか?
0659656
05/01/08 14:21:24ID:???ttp://www.studyinghttp.net/rfc_ja/rfc2617.ja#sec3.2.1
2種類のWeb認証ヘッダを取得して変数に代入したいということです。
ヘッダから取り出したいのは、
Basic又はDigestなどの第一要素。
認証名を収納しているrealm。
Digestで必要なnonceとalgorithmとqop。
以上の5つです。
0660nobodyさん
05/01/08 16:41:21ID:???だからよ、そのパターンってのが何に入っているんだ?
配列か?変数か?ハッシュか?
splitとか言ってるってことはもう格納してあるんだろ?
0662656
05/01/08 18:35:50ID:???splitでやって失敗したので困ってます
,で区切った場合、""で囲まれたところで,が出てきたら大変なことに・・・
>>661
正規表現はちょっと苦手なので、なるべく避けたいと思ってたり・・・
それに、それがすべてではなく、順番なども異なっている鯖もあるかもです
0665nobodyさん
05/01/08 19:56:37ID:???$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
結果:CLEてすと
化けないよ。
0668nobodyさん
05/01/08 20:58:27ID:???0669nobodyさん
05/01/08 22:26:26ID:???という話か?
それなら「それはきみがわるい」でまとめちゃうぞ
0670nobodyさん
05/01/09 01:39:48ID:???画像を文字に変換するというスクリプト(バイナリデータを16進ダンプし、
それをスクリプトに埋め込んで復号)を試してます。
上記のサイトの変換、復号cgiをレンタル鯖(Linux+Apache1.3+Perl 5.008003)に
設置してやると正常に動くのですが、ローカル(Win2k+Apache2+Perl 5.008004)
だと画像が壊れてビットマップがぐちゃぐちゃになってしまいます。
$data = pack('C*',hex($_));
ここらへんに原因があるとしか思えないのですが、、、
Windows+Perlでファイル出力の場合ならbinmodeにしたりするところですが、
こういう場合はどうしたらいいでしょうか。
0671nobodyさん
05/01/09 05:52:13ID:???1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0672nobodyさん
05/01/09 07:33:40ID:???0673nobodyさん
05/01/09 07:49:51ID:???全体像が見えないので勘で答えてみた。
0676nobodyさん
05/01/09 08:24:21ID:???0677nobodyさん
05/01/09 12:43:15ID:???0678nobodyさん
05/01/09 13:11:09ID:???> 2種類のWeb認証ヘッダを取得して変数に代入したいということです。
ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
0679670
05/01/09 14:17:11ID:???レスありがとうございます。わかりにくくてすみませんでした。
1: 16進ダンプされた数値を画像に変換したい。
2: ttp://www.rescue.ne.jp/study/pack/ 変換 復号cgiをそのまま実行。
レンタルサーバーでは全く問題がなかった。
3: 自宅サーバーで画像が化けた。
binmode(STDIN);入れてもダメでした。
ttp://para-site.net/up/data/1032.zip
↑正常な画像,壊れた画像,使用したソースです。
0680670
05/01/09 14:32:59ID:???やはりbinmode(STDOUT);でした。
IEのキャッシュを消してリロードしたら表示されました。(^-^;)
0681nobodyさん
05/01/09 14:35:38ID:???自力解決乙。
ちなみにその二つの画像ファイルをバイナリエディタで見比べてみると
0xBC の 0A F6 F4 の部分が壊れた画像では 0D 0A F6 F4 となっている。
これくらい自力で調べられるようにしておくといいかも。
0682nobodyさん
05/01/09 15:13:59ID:???Perlバージョンが分からないから、とりあえず。
use encoding "shiftjis";
$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
0683659
05/01/11 22:55:58ID:???> ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
サーバーからの要求のほうです。
> このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
もちろん知っています。モジュールを使えば取得できることも知っています。
今回は、CGIにブラウザから渡って来るのではなく、Socketで取得してますのでこの点は関係ありません。
0684nobodyさん
05/01/12 00:36:54ID:???どうやるとスマートに出来ますか?
一応自分で考えてみたのは
my @number = ();
my $dummy_count = 0;
foreach my $dummy (@array){
my $dummy2_count = 0;
foreach my $dummy2 (@array){
if($dummmy1_count != $dummy2_count){
if($dummy1 eq $dummy2){
ここでさらに$dummy1_count と$dummy2_count が@numberにあるかどうか
をみて、ない場合にそれぞれ追加
}
}
$dummy2_count++;
}
$dummy1_count++;
}
ってな感じの初心者丸出しコードなんですが(汗 見難いですね・・・。
結果としては上手く出来たのですが、もっと良いコードの書き方があるかと。。。
いかがなもんでしょうか?
0685684
05/01/12 00:38:26ID:???半角スペース使ったせいで死。。すいません
0686nobodyさん
05/01/12 00:44:21ID:???0687nobodyさん
05/01/12 01:23:28ID:???my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;
my %count;
@_list = grep $count{$list[$_]}++, 0 .. $#list;
print @_list;
0688nobodyさん
05/01/12 01:33:22ID:???それだと5しかでないけど、欲しい結果は1,5なんじゃない?
私ならこうする。
my %count;
foreach (0..$#array) {
push @{$count{$array[$_]}}, $_;
}
my @number = map @$_, grep @$_ >= 2, values %count;
0689nobodyさん
05/01/12 02:00:22ID:???連想配列の要素の数はどうやってもとめればいいんですか?
0691nobodyさん
05/01/12 02:04:54ID:???そうだったんか。俺ならこう。
my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;
my %count;
$count{$_}++ for @list;
my @_list = grep $count{$list[$_]} >= 2, 0 .. $#list;
print @_list;
0692684
05/01/12 02:23:19ID:???レス有難うございます。
>>688さんの仰るように、例でいくと1, 5が欲しかったです。
それで、今>>688さんのコードを試して見たのですが・・・・・。
あっさりすぎるほどに求めていた答えがでました。私が書いた50行がたったのコレだけで
出来てしまうんですね(汗 悲しい部分もありますが、すごく感動ですね。
本当にありがとうございますm(_ _)m
ですが・・・・コードがまだ理解出来ないのがイタイです(笑
もし>>688さんに少しお時間ありましたら、ほんとにさわりだけでもいいのでコード解説とか
お願いできませんか? 解説頂いても理解出来ないかもしれませんが、人のコード使っておいて
まったく何やってるか分からないってのも困りますし、自分のためにならないぽいので。。。。
こちらはお聞きすることしか出来ませんが、もし余裕があればお願いします。
>>677さんのコードも試してみました。
こちらも重複する項目の番号が返ってきました。
こちらの説明が足らなかったので申し訳なかったです。けどパッと書けてしまうみなさんは
すごいですね。私もまだまだ頑張らないと。
>>687さん >>688さん、本当にありがとうございました
0693nobodyさん
05/01/12 09:12:09ID:SoBMVf5u携帯はキャリアごとに画像形式などが違うので完全にCGIで作っています。
PCサイトは既に作ってあり運営中なので、簡単だろうなと思ってとりあえず
見た目はある程度できました。
が、携帯はcookieが使えないとこのことorz
PCサイトではcookieに注文内容を詰め込んでいたので、ちょっと困っています。
今はURIの?以降にページIDを使ってページの移動をしてます。
今考えているのは
http://www.2ch.net/?page=index&商品番号=数量&商品番号2=数量2
等の形式で常にリンクURLの後ろに注文内容を保持していく方法です。
getの制限である255byteはそうそう超えないんで大丈夫だと思いますが・・・・
?page=index&ユニークID のようにIDを発行して注文内容はサーバ側で
管理してIDマッチングでセッションするならばバイト数なんて気になりませんが、
現状の私のスキルでは少し時間がかかりそうです^^;
もっと賢いやり方があるなら教えてくださいm(_ _)m
0694nobodyさん
05/01/12 10:00:34ID:???相手のIPで照合するとセキュリティ的にも最高品質ですよ。
なのでサーバー側にファイルを作るか、MySQLでやるかだけですね。
0696nobodyさん
05/01/12 10:52:46ID:190vuMua>http://www.2ch.net/?page=index&商品番号=数量&商品番号2=数量2
>等の形式で常にリンクURLの後ろに注文内容を保持していく方法です。
>getの制限である255byteはそうそう超えないんで大丈夫だと思いますが・・・・
どう考えても、やめた方がいいだろう。
おれは、携帯の場合、ファイルベースの簡易的なセッションを自作して使ってるけどね。
>PCサイトではcookieに注文内容を詰め込んでいたので
さらにこれも危険。
>694
携帯ってリクエスト毎にIP変わらなかったっけ?
0698nobodyさん
05/01/12 11:37:34ID:???ttp://www.rfs.jp/sitebuilder/perl/02/05.html
配列やハッシュの要素数てのは、その配列やらハッシュやらを扱う上でも基本的な
ことだから、テキストとかにも各分野の最初の方に載ってるのではないかな?
調べ方がちと足りないかも。適当にググれば出てくるヨ☆
偉そうなこと書いてしまったが、こちらも初心者故、共に頑張ろうではありませんか。
0699693
05/01/12 11:53:12ID:SoBMVf5u>どう考えても、やめた方がいいだろう。
え;どうしてでしょうか?
漏れるからですか?アクセショップなので注文内容は漏れていいですが・・・
っていうか注文内容が漏れてまずかったらお店で買物なんてできませんよね。
もしかして住所などの個人情報を懸念してるのですか?
それでしたらSSL+POSTでやっていますが。
もう少し自分で調べてみますm(_ _)m
0700nobodyさん
05/01/12 12:06:48ID:???d,e,f
g,h,i
↑のようなテキストファイルがあります。実際は数百行です。これから以下のような配列を作りたいです。
@1行目の配列※名前はaとする2行目からはb,c,d,eとする
$a[0] .. a
$a[1] .. b
$a[2] .. c
$b[0] .. d
のように。
これをループ処理でやりたいんですが、数百の配列に名前を動的に与える方法で悩んでます。
open FH,"text.txt";
@array = /a b c d e f g h i j k ........数百まで/;
$i = 0;
while (<FH>){@$array[$i]??? = split /,/;}
なんかおかしなことに。
0701nobodyさん
05/01/12 12:08:44ID:???0702nobodyさん
05/01/12 12:21:20ID:???せっかく問題を提起したのだから、解決コードも書いて置くと後学の為になるし、
コードに改善点があれば誰かが指摘してくれるよ。
0703693
05/01/12 14:07:08ID:SoBMVf5uURLに注文内容を圧縮して持たせる場合常にURl自体に注文内容が含まれてるので
購入中にトップページにブックマークした場合、いつ来てもブクマしたときの
注文内容が残ってしまいますね・・・
しかしURLにセッションIDを持たせたとしても同じことがおきますよね。
もちろんサーバ側のファイルを最終アクセスから2時間たったものは消していけば
いいですけど、古いセッションID付でブクマされると何か嫌ですよね。
みなさんはどうやって古いID付でブクマークされるのを防いでるのですか?
0704nobodyさん
05/01/12 14:49:15ID:???スレ違い
△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
0706nobodyさん
05/01/12 19:39:08ID:iuHcyFLg持っているPerlの本のURLエンコードについての説明のところには、
「-」「@」「*」「.」「_」はエンコードされないと書いてあって、
エンコードのサブルーチンは
sub UrlEncode {
local($str) = @_;
$str =~ s/([^ 0-9a-zA-Z\-@\*\._])/sprintf("%%%02X", ord($1))/eg;
$str =~ s/ /+/g;
return $str;
}
…と書いてあります。
ところが別のページや他サイトでは、上のコードの3行目のところが
$str = ~s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
となっているようです。
どちらのコードにすればいいんでしょうか?
後者の方では、\W=[^_0-9a-zA-Z]だから記号もエンコードしてしまうのではと
思うんですが…。
よく分かってなくてすいません。よろしくお願いします。
0707nobodyさん
05/01/12 20:12:34ID:???最初にアクセスしたtimeでも引っ張って一時保存ファイルでも作れば?
そっちに注文内容とか入れ込んで、一時保存ファイルの作成時間が一時間以上前のものなら消すとか
>696
>携帯ってリクエスト毎にIP変わらなかったっけ?
DoCoMoは変わる、auは変わらない、Vodaはシラネ
0709nobodyさん
05/01/12 20:28:34ID:???reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
これはエスケープする。
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
これはエスケープしなくてもいい。しても構わない。
http://www.ietf.org/rfc/rfc2396.txt
0711だめだめ君
05/01/13 02:40:25ID:???日本語文字コードらへんで何か変わった問題とかあるんでしょうか・・・。どう対処すればいいのか分かりません…
宜しくお願いします。
0712nobodyさん
05/01/13 06:44:36ID:???DBへ格納している文字の文字コードは?
そのプログラムソースの文字コードは?
恐らく、その両者の文字コードが一致していないと思います。
0713693
05/01/13 09:14:06ID:mOXqnzCMスレ違いなのですか?
Perl特有の解決方法などがあると思いましたが、全言語共通なんですか?
とりあえず誘導ありがとうございますm(_ _)m
>>705
postでやるのは考えましたが、テキストリンクぽく見せるのが不可能ですよね。
ボタンやセレクトボックスになってしまうと違和感があるので・・・
0714nobodyさん
05/01/13 09:41:39ID:???よってスレ違い。
0715nobodyさん
05/01/13 09:44:55ID:???0716だめだめ君
05/01/13 12:18:38ID:???ありがとうございます。表示以外は全部EUCです。
ただ、文字コードの違いだったらもっと激しく全部文字化けすると思うんですが、一部の文字なんです。
他の件でPHP使ってるときにも¥が入るとかそういうのがバックスラッシュのエスケープとかであったので、
それと似たものなのかなぁと色々検索したんですが、、、、それっぽいのも見つからず…。
どうしたもんでしょうか…
0719nobodyさん
05/01/13 14:25:30ID:F0U77FE9でcp932からutf8へ変換を行っているのですが、そのあと、
文字化けを起こしている(マッピングに失敗した)文字を?とか★とかに変換
したいのですが、どのように行えばいいのでしょうか?
ごくごくまれに外字と思われるものがあるのです。
一旦dbに入れてcsvとかで出す時にそのたった1文字のためにそれ以降全部バケちゃうことがあるのです(泣)
0720nobodyさん
05/01/13 15:45:13ID:???メソッドが返す値はただの数字です。
0721nobodyさん
05/01/13 15:55:36ID:???0722nobodyさん
05/01/13 15:57:40ID:???0723nobodyさん
05/01/13 15:58:29ID:???0724nobodyさん
05/01/13 15:59:37ID:???2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0725nobodyさん
05/01/13 16:05:37ID:???コマンドプロンプトからPerl -cでぷろぐらむのチェックをしたら
syntax okが出るにも関わらずlocalhostからブラウザでやってみると
500エラーが出るのは何故でしょうか?
こういうときはどうやってデバッグすればいんでしょうか?
何が悪いのか検討がつかずに困っています。
0728725
05/01/13 16:16:56ID:???cgi::sessionのコンスラクタ呼び出しの際に3つ目の引数にカーリーブレス?を付けておくのを
忘れてました。
しかし今回は運良く早期発見できましたが、こういうときにいいデバッグ方法あrましたら
教えてください。
0729nobodyさん
05/01/13 16:19:39ID:???0732nobodyさん
05/01/13 20:18:35ID:???http://pc5.2ch.net/test/read.cgi/php/1104624784/2
0733nobodyさん
05/01/13 20:24:29ID:???Shift_JISなら分からなくも無いけど…。
Shift_JISの「ミ」も\xD0。
# またはDBの最新バージョンで人柱状態?
>>719
0xF040から0xF9FCの外字なら、予めチェックするしかないかも。
>>731
?
0734nobodyさん
05/01/13 21:16:56ID:???うまくいきません
sub search1 {
local($dir) = $_[0];
local(@filelist, $file, $filename);
opendir(DIR, $dir);
@filelist = readdir(DIR);
closedir(DIR);
$begin = $FORM{'page'} * $hyouji;
$end = $bigin + $hyouji;
if($end > @filelist) {
$end = @filelist;
}
(続く)
0735734
05/01/13 21:17:55ID:???#foreach $file (@filelist) {
for ($a = $bigin; $a < $end; ++$a) {
if ($file eq ".") { next; }
if ($file eq "..") { next; }
$filename = "$dir/$file";
if (-d $filename) {
if ($recursive_flag) {
&search1($filename);
}
} else {
&search2($filename, $dir);
}
}
if ($end < @filelist) {
$nextpage = $FORM{'page'} + 1;
print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$nextpage\">次へ</a>\n";
}
#}
}
0736734
05/01/13 21:19:50ID:???動作も正常に動いてはいないようです
どなたか知恵を貸してください
よろしくお願いします
0737nobodyさん
05/01/13 21:27:49ID:RpTwbNys$begin
$bigin
use strict
を使う癖をつけましょう。
0738734
05/01/13 21:57:15ID:???ご指摘ありがとうございます
うっかりミスです
しかし直しても動作は変わりありません
構文自体が悪いのでしょうか?
頭がテンパってきました
助けてください…
0739nobodyさん
05/01/13 22:01:32ID:RpTwbNysもうちっと、ソースを整理して晒しておくれ。
search2というのが何なのかも分からないし・・・。
0740734
05/01/13 22:21:11ID:???すみません、インデントつけます
sub search1 {
local($dir) = $_[0];
local(@filelist, $file, $filename);
opendir(DIR, $dir);
@filelist = readdir(DIR);
closedir(DIR);
$begin = $FORM{'page'} * $hyouji;
$end = $bigin + $hyouji;
if($end > @filelist) {
$end = @filelist;
}
(続く)
0741734
05/01/13 22:23:11ID:???for ($a = $bigin; $a < $end; ++$a) {
if ($file eq ".") { next; }
if ($file eq "..") { next; }
$filename = "$dir/$file";
if (-d $filename) {
if ($recursive_flag) {
&search1($filename);
}
} else {
&search2($filename, $dir);
}
}
if ($end < @filelist) {
$nextpage = $FORM{'page'} + 1;
print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$nextpage\">次へ</a>\n";
}
# }
}
0742734
05/01/13 22:29:34ID:???#foreachは最初からあったやつで、コメントアウトしています
&search2はソース長いので説明すると
ループさせてファイルの中身を一文字ずつ検索させてるようです
>740の
$begin = $FORM{'page'} * $hyouji;
$end = $bigin + $hyouji;
if($end > @filelist) {
$end = @filelist;
}
この部分と
>741の
if ($end < @filelist) {
$nextpage = $FORM{'page'} + 1;
print "<a href=\"$ENV{'SCRIPT_NAME'}?page=$nextpage\">次へ</a>\n";
}
が自分で付け足した所です
0743nobodyさん
05/01/14 01:17:04ID:???別スレでやってくれ。
★三 【 スクリプト改造工房 PART 8 】 ★三
http://pc5.2ch.net/test/read.cgi/php/1077525387/ 79にテンプレあり
0744nobodyさん
05/01/14 07:32:45ID:3YybYM3/とやると$hogeは455になるのに、
$hoge=int(1.4*325);
とやると$hogeは454になってしまいます。
他の数字でも起こるようです。何故ですか?
というか、意図した通りにさせる方法はありますでしょうか。
0745720
05/01/14 08:13:20ID:???ありがとうございます。
全然誰も答えないからこのスレ、レベルが下がったのかとおもいました;
数スレ前では自分で誰かに回答してあげた覚えもあるんですが、最近の過去ログは
普通の人は見れないようで。
>>all
お前らもっと精進しろよ、な。
0746nobodyさん
05/01/14 09:27:13ID:AgX5dpSc異なる意味をもつ字を*で連結した上の文字列の中から1字を消して連結用のアスタリスクの数も
正常にする。
ということがしたい場合どういうみんなコーディングする?aとdでは処理が変わるんだよね。
しかしそれをなるべく簡潔にしたい。
0747nobodyさん
05/01/14 09:31:58ID:???慣れていないと面食らうがほとんどのプログラミング言語ではそれが標準仕様。
詳しい説明は「浮動小数点数」「精度」などで検索すれ。
防ぐ方法は幾つかある。まぁこのケースなら1が無難かな。
1. 整数同士の演算にする: 1.4*10*325 (1.4*325*10ではうまくいかないことに注意)
2. sprintfで処理する:sprintf '%f', 1.4*325
3. bignumプラグマ: use bignum;print int(1.4*325) (ただし破滅的なほど遅い)
0749nobodyさん
05/01/14 09:35:33ID:az2EqpkZこの2つの変数内の文字列を比較していって、先頭から同じ文字が続くところまで$hoge2から削除するにはどうすればいいでしょうか。
たとえば、$hoge1=a/b/c/d/,$hoge2=a/b/c/d/e/f/だったら、$hoge2=e/f/としたいのです。
0750746
05/01/14 09:37:35ID:AgX5dpSc$a =~ s/a[*]?//;
$a =~ s/[*]*$//;
0751nobodyさん
05/01/14 10:31:14ID:????
0752nobodyさん
05/01/14 10:56:17ID:???$a .= '*';
$a =~ s/a\*//;
chop $a;
$aを使うのはお勧めできないがそれは置いておこう。
0753749
05/01/14 10:58:23ID:az2EqpkZ例が適切でなかったかも知れません
$hoge1='a/b/c/d/e/f'
$hoge2='a/b/c/d/g/h/'
だったら、
$hoge2='g/h'
にしたいのです
0754nobodyさん
05/01/14 11:42:26ID:LszGQepz「Win32::OLE」は使えないのでしょうか?
もし使えないなら、代わりになるものはありますか?
0755nobodyさん
05/01/14 11:48:36ID:???my $re = '';
foreach (reverse split //, $hoge1) {
my $q = quotemeta($_);
$re = "(?:$q$re)?";
}
$hoge2 =~ s/^$re//;
0756nobodyさん
05/01/14 12:35:06ID:???sub hoge {
my $max = length $_[0];
my $pos = 0;
$pos++ while substr($_[0], $pos, 1) eq substr($_[1], $pos, 1) && $pos < $max;
# 「$hoge2='g/h'」は typo か?
substr $_[0], $pos, length substr +($_[2] ? $_[1] : $_[0]), $pos;
}
print hoge($hoge2, $hoge1), hoge($hoge2, $hoge1, 1); # g/h/g/h
0757734
05/01/14 12:52:14ID:???誘導ありがとうございます
逝ってきます
0758nobodyさん
05/01/14 15:29:10ID:AgX5dpSc現在注文管理部分の注文してくれた客に出す「確認メール」というものを作成するための
メールフォームを作っています。
docomoでは500byteまでという制限があります。
500byteなんてあっというまなので対策を考えてます。
一つ考えたのは500byteを超える場合は2通に分割するという方法です。
しかしマルチバイト文字の途中で分割すると2通目以降が悲惨なことになるので
どうにかしてそれをクリアにしたいです。
「確認メール」の内容はその時によって違うので、先に分割地点を決めるのは無理です。
メールフォームを使うのは500byteの意味を知らないパートさんで、入れ替わりなので
扱う人間に期待をするのは難しいです。
メールフォームでつくられた本文を受け取り送信する側のCGIで何とかしたいです。
日本語を綺麗に途中で分割することってできますか?簡単にできるモジュールなどありましたら
教えてください。
0760758
05/01/14 15:49:19ID:AgX5dpScここを参考にとりあえず配列に文字単位で格納して、
それから@text[0..500]などでやってみようと思います。
ただメチャクチャ重くなるような気がしてるのですが^^;
でも何かアドバイスありましたらお願いします。
0762758
05/01/14 16:20:31ID:AgX5dpScJcodeですか。調べてみます。
ところで
$a = 100/3;
のように$aに小数点が含まれる場合は切り上げをしたいんですがどうすればできますか?
切捨てはintで一発ですが、切り上げは一度小数点があるかないかを調べないとダメです如根。
0764nobodyさん
05/01/14 16:30:38ID:???0767758
05/01/14 16:59:43ID:AgX5dpSc感謝ですm(_ _)m
0768nobodyさん
05/01/14 19:11:08ID:???perlメモ風の切り上げ処理は
$tmp2 = int($tmp1) + ($tmp1 <=> int($tmp1));
かな。
>>747
ありがとうございました。整数でやってみます。
0769nobodyさん
05/01/15 13:17:48ID:X2SjZomE何通もメール送られたらユーザーも迷惑でしょ。
0770nobodyさん
05/01/15 14:59:51ID:2P0rPuHEformtest.htmっていうページからformtest.cgiにデータを送信しようと
おもったんですが。formtest.htmには入力フォームが2つあってそれぞ
れdataAとdataBです。dataAはaaaとdataBにはbbbと。それをpostで送信
しました。formtest.cgiには
#!/usr/local/bin/perl
read(STDIN,$buffer,$ENV{'QUERY_STRING'});
print"Content-type: text/html\n\n";
print"<HTML><BODY>\n";
print"$buffer";
print"</BODY></HTML>\n";
とあります。画面にはdataA=aaa&dataB=bbbと表示されるはずなんですが
でません。ちなみにgetとpostの両方で送信してみましたが、出来ません、
でも他に文字を表示させるだけのCGIがあるんですが、それはは動き
ます。
0771nobodyさん
05/01/15 15:11:38ID:???根本的に間違い。
http://www.rfs.jp/sitebuilder/perl/03/02.html
ずっと下にある「GET/POST データを読み込む」でも読みたまえ。
0772nobodyさん
05/01/16 10:58:07ID:LfCWlcLWすぐ2000行とかになっちゃうんですが、普通ですか?
長くなりすぎてちょっとした内容修正の時にも該当箇所までスクロールするのが面倒
だったりします。
みなさんはどうやっておられるのでしょうか?
HTML部分を別ファイルにしてメインプログラムから読み込むだけのような
形式にしてるのでしょうか?
0773nobodyさん
05/01/16 11:01:18ID:???0774nobodyさん
05/01/16 11:05:45ID:???・コードの行数は処理次第。各ページ2000越えるのはありえない。全体で2000行のCGIでショップ運営もありえない
・めんどくさがりすぎ。行ジャンプかインク李メンタルサーチで移動
・HTMLは当然別
0775nobodyさん
05/01/16 11:13:24ID:???ページベースの設計してるPerlCgiは今はそんなにないよ。
0776nobodyさん
05/01/16 12:01:04ID:???思ってる時点でなんかヤバイ気がするんだが
気のせい?
もちろん大量の商品があるのでみつけやすいよう
に検索や分類の機能を作りこむとかで規模増える
ことはあるだろうけれども、そういう意味で言っ
てるようには見えない。
0777nobodyさん
05/01/16 12:06:48ID:???0778772
05/01/16 12:13:57ID:LfCWlcLW多分みなさんレベルから見たらかなりマヌケなコーディングだと思います;
基本的に一つのindex.cgiで全頁のメインを書いてます。
現状ではHTMLもかいてます。それぞれわけるなら全面CGIにする必要性もあまり感じられませんし。
>>776
行数は増えていくと思います。商品の紹介文などを別にしない限りは。
多分みなさんが言うのはHTMLや商品コメント、価格その他はDBに突っ込んで
メインから読み込んで処理しろということだと思います。
現状は商品コメント以外はテキストファイルに作ってありますが、
なんとも中途半端な状態です。
かなりヒントになりました。あちがとうございます。
一つ質問ですm(_ _)m
使い終わった変数をundefしたいというか削除したいのですが、
undef $a;
これだとスカラー一つ筒しかできないのですがどうやればいいんですか?
my ($a,$b,$c,$d) = (undef)x4;
今はこうやってますが、これってほんとに
undef $a;
undef $b;
..
と同じ効果が得られているんでしょうか?一応中身は消えてるみたいですが。
0779772
05/01/16 12:19:44ID:LfCWlcLW書き間違えです。
($a,$b,$c,$d) = (undef)x4;
こっちです。
0780nobodyさん
05/01/16 12:50:22ID:???my ($a,$b,$c,$d) = (undef)x4;
foreach($a,$b,$c,$d){
printf "%sdefined", defiend $_ ?'' : 'Not';
}
0781nobodyさん
05/01/16 12:57:20ID:???アー逆スマソ。
my ($a,$b,$c,$d) = (undef) x4;
printf qq|%s -> %sdefined\r|, $_, defined $$_ ? q|Not| : q|| foreach(qw|a b c d|);
0782nobodyさん
05/01/16 15:40:03ID:???よくわからんが、HTML::Template 使うと幸せになれるとかそういう話じゃないのか
使い終った変数を undef したいというのも、なぜそんなことをしたいのかよくわからん。
巨大なメモリを喰うオブジェクトを destroy して解放したいというならわからんでもないが。
0784nobodyさん
05/01/16 16:22:42ID:???これはご存知?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html#Private_Variables_via_my_
> “my”は、それを囲んでいるブロック、条件文 (if/unless/elsif/else)、
> ループ(for/foreach/while/until/continue)、サブルーチン、eval、
> あるいはdo/require/useされたファイルに(lexicalに)閉じ込められる変数を定義します。
{
my ($a, $b, $c) = qw(1 2 3);
}
# 他で参照していない限り、ここで$a,$b,$cは無くなります。
print $a, $b, $c; # use strictならエラー
グローバル変数をundefするというのなら、
undefするより別の名前の新しい変数を作るべきです。
0787784
05/01/16 19:35:11ID:???sortに使う特殊な変数ですね。
http://www.perldoc.com/perl5.8.4/pod/perlvar.html
> $a
> $b
> Special package variables when using sort(), see perlfunc/sort.
> Because of this specialness $a and $b don't need to be declared
> (using use vars, or our()) even when using the strict 'vars' pragma.
> Don't lexicalize them with my $a or my $b if you want to be able to use them
> in the sort() comparison block or function.
0788nobodyさん
05/01/16 21:59:39ID:???> グローバル変数をundefするというのなら、
> undefするより別の名前の新しい変数を作るべきです。
undefにはメモリの開放という働きもあるので、一概にはいえない。
0789nobodyさん
05/01/16 22:18:34ID:???(´,_ゝ`)プッ
0790nobodyさん
05/01/16 22:48:38ID:???チンカス君はメモリの開放という表現が嫌いかな?
↓これを
$size = 10;
$a = '0' x (1024 * 1024 * $size);
undef $a;
$b = '1' x (1024 * 1024 * $size);
undef有効にして実行
$ time perl test.pl
real 0m8.430s
user 0m1.549s
sys 0m0.334s
undefをコメントアウトして実行
$ time perl test.pl
real 0m12.044s
user 0m1.540s
sys 0m0.673s
sizeは実装メモリで加減してくれ。
0791nobodyさん
05/01/16 23:26:56ID:???$size = 1;
timethese(10000, {
'(1)' => '&test1;',
'(2)' => '&test2;',
});
sub test1 {
$a = '0' x (1024 * 1024 * $size);
undef $a;
$b = '1' x (1024 * 1024 * $size);
}
sub test2 {
$a = '0' x (1024 * 1024 * $size);
$b = '1' x (1024 * 1024 * $size);
}
Benchmark: timing 10000 iterations of (1), (2)...
(1): 272 wallclock secs (227.82 usr + 40.47 sys = 268.29 CPU) @ 37.27/s (n=10000)
(2): 251 wallclock secs (247.34 usr + 0.08 sys = 247.42 CPU) @ 40.42/s (n=10000)
0792nobodyさん
05/01/16 23:31:53ID:???0793nobodyさん
05/01/17 01:20:52ID:???馬鹿?
実装メモリの1/4位は取ってみろ。
test1は何見てんの $a確保→開放→$b確保→戻る 意味ねー
0795nobodyさん
05/01/17 02:34:12ID:???undef有効の場合
>>790は各々1回しか実行しない。
$a確保→$a開放→$b確保
使用メモリ: $sizeMB
>>793は各々10000回実行する。
$a確保→$a開放→$b確保→$a確保→$a開放→$b確保→
使用メモリ: 2*$sizeMB
全然違う。
0796nobodyさん
05/01/17 03:49:42ID:???$res =~ s/(<br>>|<p>>)(.*?)<br>([^>])/<blockquote><p>>\2<\/p><\/blockquote><p>\3/g;
$res =~ s/(<br>>|<p>>)(.*?)<br>([^>])/<blockquote><p>>\2<\/p><\/blockquote><p>\3/g;
$res =~ s/>>/>>/g;
$res =~ s/([^>])<blockquote>/\1<\/p><blockquote>/g;
としてみました。
$resは書き込まれた内容をp要素で括ったものなので、
<p>>から始まる は、文頭から引用だった場合、
<br>>から始まる は、文頭ではなく、行頭から引用だった場合、です。
最後の行は、もしも、文頭ではなく、行頭だった場合、その前のp要素を閉じる、という処理です。
現状では問題は発生しませんが、
「こんな書き込み方をされたらこんな問題出るだろ」というのとかありましたらお教え下さい。
次はネストに挑戦しようと思ってるんですけど、この段階で穴がありそうな気がして前に進めません。
0797784
05/01/17 07:07:24ID:???確かに変数を増やすのはメモリを使いますが、>>790のような何MBというデータは
果たして本当にグローバル変数で確保しておく必要があるのでしょうか。
メモリの1/4を使うというというのなら、設計から見直して、変数を局所化する方法を
探してみたほうが良いと思います。
0798nobodyさん
05/01/17 07:55:49ID:???想定している$resの内容がちょっとわからないけど、
$res = "<p>>引用<br></p>";
<blockquote><p>>引用</p></blockquote><p></p>
# 続くP要素内がカラになる
$res = "<p>>引用</p>";
<p>>引用</p>
# 引用できない
0799772
05/01/17 08:55:35ID:???作成中はuse strictしてるので、局所化はしています。
undefしたいのは気持ち的な問題で、コードを自分で読むときに
この変数は用無しというのをハッキリさせたいだけです。
あほらしいと思いますが、ブロック内でのローカル変数も
たまにundefしています。メモリ云々は考えていません。
0800772
05/01/17 09:03:45ID:???my ($a,$b,$c,$d) = qw/1 2 3 4/;
print $a,$b,$c,$d,"<br>";
($a,$b,$c,$d) = (undef) x4;
printf qq|%s -> %sdefined\r|, $_, defined $$_ ? q|Not| : q|| foreach(qw|a b c d|);
全部definedになりました。しかし3行目(undef行)をコメントアウトしても結果は同じでした。
どういうことでしょうか?
print defined $a;
でやると結果は変わりました。ちゃんとundefが聞いてるようです。
0802nobodyさん
05/01/17 10:46:32ID:1F0SQQP0この配列の中から0以上50未満の一番大きい数値を値として持っている
のは何番目かを簡単に調べることはできますか?
sort関数はなにやらややこしいので、いまいち理解できていませんが、
やはりsort関数を使わないと難しいでしょうか?
0804802
05/01/17 11:52:05ID:1F0SQQP0ありがとうござまい。とりあえず作ってみました。
1つのサイズの上限を決めて改行分割の最大限サイズで分割するものです
一応動くのですが他に思いつかないので無限ループをしています。
$limitがいくつであってもループから抜けれるようにはしてありますが、
できれば無限ループは怖いし、共用サーバでは他人に迷惑をかける可能性があrますので
避けたいです。
無限ループを使わずにこれと同じような処理をすることは不可能でしょうか?
0805802
05/01/17 11:55:51ID:1F0SQQP0my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';
my $p = "あいうえお\nかきくけこ\nさしすせそ\n";
my @mail = $p =~ /$ascii|$twoBytes|$threeBytes/og;
my @return;
my $i = 0;
foreach (@mail){
if ( $_ =~ /\n/ ) {push @return,$i}
$i ++;
}
@return = sort { $b <=> $a}@return;
my @text;
my $befor = 0;
my $limit = my $limit2 = 4;
while ( 1 ) {
my $limit3 = $limit;
foreach ( @return ){
if ( $_ >= $befor and $_ <= $limit ) {
push @text,join '',@mail[$befor..$_];
$befor = $_;
$limit += $_;
}
}
last if $limit > $#mail + $limit2 || $limit == $limit3;
}
foreach (@text) {print $_ ,"<br><br>"}
0806nobodyさん
05/01/17 12:30:59ID:???$n = (sort {$a[$b]<=>$a[$a]} grep { $a[$_] >= 0 && $a[$_] < 50 } 0..$#a)[0];
あるいはList::Utilのreduce使って
$n = reduce {$a[$b]>$a[$a]? $b: $a} grep { $a[$_] >= 0 && $a[$_] < 50 } 0..$#a;
reduceはO(n)だからO(n×log n)のsortより要素数が多ければ速くなるだろうと
期待できますが、要素数少なければsortの方が速いかも。
0807nobodyさん
05/01/17 16:41:34ID:wVIIMywn値を返したいのですがどうすればいいでしょうか?
0808nobodyさん
05/01/17 17:14:50ID:???2: System("su
passwd
useradd $username その他のオプションも
exit");
これじゃ無理だと思いながらやたンですけどヤパリ無理でした
0811nobodyさん
05/01/17 21:05:30ID:fcKelFvpコードを書くのにforを使って書けば済むのですがgrep等を使ってもっと
簡潔に書きたいと思っています。
しかしgrepは恐らく配列全部参照するので配列数が多くなるにつれて
処理が遅くなってしまうのではないかと思い、以下のようなものを書いてみました。
@test = (1..999999);
$Atime = time;
for($i=0;$i < @test;$i++){
if($test[$i] eq "1"){
print"ひっと\n";
last;
}
}
$rest = time - $Atime;
print"time:$rest\n";
$Atime = time;
print"ひっと\n" if grep ("1" eq $_,@test);
$rest = time - $Atime;
print"time:$rest\n";
sleep(9999);
やはり、forに比べてlastしない分grepのほうが遅くなりました。
grepのように簡潔にかけてforと同じもしくはそれ以上の速度が出せるような
コーディングの仕方はないものでしょうか・・
アドバイスお願いします。
0812nobodyさん
05/01/17 21:39:56ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o
0813811
05/01/17 22:07:21ID:???大変貴重なページを教えていただきありがとうございます。
How can I tell whether an list or array contains a certain element?
あたりに載ってますね。それ以外にも勉強すべき内容が沢山あって本当に助かりました。
0814nobodyさん
05/01/18 01:27:26ID:5YMtxRb8CIGでアクセスログの取得を考えています。
ログ取得に関する部分は下記の通りです。
if(open(FL,">> $file")){
print LOG "時間\tIP\tHPST\tなど…\n";
close(FL);
chmod 0666,$file;
}
ログの解析や表示に時間がかかるのは問題ないのですが、
保存には負荷がかからないようにと考えています。
追加書込モードなら負荷や破損を押さえられると思うのですが、
20万〜30万行程度の蓄積となると負荷は相当違ってくるものなのでしょうか?
0815814
05/01/18 01:29:10ID:5YMtxRb8ログ取得に関する部分は下記の通りです。
if(open(FL,">> $file")){
print FL "時間\tIP\tHPST\tなど…\n";
close(FL);
chmod 0666,$file;
}
0816nobodyさん
05/01/18 01:43:47ID:Oto1zFxVIEで見た場合、画像が無い時のxが表示されてしまいます。
これをうまいこと出さないで、imgタグでスクリプトを呼び出す事は出来るでしょうか?
0818nobodyさん
05/01/18 02:46:19ID:sIFYihq9このぐらいの数を管理するのに良い方法ってありますか?
使っているサーバはPHPは使えません。
今まで修正・削除などを
「ファイル開く→全データ取り込む→該当データを検索→処理→処理結果を反映して保存」
この単純な方法でやってきたんですが、もっと良い管理方法がありますか?
0820nobodyさん
05/01/18 03:43:06ID:mDYssaxTprint <<END_OF_MESSAGE;
…
$ { PrintMessage() }
…
END_OF_MESSAGE
sub PrintMessage {
#ここにある配列を加工したものを上に出すにはどうしたらいいでしょう?
}
0821nobodyさん
05/01/18 03:52:41ID:???その関数PrintMessageではデータの加工ぐらいしか行わない方が良い。
${}を使ってヒアドキュメント内で出力させるようにするにはprintを使わないと行けない上に、
出力した物は${}があるところではなくヒアドキュメント内の一番最初に出力される。
だから、一回ヒアドキュメントやめるか、配列とか変数に入れといてヒアドキュメント内で出力した方が吉。
0823nobodyさん
05/01/18 04:22:12ID:mDYssaxT> 出力した物は${}があるところではなくヒアドキュメント内の一番最初に出力される。
げげっ、それは知りませんでした。書き直します。
ありがとうございました。
0824nobodyさん
05/01/18 08:32:39ID:???副作用じゃなくて文字列返す関数にして、スカラー式を
文字列リテラルに埋め込む慣用句の${\(式)}使えばいい。
print <<END_OF_MESSAGE;
…
$ { \PrintMessage() }
…
END_OF_MESSAGE
sub PrintMessage {
my $s = "適当な文字列";
return \$s;
}
0825nobodyさん
05/01/18 10:17:22ID:aExMxO8Wmy $b = "aio,r,3s2r,waaaas,tuuu,huor";
$bの中から$aにないものを削除したいんですが、どうすればいいでしょうか?
$aにあるものを削除するのはわかるので、$aにあるものを$bから新しく$cに移す
という方法は思いついたのですが、なんかいけてないんですよねorz
もっとかっこいいやりかたできませんか?
人間の脳みたいに、違うものという判断をしたら該当部を削除するといった処理を。
0826nobodyさん
05/01/18 12:15:23ID:???こんなんでどうでしょう?
#--------------------------------------------
my $a = "aeo,huor,tuuu,gfd";
my $b = "aio,r,3s2r,waaaas,tuuu,huor";
$a = ',' . $a . ',';
$b =
join ('',
map { (index ($a, ',' . $_ . ',') < 0) ? '' : $_ . ',' }
split (/,/, $b) );
chop $b;
#--------------------------------------------
0827826
05/01/18 12:17:02ID:???私も質問なんですが、
ライブラリとかモジュールは、 @INC の中から勝手にファイル検索して読み込んでくれるんですが、
「そのライブラリの中の階層にあるテキストファイル」
を同じように*簡単に*読み込む方法ってありますでしょうか?
例えば、
--------------------------------------------
lib/
|- Hoge.pm
|- Hoge/
|- Hoge1.txt
|- Hoge2.txt
honya.cgi
--------------------------------------------
があるとして、
--------------------------------------------
# honya.cgi
unshift (@INC, qw(lib ../lib) );
--------------------------------------------
--------------------------------------------
# Hoge.pm
my $dir = ''; # ←ここに勝手にファイルのあるフォルダを検索していれたい
open (TXT, $dir.'/Hoge1.txt');
--------------------------------------------
foreach (@INC) 〜 でやればなんとかできるんですが、
もっと上手い方法でできるなら教えてください。
調べてもわからなかったのです。
そういうことを書いてあるページとかあったらそれでもいいですので。
0828nobodyさん
05/01/18 12:22:27ID:???sub PrintMessage{
my $message;
# ...
return \$message;
}
print <<EOT;
${ PrintMessage() }
EOT
>>821
ごく一般的なイディオムだと思うが?
>>824
知識が半端過ぎますから!残念!
0829nobodyさん
05/01/18 12:33:26ID:???関数の戻り値は文字列にして${}の中でリファレンスとる方が
オレは好きだな。
sub PrintMessage{
my $message;
# ...
return $message;
}
print <<EOT;
${ \PrintMessage() }
EOT
0830820
05/01/18 13:25:04ID:fG6Vu+xI入ってしまいます。
print <<END_OF_MESSAGE;
…
@hairetu
…
END_OF_MESSAGE
配列の中身を出すには、↑のようなやり方はまずいんでしょうか?
0831nobodyさん
05/01/18 13:38:49ID:???配列を文字列リテラルに埋め込むときは要素間に特殊変数$"($LIST_SEPARATOR)の値が
埋め込まれる(デフォルトは空白)。
これが嫌ならば$"を空文字列にしておくか、配列をつなげた文字列を作って別の変数
にいれてそれを埋め込むか、式を埋め込む慣用句で${\join('', @hairetu)}などと
する。
0832820
05/01/18 13:43:04ID:fG6Vu+xIおお、ありがとうございます!
> ${\join('', @hairetu)}
↑これでうまくいきました。(ぺこり
0833nobodyさん
05/01/18 14:21:05ID:???0835nobodyさん
05/01/18 15:03:27ID:???使うと自動的に数に変換するので、明示的にatoiのような
ことをする必要はない。
しかし、atoiとは違って小数点を含んだ文字列は適当小数
に変換してしまうので、厳密にatoiと同じ仕様が欲しければ
CPANモジュールのatoiのようなものを使うか自前で似たような
ことをしなければならない。
0836nobodyさん
05/01/18 15:10:10ID:???0837nobodyさん
05/01/18 16:19:26ID:???すまん、POSIXのatoiはC-specificなので存在しなかった。
整数部が欲しければintを使えということになっている。
もちろんperlのintだとCのint型があふれるような大きな
数でもそれなりに変換できてしまうので、全く同じでは
ない。
例えば手元のC処理系ではatoi("9999999999999")は
2147483647になるが、perlでint("9999999999999")
はそのまま9999999999999だった。
その辺まで同じにしようと思うとXSでatoi呼ぶモジュール
作る方が楽かもな。
0838nobodyさん
05/01/18 16:52:34ID:SYAXE7mKどうかけばいいんでしたっけ???
0840nobodyさん
05/01/18 23:32:22ID:???use benchmark;
と書きましたが、syntaxエラーになりました。
どうすればよいですか?
#! パス
use benchmark;
print 'テスト';
0841nobodyさん
05/01/18 23:41:37ID:???use Benchmark;
print 'テスト';
0843nobodyさん
05/01/18 23:46:14ID:???0845nobodyさん
05/01/19 00:29:44ID:???DOS窓でテストしていますので、今はコメントアウトしています。
0847nobodyさん
05/01/19 12:21:25ID:???何か良い選択肢は無いでしょうか?
0848nobodyさん
05/01/19 12:58:46ID:???0849nobodyさん
05/01/19 17:43:55ID:ay48KDLy下のソースでJPEGのサムネイルを作ってるんだけど
$simg = Image::Magick->new;
$simg->Read($inimage);
$simg = $simg->Transform(geometry=>$width_size);
$simg->Write($putsam_jpg);
アニメーションGIFを$inimageにした場合
うまくJPEGに変換できず
***.jpg.0
***.jpg.1
***.jpg.2
のようなファイルが出来てしまいます。
1フレーム分だけの情報を使って
JPEG画像にするにはどうしたらよいのでしょうか?
0850nobodyさん
05/01/19 19:06:38ID:???$simg->[...]で1枚だけ適当に取り出せばいいんじゃないかな。
$simg = Image::Magick->new;
$simg->Read($inimage);
$simg = $simg->[0]->Transform(geometry=>$width_size);
$simg->Write($putsam_jpg);
とか。
0851nobodyさん
05/01/19 20:17:15ID:ms2pliGvIPC-SharedCacheと言うモジュールを見つけたのですが
windows環境では使えないみたいです。
windows環境で共有メモリを使えるようにする方法はないものでしょうか?
OSは2000SP4です。
助言いただければ幸いです。
#必死こいてドキュメント英訳したのに・・最初にactivestate行って使えるか確認しとくんだった。
0852nobodyさん
05/01/19 23:06:54ID:yPuKv0T8htmlのページから
< a href="abc.cgi">A氏</a>
< a href="abc.cgi">B氏</a>
というようなリンクでabc.cgiを呼び出した時、abc.cgi側で、
A氏、B氏のどちらのリンクで呼び出されたかを判断するに
は、どうすれば良いでしょうか?A氏で呼ばれた場合と、B氏
で呼ばれた場合で処理を変えたいのですが。。なにか関数とか
あるのでしょうか?
なにか的外れなことを言ってたらすいません。m(_ _)m
0853nobodyさん
05/01/19 23:11:38ID:???<a href="./abc.cgi?auther=B">B氏</a>
とか、
続きどぞー
↓
0854nobodyさん
05/01/19 23:36:11ID:???<a href="./abc.cgi?orewa=B">B氏</a>
とか、
続きどぞー
↓
0855nobodyさん
05/01/20 00:21:57ID:yz6Kh3Ct0856nobodyさん
05/01/20 00:41:51ID:???Win32::MemMap というモジュールなら共有メモリを使えるとの噂は聞いているのだが、
入手方法すらわからん状態なので、俺の代わりに見つけてきてくれ
0857nobodyさん
05/01/20 01:00:19ID:xH8/53fr>854
>855
852ですが、せっかく回答頂いたのですが、なにせ素人でいまいち
分かりません。。
"?"の後は変数名でしょうか?html側で変数に値をセットしておけば、
abc.cgi側で参照できるのですか?(全然違う??)
できれば、cgi側の記述はどうなるか教えて下さい。m(_ _)m
0858nobodyさん
05/01/20 01:19:09ID:???本とか見ながらやってるんじゃないのか?
とりあえず簡単に書いてあるところをひとつ。
http://perl.misty.ne.jp/13.html
0859nobodyさん
05/01/20 04:36:12ID:???なにをどう簡単にしたいのか解らんが、サブルーチンにするんじゃだめなのか?
後、foreachを使わない短い書き方を質問したのであれば1行版を使ってくれ。
#========== サブルーチン版 ============
my $full_path = search_inc('Hoge1.txt');
sub search_inc{
my $file = shift;
foreach my $path(@INC){
my $full_path = "$path/$file";
if(-f $full_path){
# ファイル名がいらなければ
# return $path;
return $full_path;
}
}
}
#========== 1行版 ============
my $full_path = (grep{-f}map{"$_/Hoge1.txt"}@INC)[0];
# ファイル名がいらなければ
my $dir = (grep{-f"$_/Hoge1.txt"}@INC)[0];
0862851
05/01/20 14:57:39ID:???CPANを検索してWin32-MMFというモジュールを見つけてきました。
http://search.cpan.org/~roger/Win32-MMF-0.09e/MMF.pm
多分同じような目的で使えるのではないかと・・・
activestateにはモジュールが用意されいなかったためppmが使えず
早速
http://digit.que.ne.jp/work/index.cgi?Perl%a5%e2%a5%b8%a5%e5%a1%bc%a5%eb%2f%a5%a4%a5%f3%a5%b9%a5%c8%a1%bc%a5%eb%28CPAN%29
ここの手引き通りにCPANでWin32-MMFをインストールしようとしたのですが
最後のMAKEの時に失敗してしまうようです。
0863851
05/01/20 14:58:39ID:???Copyright (C) Microsoft Corp. 1991,1993. All rights reserved.
KKCFUNC が組み込まれました.
マイクロソフトかな漢字変換 バージョン 2.51
(C)Copyright Microsoft Corp. 1992-1993
PKSFX (R) FAST! Self Extract Utility Version 2.04g 02-01-93
Copr. 1989-1993 PKWARE Inc. All Rights Reserved. Shareware version
PKSFX Reg. U.S. Pat. and Tm. Off.
Searching EXE: C:/PERL/ADDED/NMAKE15.EXE
Inflating: NMAKE.ERR
Inflating: NMAKE.EXE
PKSFX: (W18) Warning! README.TXT already exists. Overwrite (y/n)?y
Inflating: README.TXT
C:\Perl\added\nmake15.exe -- NOT OK
Running make test
Can't test without successful make
Running make install
make had returned bad status, install seems impossible
このような感じです。DBIやHTTP::Liteなどは問題なくMAKEも完了し
正常にインストールされる為、原因がわかりません。
0864851
05/01/20 15:07:00ID:???OSはwin2000sp4とxpSp1で各OSにて
ActivePerl-5.6.1.638-MSWin32-x86.msi
ActivePerl-5.8.4.810-MSWin32-x86.msi
の2つを試してみましたが全部同じ結果が出てしまいます。
他のモジュールについてはインストール可能でしたがwin32-APIだけは
同じような理由でインストールできませんでした。
C:\Perl\lib
C:\Perl\lib\auto
にファイルをぶち込めばインストールできそうかなと思うのですが
C:\Perl\lib\autoに入れるべきデータ、dll等を生成してくれないため試すことができません。
0865nobodyさん
05/01/20 18:15:40ID:8gUpqVNOEncodeモジュール使ってやると
$str = "%A5%A8%A5%F3%A5%B3%A1%BC%A5%C9%A4%B9%A4%EB%A5%C6%A5%B9%A5%C8";
$str =~ tr/+/ /;
$str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
from_to($str, "euc-jp", "utf8");
とやったんですが
$strの中身が \¨\ó\³¡¼\ɤ¹¤ë\Æ\¹\È こんな感じになってしまいます
別にEncodeモジュールなしでもいいので
教えてplz
0866865
05/01/20 18:29:47ID:???0867nobodyさん
05/01/20 20:15:11ID:???君もまた豪快なことをするな。
nmake15.exe は自己解凍ファイルなのに、
それを解凍せずそのまま C:\perl\added\ に置いただろう?
まあいずれにしても、もはやコーディングの話題ではないので、話が続くようなら
ttp://pc5.2ch.net/test/read.cgi/php/997829243/ とかに移った方がいいかもしれん。
0868nobodyさん
05/01/20 21:58:37ID:2X1THOk4例えば$data{"test"} = "foo";というデータがあって
undef($data{"test"});としても$data{"test"}=undefとなって削除できないです・・・。
0869851
05/01/20 22:03:45ID:???・・・おっしゃる通りでした。てっきコンパイラそれ自体だとばかり思っていました。
そうすると逆に正常にインストールできたモジュールのほうがおかしいことになりますね。
誘導までして頂いてありがとうございます。
因みに
nmake15.exeを解凍し、でてきた
NMAKE.ERR
NMAKE.EXE
README.TXT
を同様にC:\perl\added\に置いて設定しましたがエラーがでてしまいました。
これからは誘導先に移らせて頂きます。
0871nobodyさん
05/01/20 22:08:28ID:2X1THOk4DBMファイルに一定の連想配列が保存されている時に、それらのデータを読み込まず
任意の連想配列のみを削除することは出来ますか?
データを空にすることはできるのですが、その連想配列自身を消すことが出来ないんです・・・。
0872nobodyさん
05/01/20 22:08:48ID:???delete $data{'test'};
ですたm(_ _)m
0873nobodyさん
05/01/20 22:32:19ID:2X1THOk4ありがとうございます。やってみたんですが、やっぱり消すことが出来ません。
ハッシュの書き込みなんですが以下のようにやってます
%writehash = (%writehash, %$data);
%$dataが追加するデータです。
もとのデータを%$dataに読み込んでdeleteし、
%writehash = %$data;
とすれば実現できたんですが、一度データを読み込まなければいけないので、、、
0874nobodyさん
05/01/21 00:08:52ID:???手元ではdeleteで消えるけど何が違うんだろうね。
% perl -e 'use DB_File; tie %h, "DB_File", "db"; $h{"foo"} = 1; $h{"baa"} = 2;'
% perl -e 'use DB_File; tie %h, "DB_File", "db"; foreach(keys %h){print $_,"\n"}'
foo
baa
% perl -e 'use DB_File; tie %h, "DB_File", "db"; delete $h{"foo"};'
% perl -e 'use DB_File; tie %h, "DB_File", "db"; foreach(keys %h){print $_,"\n"}'
baa
0876nobodyさん
05/01/21 12:37:45ID:AnHfdE4Zwhile(1){
if ($a == 1){ ここで二つの無限ループを抜け出したいんです}
}
}
ifの中になんと書けば2つ一気にでられますか?
activeperl5.6.1が自宅環境でサーバでは5.8.1のようです。
宜しくお願いしますm(_ _)m
0877nobodyさん
05/01/21 12:52:16ID:???while(1){
while(1){
if($a == 1){ last NUKERU; }
0878876
05/01/21 13:49:59ID:AnHfdE4Zラベルを使えばいいんですね。
でもラベルってループ文が出てくるより前に書くのですか?
無限ループになりそうで怖くて試せません。
後ろに付けてもぬけれましたが、その後の処理をしてくれませんでした。
while(1){
last A;
print 1;
}
A:
print 2;
表示結果は白紙です。どういうことですか?
0879876
05/01/21 13:51:47ID:AnHfdE4Z0880nobodyさん
05/01/21 16:01:36ID:AnHfdE4Zuse CGI:cookie;
などの::はどういう意味でしょうか?
モジュールは通常ファイル名とpackage名が同じでないといけませんよね?
でもactiveperl5.6.1に標準付属のモジュールは結構ファイル名とpackage名が
違うのがあります。
どうしてそれで正常に動作できるのでしょうか?
package名なんてファイルを開いて見ないとわかりませんよね?
0881nobodyさん
05/01/21 16:16:38ID:???フォルダ内にあるよってことさ。
だから例えば
use lib '/home/ユーザ名/public_html/cgi-bin';
のようにしてcgi-binの中にCGIというフォルダを作成して、その中にCookie.pmを
コピーすればCGI::Cookieの名前で呼び出せる。
まあ標準付属のモジュール以外使えないサーバ使ってる人間にとっては常識なんだがね。
0882880
05/01/21 17:23:19ID:AnHfdE4Zそうなのですか?
今CGI::Sessionをインストールされていないサーバで
自分のPCに入っているPerlモジュールのCGIフォルダをまるごとコピーして
ユーザディレクトリ内にやってみたのですが下記のようなエラーがでました。
Can't locate auto/CGI/Session/autosplit.ix in @INC (@INC contains:
incの中身列挙) at /usr/lib/perl5/5.8.1/AutoLoader.pm line 160.
at /home/tme46901/html/cgi-bin/CGI/Session.pm line 9
test.cgi syntax OK
つまりこれはAutoLoderの160行辺りのauto/CGI/Session/autosplit.ix
このモジュール?ファイル?が見つからないっていうエラーですよね?
実際にAutoLoderの160行付近を捜すと
$path ="auto/$calldir/autosplit.ix";
多分これが原因なんだろうなと思います。
で、なんとなく自分のPCに入っているコンパイル済みのautoディレクトリごと
アップし、use libを一行増やしましたがエラーの内容は変わりませんでした。
これはautosplit.ixを見つけられないというエラーではないのでしょうか?
0883nobodyさん
05/01/21 17:52:07ID:???お前が省略した@INCの中身のどれかのディレクトリの下に
auto/CGI/Session/autosplit.ix があればよし、なければ
インスコがうまくいってないということだな。
0884nobodyさん
05/01/21 19:59:35ID:4xlCPraB[Thu Jan 20 17:45:21 2005] [error] 1992: ModPerl::Registry: 103:Software caused connection abort at ・・・
といったメッセージが ssl_access_logn に出るようになってしまいました。
sslを使わなければこういうメッセージは出ません。httpsでアクセスした時だけです。
なぜこういうことが起きるのでしょうか?
(このスレで合ってるかな?)
0886nobodyさん
05/01/21 20:18:35ID:4xlCPraB日本語のページが無いもので...
0888nobodyさん
05/01/21 20:40:01ID:4xlCPraB分からないならそう言えば^^
0889nobodyさん
05/01/21 20:50:50ID:???0890nobodyさん
05/01/21 21:09:12ID:???結構なことじゃないか。
0892nobodyさん
05/01/22 00:40:13ID:???スイスイスーダララッタ、スラスラスイスイスイ♪
0893nobodyさん
05/01/22 09:44:47ID:e2M6eLer可能ですか?
0894880
05/01/22 10:18:03ID:6KUU/iOaありがとうございます。あの後自分のpcでppmで再インストールして関係のある
ファイルを確認しました。やはり揃っていたみたいで>>883の言うとおりにlibに
もう一つ渡したらperl -c では成功しました。
しかし何故かブラウザでは500エラーです。
ローカルではブラウザでもちゃんと動作するのに何が原因かわかりませんので、
とりあえずcarpモジュールに頼ってみましたが、何故かエラー内容を出力してくれません;
サーバはactiveperl5.8.1です。
BEGIN {
use CGI::Carp qw(carpout fatalsToBrowser);
carpout(STDOUT);
if ( defined $ENV{'REMOTE_ADDR'} && $ENV{'REMOTE_ADDR'} ne '127.0.0.1' ){
use lib サーバパス;
}else{
use lib ローカルパス;
}
}
宜しくお願いします。
0895nobodyさん
05/01/22 10:40:15ID:???CGI::CarpのfatalsToBrowserが有効になる前にエラーに
なってるのがいちばんありそうだな。置き方が悪いとか
#!〜のあたりがおかしいとか。
鯖のエラーログを見るのが一番早いと思うのだが。
0896nobodyさん
05/01/22 10:48:00ID:???0897880
05/01/22 10:54:56ID:6KUU/iOa#!〜の部分は問題ないです。置き方が悪いかはわかりませんが、
既に稼動させてるCGIは5-6個ありますので、そのときと同じ手順ですので
問題ないかと思うのですが・・・
共用サーバでもエラーログってユーザごとにみられるんですか?
通常どこらへんにあるのでしょうか?
>>896
以前は@INCにpushしてた名残なのです。
0898880
05/01/22 11:14:58ID:6KUU/iOa0899nobodyさん
05/01/22 12:18:08ID:XoEEKIhN入力フォームのテーブル幅の変え方(Perlに記述する$〜〜)
を教えていただけないでしょうか?
書き込んだ後の、表示される記事のテーブル幅の変え方は分かったのですが
入力フォームがどうしても分かりませんでした。
どうぞヨロシクお願いいたします
0901nobodyさん
05/01/22 15:42:18ID:6KUU/iOa/home/public_html/lib/
というフォルダの中に自作・他作モジュールが混在していて、
libフォルダのなかにもさらに色々なフォルダがあるとします。
中身はもちろんモジュールです。
そういうときに一発で@INCにlibディレクトリから下位層全てを加えるというような
命令を出したいのですが無理でしょうか?
use lib '/home/public_html/lib/';
これでは中のフォルダまでは認識されないみたいなので(windowsでは認識する?)。
いちいち
use lib ('/home/public_html/lib/','/home/public_html/lib/CGI');
などとしないといけないみたいで面倒です。libにオプションでも付けれるかと思いましたが、
perl.docにはそのようなことは書いてありませんでしたし。
エロイ人お願いします。
0904901
05/01/22 17:04:29ID:6KUU/iOaありがとうございます。
ところで
/home/usr/site/lib
などにあるPerlの標準付属モジュールなどはどうやって@INCに追加されているのでしょうか?
モジュールがインストールされたときに自動的にPerl本体のオプションファイル
みたいなものに書き込まれているんでしょうか?
0905nobodyさん
05/01/22 17:11:46ID:???エロイ人はhttp://sakura01.bbspink.com/hneta/に集まってます。
0907901
05/01/22 19:03:50ID:6KUU/iOaそういう意味ではないのですが;
>>906
@INCの中身を見る限りでは大元だけを登録していて、CGIフォルダなどの個別は
してませんよね。
かわりに
multi treed ...なんとかっていう文字がくっついてるんですよね。
それを付けることによりUNIXがこのファイルより下位層という意味を
汲み取っていたりするんですかね?
0908nobodyさん
05/01/22 19:07:38ID:???Perlモジュールについて
http://pc5.2ch.net/test/read.cgi/php/997829243/
0909nobodyさん
05/01/22 19:32:17ID:???perl.cのS_init_perllib()関数で定義してる模様。
実際の各定数(ARCLIBとか)は環境によって定義するファイルが異なっている。
/win32/config_H.vc(win32 VC用?)では
#define ARCHNAME "MSWin32-x86-multi-thread"/**/
のように定義されてる。
0910nobodyさん
05/01/22 19:48:29ID:???localtime関数で得た時間を配列に代入し、昔に同じようにして配列に代入した値から時間差を秒単位求めたいのですが、
掛け算しまくって秒になおすのを考えたのですが、ほかにもっと良い方法はありませんか?
0913nobodyさん
05/01/22 21:12:15ID:???0914nobodyさん
05/01/22 22:07:43ID:???time() を教えずに localtime() だけを教えている書籍やWWWページが
結構ありそうだな
0915nobodyさん
05/01/22 23:03:28ID:???求める関数はtimeで、これはいわゆるunix timeという
1970年1月1日0時0分0秒GMTからの秒数を返す。こっちの
方が足し算引き算もそのままできてコンピュータには
扱いやすい。
しかしそのままでは人間には扱いにくいので見慣れた
年月日時分秒に分解してくれるのがlocaltimeと
いうわけだ。こっちは本来はlocaltime(<unix time>)
という形で引数を与えて使うのだが、式を省略した
ときはtimeの値(=現在の時刻)が与えられたことに
なる。
というのをはしょってlocaltimeだけ教えられるとこう
いう悲劇を生むのだろうなぁ。
0916nobodyさん
05/01/23 00:00:38ID:???思いどおりにできました
分かりやすい解説ありがとうございました
0917nobodyさん
05/01/23 00:38:29ID:vqv+/2ig簡易的な計算のプログラムを作ってみたんですがうまく動作しません。
ちょっと見て頂き、不具合等御指摘下さい
特定の計算式で、入力(1項目だけセレクトボックスにより選択)した数値を計算するものです。
ソース
http://tool-ya.ddo.jp/2ch/trash-box/contents.jsp?file=20050123003423509.txt
URL
http://sr-cafe.chu.jp/kok/calc.html
0918nobodyさん
05/01/23 00:43:17ID:???スレ違い
自作CGIを評価するスレ
http://pc5.2ch.net/test/read.cgi/php/1049514428/
0920nobodyさん
05/01/23 18:54:50ID:5kSUsj4gどなたかお願いします。
htmlのページから
< a href="abc.cgi">A氏</a>
< a href="abc.cgi">B氏</a>
というようなリンクでabc.cgiを呼び出した時、abc.cgi側で、
A氏、B氏のどちらのリンクで呼び出されたかを判断するに
は、どうすれば良いでしょうか?A氏で呼ばれた場合と、B氏
で呼ばれた場合で処理を変えたいのですが。。
という質問に対して、
< a href="./abc.cgi?name=A">A氏</a>
< a href="./abc.cgi?name=B">B氏</a>
という回答を頂いたのですが、
abc.cgi側で、このAとBをどのように参照してよいか分かりません。
フォームの値とかは$name = $form{'name'};という感じで変数に
代入して参照できると思うのですが、上記の場合はど記述すれば
よいでしょうか?
0923nobodyさん
05/01/24 10:28:19ID:Yl+XYDvu連続送信すると携帯キャリアによっては全部受信するまでに1日近くかかってしまいます。
このスクリプトはメルマガを携帯用に分割して送信するためのものなのですが、
何とか正常に受信できるようにしたいです。
少し感覚を空ければ多少はマシになるかなと思うのですが、Perlでは
プログラムの実行中に「1分間停止」みたいな命令はだせないのでしょうか?
0924nobodyさん
05/01/24 10:41:34ID:Yl+XYDvu0925nobodyさん
05/01/24 10:46:31ID:???ただし cron か何かで起動するならいいが、
CGI で実行中に1分も sleep すると
タイムアウトで kill される恐れがあるので
気を付けてな
0926923
05/01/24 13:54:19ID:Yl+XYDvuそれは知りませんでしたm(_ _)m
とりあえず10秒ずつ休ませるだけで問題なく受信できるようになりましたので、
大丈夫だと思います。
0927nobodyさん
05/01/24 14:38:48ID:KnbcSRWW$test{"hoge.hage.2ch"}
$test{"hoge.hage.3ch"}
$test{"qwerty.foo"}
$test{"shige.hage"}
…というような、キーをドット区切りの組み合わせにした連想配列を使っているのですが
キーの頭が共通のものを一度に削除する方法はあるんでしょうか?
上の例だと$test{"hoge.hage"}、$test{"hoge.hage.2ch"}、$test{"hoge.hage.3ch"}
を削除する方法です。
0929nobodyさん
05/01/24 15:15:44ID:KnbcSRWWああ、そんな方法があったんですね!ありがとうございます。
ついでに連想配列のキーは数千単位(或いはもっと)であるのですが
速度や効率の面ではどの程度から気にすべきでしょうか?
0930nobodyさん
05/01/24 15:28:07ID:???$test{"hogegege.hage"}
$test{"hogehage.hage"}
のようなhogeを含むものを全部消してしまいますかね?
正規表現で対応すればいいのかな。
#実際のプログラムだと不特定の数字を使っているので
#1と11と111が出てきたりします
0931nobodyさん
05/01/24 16:09:11ID:???あとスライスをまとめてdeleteした方が速いかも。
delete @test{grep /^hoge\./, keys %test};
とか。
あるいは$test{'hoge'}->{'gege'}->{'hage'}の
ようにすれば delete $test{'hoge'} 一発だけど
他の処理のからみもあるので大局的にこれがいい
かどうかはわからん。
0932nobodyさん
05/01/25 00:00:05ID:???if(X()){ return; }
if($a == 0){
A; X(); B; X(); C; X(); D; X();
$a = 1;
}elsif($a == 1){
E; X(); F; X(); G; X(); H; X();
$a = 2;
}elsif($a == 2){
・・・・・・・・・・・
}
return;
}
これを実行するとBの直後でsub Xに戻るとA→B→C→D→C→Dと
実行されなかった部分が繰り返されてしまうんですが、
最後の実行されなかったC→Dは繰り返さずに
A→B→C→Dだけまた繰り返すにはどうしたらいいんでしょうか?
returnの数や位置がいけないのかな・・・必ず残った分が実行されてしまうんです。
なにとぞご教授の方よろしくお願いします。
0933nobodyさん
05/01/25 00:17:27ID:???0934nobodyさん
05/01/25 00:32:09ID:???釣りじゃないんす。
まじで初心者なもんで原因が分からないんで教えてください。
X();はある障害が起こってないか常に確認をする為にこまめに入れてます。
ABCDEFGH....と順調に動作させたいんですが、
もし障害のXが起きたら$aの値の最初に戻って繰り返しをしたいんですが・・
0936932
05/01/25 02:24:52ID:???色々試して何度も実行してますが、解決法が分かりません。
知識0に近い状態からこういうものを作らなければいけなくて
lastとか入れたり色々試したんですがダメで何日も苦闘してます。
初心者って書いてあったんで最終的に質問してみたんですが、
ダメデスカ…。
0937nobodyさん
05/01/25 02:31:44ID:???それ以前に
>sub X{ # ← X の中で
>if(X()){ return; } # いきなり X 呼んだら無限ループになるだろ
0938932
05/01/25 02:46:47ID:???丸い物体が迷路を進むものでテンキーの2468で前後左右に進んで
それをsendKeyで送って進みます。
sub X{
if(cmpBmp(X, Y, "$DIR/abcチェックポイント.bmp")){ return; }
チェックポイントの黄色い点を画像認識でマッチングさせてそこで
つっかかってるようなら最初$aの値に戻るっていう風にしたいんです。
画面内でつっかかると自動的にstart位置に戻ります。
でもこの場合、Bの直後に戻ってもABCDCDのように残った部分もループしてしまって
うまく迷路を進むことができず、結局次のEの地点まで行けないのです。
0939nobodyさん
05/01/25 02:50:22ID:???0941nobodyさん
05/01/25 04:59:16ID:???やりたい事は分かった。
要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
それも別の場所でも使うと。
そ れ は 無 理
もっとスリムに書く方法があるべ?ほら。もっと簡単に思いつくぞ?
0942932
05/01/25 05:23:55ID:???ですよね・・ヒントありがとうございます。
>>939
スレ汚し失礼しました。
>>941
>要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
>それも別の場所でも使うと。
はい、その通りなんです。でもやっぱ無理なんですね。
他に方法・・・思いつきませぬ。。
とりあえずサブルーチンの事は後に置いといて考えてみます。
どうもでした。
0943nobodyさん
05/01/25 23:39:11ID:???0944nobodyさん
05/01/25 23:42:52ID:???0945nobodyさん
05/01/26 12:09:54ID:???テンプレがめっちゃ少なくなってる。
テンプレ見に来たのに。
なんでやねん。
しかもム板のコピーだし。
さらに932はム板でもわけの分からん質問してるし。
ほとんどマルチだし。
なんでやねん。
0946nobodyさん
05/01/26 12:13:41ID:/LVNqA6M<body>以前と</body>以降を取っ払って、
一行ずつ、「img要素を画像へのリンクに置き換える」などの処理を与える、という処理をさせて、
push(@dat,"$data\n");
で@配列に放り込んで、
print "@dat[$lines..$line]";
で表示という仕組みにしているのですが、
($lines..$line は、文字数などで計算して18kbで収まるようにしてる部分で、この部分はうまく動作しています。)
ソース表示で見てみると、各行文頭に半角スペースが二つ入っているんです。
@配列に入れる直前に、
$data = substr($data,3);
と、前2byte分削ってみたら<h1>foo</h1>がh>foo</h1>になってしまいました。
普通に使う分には問題ないですが、
pre要素でのマーク付けの際は、
<pre>foo
bar
hoge</pre>
のbar、hogeそれぞれの文頭の半角スペース二個が描画されてしまいます。
原因わかる方、お教え願います。
0948nobodyさん
05/01/26 12:46:04ID:???0949nobodyさん
05/01/26 12:59:38ID:???それが一番の早道ですよね。
@に入れる直前の時点では文頭の半角スペースがなかったようなので、よくわかりません。
>>948
$a = @a
とすると、配列の行数が出るので、""で括らなきゃいけないと思い込んでました。
とったら一個減りました。
あと一つなんですが、もうちょっと頑張ってみますです。
有難う御座いました。
0950946
05/01/26 13:05:30ID:???どこでかわからないんですが、文頭に半角スペースが入ってました。
>>947
「@に入れる直前の時点では文頭の半角スペースがなかったようなので」
とか間違った生意気な発言をしてしまい申し訳ありませんでした。
念のため、もう一度試してみたら見付かりました。
有難う御座いました。
0951nobodyさん
05/01/26 13:21:00ID:???全く理解しないで書いてる香具師が多いってことなのかねぇ...
0952946
05/01/26 13:44:53ID:???私、ですか?
私が@配列に入れた理由は、
header
body中身
footer
のbody中身を18KBで分割するために、@配列に入れました。
なんかおかしいでしょうか?
全て独学なので、間違った使い方をしている可能性は高いですが。
0953nobodyさん
05/01/26 16:15:11ID:???サイト構築に際して重要なのは「構造」か!?「内容」か!?はたまた「理念」か!?
お馬鹿なWEB職人達の寒い議論は今日も止まらない。
ものすごろく頭の悪い発言をしてくさい5
http://pc5.2ch.net/test/read.cgi/hp/1106209097/105-
0954nobodyさん
05/01/26 16:28:44ID:???たとえば文字列リテラルに配列を埋め込むことについては
perldata(1)に
配列変数は、ダブルクォート文字列中で、配列のすべての要素を変
数 $" 中に示す区切文字 (デフォルトはスペース) でつなげて展開
されます。 以下は同値です:
$temp = join($",@ARGV);
system "echo $temp";
system "echo @ARGV";
と説明されているのだが、これを理解していればそのような間違いは
普通しないし、仮にやってしまったとしてもおかしいと分った段階で
これに思い当たりそうなものだということ。
0956nobodyさん
05/01/26 22:18:17ID:NprQarfg0957946
05/01/26 22:47:36ID:???理解以前にそれ、読んでませんでした。
なんとなく始めて、なんとなく出来上がったので、
問題にぶち当たってから調べる、という非効率的な学習の仕方をしてました。
一度、ちゃんと仕様とか読んだ方がよさそうですね。
0958nobodyさん
05/01/27 02:43:34ID:???「KEN丁のせい」と思え
0960nobodyさん
05/01/27 07:05:12ID:???特殊変数がきちんと解説されている本やサイトって少ないしね。
0961nobodyさん
05/01/27 08:27:17ID:???print $hoge,"\n";
print $hoge."\n";
みたいな書き方もあるけど、
print "$hoge\n";
って書いたほうが単純で分かりやすい。
たぶんこういう記法に慣れてるせいで、リストの時も同じような書き方をしてしまうんだと思う。
0962nobodyさん
05/01/27 11:29:00ID:???これって何かの頭文字ですか。
0963nobodyさん
05/01/27 12:38:56ID:???EOD: End Of Data
ならわかるがEOMはしらん
0964nobodyさん
05/01/27 12:48:59ID:???EOF: End of file
EOM: End of message
0966962
05/01/27 13:02:45ID:???でもそうなると「EOMで挟む」っぽい構造になるのが気持ち悪いですね。
見た目的に。
0967nobodyさん
05/01/27 13:36:33ID:???0969nobodyさん
05/01/27 14:54:27ID:???自分の視認性を考えたらそのヒアドキュメントに名前をつける、という感覚の方が、
あとでメンテするときも楽だと思うのだが、そんな俺の発言は余計な御世話だったと思う。
0970nobodyさん
05/01/27 15:56:03ID:ZopGQTdqあいうえお<br>kakikueko<br>
|;
$aの中のものを置換したいです。
<center>は<CENTER>に
</center>は削除
<center>..</center>内の<br>は<BR><CENTER>に
<center>..</center>外の<br>は<BR>
こういうのをしたいんですが正規表現で一発では無理ですか?
0971nobodyさん
05/01/27 16:04:03ID:???アホな漏れはつい
$a =~ |(<center>.*?)<br>(.*?</center>)|\1<BR><CENTER>\2|g;
とか考えたが、これじゃあ<br>が一個以上だとダメだなw
正規表現では無理じゃない?<center>(*.?)</center>こうしてから
$1 =~ s|<br>|<BR><CENTER>|g;
ってやって元の場所に突っ込むとかは?
あ、元の場所に突っ込みようがないか?
0972nobodyさん
05/01/27 16:07:21ID:???$a =~ s|<center>(.*?)</center>|<CENTER>@{[\1 =~ s/<br>/<BR><CENTER>/]}</CENTER>|g;
とかでどうだ?
今は試す環境がないからなんともいえないが
0973nobodyさん
05/01/27 16:16:54ID:???パズルとしてはおもしろいのかもしれないが、
メンテしにくくなるだけなので素直に順を追って
複数回に分けて置換した方がいいと思うぞ。
0974970
05/01/27 16:19:43ID:ZopGQTdqあいうえお<br>kakikueko<br>
|;
@a = $a =~ m|<center>(.*?)</center>|;
$_ =~ s|<br>|<BR><CENTER>|g foreach @a;
$a =~ s|<center>(.*?)</center>|<CENTER>@a|g;
一応できました。不備があったらお願いします。
それともっといい方法がありましたらお願いしますm(_ _)m
0975nobodyさん
05/01/27 16:22:24ID:???・・・・・・漏れよりできる人なのねorz
恥ずかしくなってきた;
一応
$a =~ s/<br>/<BR>/g
が最後に足りてないよ・・・と^^;
気付いてるんだよねきっと
しかし漏れがなんとか1行でやってみせる。15分だけr時間をくれ。
0976970
05/01/27 16:27:33ID:ZopGQTdq全然ダメでした。
正規表現のgオプションを使っている時って「今何回目」という
情報をもっていないのでしょうか?
0977nobodyさん
05/01/27 16:50:36ID:???最後にまた「%%」へ戻すようにしているのですが、日本語等で
アラームが使われるようなことはありますでしょうか。
あるとその文字の一部も「%%」になってしまうのでどうしようか
考慮しております。
ご教授いただけますと幸いです。
0978nobodyさん
05/01/27 16:54:14ID:???eオプション使えば1行でいけそうなのに、後一歩でできなかった。
>>976
よかったら役に立てて下さい。
$a =~ s|<center>(.*?)</center>|"<CENTER>",$1=~s/<br>/<BR><CENTER>/|eg;
$a =~ s/<br>/<BR>/g;
$1を置換してそのまま置換後文字列を埋め込む方法がわからなかったorz
0979nobodyさん
05/01/27 17:37:33ID:???ショッピングカートのCGIを配布しているのですが、
MacOS9とIEの組み合わせだとバグが出てしまうという指摘を受けました。
商品が11種類以上になるとバグが出るそうです。
Winの場合、もしくは商品が10種類以下の場合は正常に動きます。
MacのIEだとperl内での変数の処理が特殊である場合などがあるのでしょうか。
例えばforeachを使ったときに「$_」の値が正しく認識されない、
等のバグなどがあるのでしょうか。
もしもあるのだとしたら、Macとそれ以外のOSの動作の違いなどを
解説したサイトがありましたら教えていただけると嬉しいです。
よろしくお願いします。
0980nobodyさん
05/01/27 18:00:01ID:???CGIの場合、perlは鯖の中で動きます。
そして出力内容がブラウザに返されて表示に使われるわけです。
従ってperlは無罪です。
バグつーのが何を指してるのか一切情報が提示されて無いのでアホかと思いますが、
不都合が生じる際の入出力の差異(GET・POST値、cookie HTTPヘッダ等)や
JavaScriptを利用しているならその解釈の差異を確認するのが解決の糸口になると思われます。
以降は別スレ或いは別板で質問するのが適当でしょう。
0981nobodyさん
05/01/27 18:07:38ID:???0982nobodyさん
05/01/27 18:12:29ID:???Perlコーディング初心者質問スレ Part 40
http://pc5.2ch.net/test/read.cgi/php/1106816922/
0983nobodyさん
05/01/27 18:21:10ID:???手のつけようの無いバグで焦ってしまっていましたが目が覚めました。
言われてみればその通りです。
GET・POST値の差異というヒントをいただけただけでもとても助かりました。
ありがとうございます。
0984nobodyさん
05/01/27 18:24:12ID:???しかもショッピングカートをきたもんだ。
((((;゚Д゚))))ガクガクブルブル
0985nobodyさん
05/01/27 18:32:32ID:???0987nobodyさん
05/01/27 23:15:51ID:???0988nobodyさん
05/01/27 23:16:14ID:???my $center = '';
$a =~ s{(</?center>|(<br>))}{uc(($2 or $center = $1 eq '<center>' ? $1 : '', '').$center)}ge;
0989nobodyさん
05/01/27 23:33:37ID:???$a =~ s{(<(/)?center>)|(<br>)}{uc(($3 or $center = $2 ? '' : $1, '').$center)}ge;
こっちの方がいいか。
0991970
05/01/28 09:30:02ID:dK9OtT7Gそれはどうなってるのでしょうか?
はじめに<center>を見つけると$center=<center>をして、
その後の<br>発見では自動的に<BR><CENTER>への変換。
</center>を見つけると$center=''で$centerが空っぽになる。
その後<br>を見つけると<BR>.''のようになる。
つまり<center>..</center>ないの<br>という捉え方ではなく
<center>がでるとフラグonで、</center>がでるとフラグoff。
状態情報を保有させてる感じなんですね。面白いですね。
1つわからないんですが$1,''の部分の''は何の役割があるのでしょうか?
これがないと確かに動作が変わるみたいですが・・・・・・どういう意味なのか
どういう瞬間に使われているのかわかりません。
もしよろしければご教授お願いします。
0993970
05/01/28 11:39:46ID:dK9OtT7G???
ストリクトとどういう関係があるのでしょうか。
それに置換後文字列はHDMLとしてはvalidですよ?
っていうかストリクトとなんて概念HDMLにあるんですか?
それともPerlコーディングにもストリクトとかあるんですか?
HTMLの場合はセマンティックウェブの観点など、ストリクトである意義はありますが、
プログラミングの世界ではストリクトとはどういう意義のもとに成り立ってるのでしょうか?
0994nobodyさん
05/01/28 12:52:26ID:???「HDMLで」なんて言ってたっけ?
> Perlコーディングにもストリクトとかあるんですか?
use strict;
0995nobodyさん
05/01/28 13:09:38ID:???0996nobodyさん
05/01/28 13:34:56ID:???0997nobodyさん
05/01/28 13:40:48ID:???立ってるよバカ
Perlコーディング初心者質問スレ Part 40
http://pc5.2ch.net/test/read.cgi/php/1106816922/
0998970
05/01/28 13:54:46ID:dK9OtT7G???
use strictのことをストリクタンと言ってるのでしょうか。
しかしuse strict環境でも問題なく動作してますが;
$aを使うなということでしょうか?
>>992を見る限りではそういう感じではないと思いますが・・・
よくわかりません。
0999nobodyさん
05/01/28 14:00:50ID:???10001000
05/01/28 14:04:33ID:aqK/nU8510011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。