Perlコーディング初心者質問スレ Part 39
1 :
nobodyさん :
04/11/27 11:35:03 ID:DJwiGeFM Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
nobodyさん :04/11/27 11:35:47 ID:DJwiGeFM
6 :
nobodyさん :04/11/27 19:29:38 ID:yZ3pGjpn
CGIでメールを取り込んで添付ファイルを指定ディレクトリに保存しています。 同じサーバーから取得しようとすると下記の情報だけしか取得できません。 今は、来たメールを別ドメインのアカウントへ転送して、 そのサーバーへ接続して取得しています。 ちなみにプロバイダの共用レンタルサーバー(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 ..(以下添付ファイル)..
7 :
nobodyさん :04/11/27 19:45:57 ID:/KXyQL2R
掲示板に検索機能を付けようと思うのですが、単純に正規表現でm/keyword/とやっても 関係ない文字に一致してしまいます(keywordがアルファベット一文字の時とか)。 これらを回避するにはどうすればよいのでしょうか? sjisでやってます。
全部URLエンコードしてしまうってのはどうだ。
perlメモの通りにやればsjisでもかなり高確率でいけますね。 すいませんですた・・・
12 :
nobodyさん :04/11/28 01:30:44 ID:UnlanLPT
@list=(f,b,a,d,c,e) というような中身が順不同な配列があったとして、 cとeを配列から削除するにはどうすればいいのでしょうか?
13 :
nobodyさん :04/11/28 01:32:49 ID:UnlanLPT
cとeじゃ、最後だけとればいいということになるので、 順番ではなく、bやcといった、中身を見て削除する方法を教えてください。
14 :
nobodyさん :04/11/28 01:56:38 ID:QZh49BOK
>>12-13 削除したい要素がどれぐらいあるかにもよる。
その例の通りならこんなのでもいいし。
@list = grep(!/b|c/, @list);
17 :
!13 :04/11/28 09:52:02 ID:???
>15 その別の方法とはどんなものですか?
splice()で削除するもよし。 foreachで1周させつつ必要なものだけ別配列にpushするもよし。 1周させつつshiftとpushを繰り返すのもよし。
ファイルロックの動作確認ってどうやってやるの?
同時に動作させる以外にないだろ
>>21 >>20 は同時にアクセスさせるとは書いてないだろ!
ファイルをロックした状態のままsleepさせておけば?
>>22 なるほどね。
同時にアクセスも同時に動作も同じようなもんだと思うけど。
同時に動作 -> flock部の実行が重なるように。 同時にアクセス -> スクリプトの開始(or ファイルのopen)が同時。 てな感じかねぇ。 話題がflockだからどっちでも通じると思うけど。
>>23 まぁいいじゃないか
突っ込まれてちょっとイラってきてたんだよ
>>23 コンビニで同時にレジに並んだ人が同時に店に入ったわけじゃないだろう。
シェルスクリプトのような感覚でベタ書きしてくのと、パッケージを細かく分けて OOPっぽく書くの、どっちがパフォーマンス的に有利なんだろう。 一概には言えないだろうけど、一般論として。
28 :
nobodyさん :04/11/29 02:50:14 ID:3ENBI+n/
>>27 そりゃOOPの方が不利。そのままソフトウェア設計の一般論に当てはまるかと。
(良く設計されたOOPのシステムはパフォーマンスが良いという事も)
ただしperl自体がそこそこでかいので、誤差程度でしかないと思うが。
個人的にはCGIで1000ステップ程度なら、むしろベタの方が見やすい。 特にHTML出力する部分はヒアドキュメントでずらずらと書かれてた方が ぱっと見で解り易いしメンテも楽。
>>27 OOPはパフォーマンスを上げるためじゃなく開発性を上げるためのもの
確かに
>>30 のいうようにOOPにすると逆に小難しくなるのも確かだね
OOP自体は遠回りしてでも処理を分割するから
無駄に変数定義してたりするけど
よほどのことがない限り差が出たりはしないんじゃないかなぁ
よく1回しか使わない関数でもサブルーティンにする香具師いるじゃん。 あれ見やすいってことだろうけど、漏れは、ぜんぶメインで書く。 実際、ベンチやると、メインだけの方が速いんだよな。余りやったこと ないが、別ファイルにしたモジュールのインクルードはさらに遅くなる と思われ。
perl使う人って、一行でも無駄な処理をやるのを嫌がるもんね。
で、そういう人に限って速いアルゴリズムを使ってなかったりするんだよね。
35 :
nobodyさん :04/11/29 11:19:34 ID:vhU7fwVw
デコード部分について色々と試しているのですが $value =~ s/[\x00-\x20]+/ /g; の記述についてです。 これはどのような意味を持つのでしょうか?
文字コード0x00〜0x20の文字が一つ連続していたら一つのスペースに。
1つ以上連続していたら打露
一つ以上。
PerlでCGI書いて1000ステップなんてありえない。 せいぜいデカいやつで100ステップ超えるぐらいだな。
まあそれで自分が見やすいならいいけどさ。
5.000が出始めたときちょっとやったんだが、 馴染めなくて結局シェルとsedとawk一辺倒だった。 今思えばあの時ちゃんとやっとけば良かった。
同じサブルーチンを他のCGIで使う予定がある時とかだと、
その時は一回しか使わなくてもサブルーチンを作っておくことは良くある。
>>41 今からでも遅くないからがむばれ。
1. とりあえずベタでスクリプトを1本書く 2. よく似てるが少しだけ違う処理のスクリプトを何本か copy&paste で作る 3. 共通部分に仕様変更が発生する 4. copy&paste したところをスクリプトの数だけ書き直し、嫌気がさす 5. サブルーチン化する てのが誰でも一度は通る道だと思ってたんだが、ひょっとして漏れだけ?
サブルーチン化するのがOOPってわけじゃないし OOPの書き方も人それぞれだから結局見にくいことに変わりはないケースもある そもそも再利用するための書き方だからね
>>43 結構な確率で通るんじゃないかな
俺も昔は良くやってたし
仕事でperlを使う場合、負荷や処理効率の悪さはあまり気にせずに済む場合が多い。 しかしレンタルの共用サーバとなると結構気になる。 実際、仕事より趣味のWebプログラミングの方がシビアだったりする。
言語によって人格変わる人いない?俺がそうなんだが。 javaはモデリング命だし、Cの場合は当然モジュール化しっかりやる。 でもperlだと・・・。
言語によって変わるなんて、プログラマ向いてないよ。
>>47 人格まではどうかはわからないけど、その言語の慣習に従う傾向はあると思う。
言語自身がそういった特定の用途向けに設計されてたりする事もあるから、言語毎に切替えるのが適切な対応なんじゃないかな.
細かいところでは、コーディングスタイルや変数/関数の命名規則なんかでも、その言語の標準に合わせたりするよ。
>>32 コストの判断を誤ってるような気がする。
関数呼出のオーバーヘッドの為、関数定義して使う方が遅いのは当然だけど。
ベンチ取ったとしても数千回回して1秒に届くかどうかの誤差の範囲内では?
ループ内で何度も呼ばれる関数ならインラインで展開する価値はあるかもしれない、
でも、一度しかつかわれないのなら、コードのみやすさとか保守性の方を優先させるべきだと思う。
確かに人格まではいかないけど 言語によって変えるのは普通じゃないかな 逆に無理やり同じように書く方がプログラマに向いてない
perlでコードもヒアドキュメントのHTMLもきっちり色分けして表示してくれる エディタないですかね? perlでコーディングする時、みんなどんなエディタ使ってるんだろ。
eclipseのperlプラグインだとかなりカラフルに色分けしてくれるが、 まあ精度はそれなり程度。 ちなみに俺は秀丸かvimでゴリゴリ書いてる。
SJISの場合、全角ハイフン「ー」が正規表現のマッチ対象にあるとエスケープしないといけないですが、 他にそういう文字ありますか?
それ全角ハイフンじゃないじゃん 音引き記号だぞ
>>54 2バイト目が\x40,\x5b,\x5c,\x5d,\x5e,\x7cの文字全部。
困るのは、マッチしないだけじゃなく、それらの記号が意味があるので異常終了しちゃうこと。
雑談っぽくて申し訳ないんだけど。 普段は仕事でシステム設計するしプログラミングもやる。 でも、いざWebをやろうとしたらHTMLよくわからない、CGIもよくわからない、perlもよくわからない。 CやjavaやVBならどんと来いなのに、業務アプリならおまかせ!なのに、なんか情けない・・・ そんな経験ないですか?
クマの私にはよく分かりませんが そういう時は勉強するんじゃないんですか?
わからないのなら勉強すればいいじゃない、としか言い様がない。
あるけど、ウェブだってお金取る仕事になってる訳だし 知らなくても恥ずかしくない。必要なら勉強するかって感じだな。 「お前SEなんでしょ?ちょっとCGIってやつHPに置きたいんだけど協力して。」 って言われて「あ、そういえば良くわかんねーや」ってのがキッカケだった。
掲示板のスクリプトが2000行越えちゃったんですが、ファイル分割した方がいいですかね? ヒアドキュメントのHTMLがどんどん長くなっていっちゃって・・・
>>63 自分の、あるいはそのスクリプトをメンテする人の技量ならびに忍耐力と相談して決めろ。
俺ならヒアドキュメント全廃して HTML::Template 使うが。
>>64 HTML::Template使う場合って、テンプレートを別ファイルにするか、
ソース内に組み込んでおくか、どちらがいいでしょうね?
余計なファイルアクセスは避けたいところ。
いずれにしてもHTML::Template使った事無いので、いったん今の状態で設置して、
テンプレート化も同時に進めてみます。
>>63 俺の作ったのなんか7486行あるぞ。
実行ステップ数は計ってないからわからんが。
その内、ヒアドキュメントは・・・どんくらいだろ。
別に長くてもいいんじゃね?
ヘタにいじくりまわして可読性が悪くなっても意味ねーし。
あと、実装してる機能にもよるだろ。
>>65 俺の環境で10000行ぐらいのやつでベンチマークとってみたら、
ヒアドキュメントにするよりも別ファイルにした方が20倍ぐらい速かった。
perl が立ち上がってスクリプトをコンパイルするときに
ヒアドキュメントの中まで構文解析するので、それに大きな時間を食われるのだと思う。
ただし環境によって違ってくる話だと思う。
コンパイル速度はCPU依存で、ディスクアクセス性能はHDD依存なので、
CPUが圧倒的に速くてHDDが無闇に遅いマシンだと、また違った結果が出るかもしれない。
>ヒアドキュメントにするよりも別ファイルにした方が20倍ぐらい速かった。 うお、マジかよ。いくら環境次第とはいえ、そこまで変わるってのもすげーな。
何種類もの画面が埋め込まれていて使うのは一つ、なんて 場合だと、外部ファイルに分離した方が使うもの1つだけ 読めばよいのでお得てなこともあるかもしれんな。
テンプレートライブラリを使うと、大抵はキャッシュやプリコンパイル機能がサポートされてるので、
オプションを適切に設定すれば、普通に埋め込むより速くても不思議じゃないよ、
HTML::Templateでも、ファイルからの読み込みは初回のみで、共有メモリにキャッシュを置く事とか出来る。
原理的にはメモリにキャッシュするのが最速なはずだし。
メモリと引き替えに実行速度重視とする場合は、
スワップとか発生すると逆にパフォーマンス低下するので、
コンテンツの規模、アクセス/更新の頻度、実行環境等を考慮して
パフォーマンスチューニングされてるのが前提だけど。
逆に言うと、こういった条件を無視して、
埋め込むほうがいいか、別ファイルに分ける方がいいかというのは、一概に判断出来ない。
条件次第では速くも遅くもなるのだから。
>>67 それくらいの規模になると、使われない処理のコードも毎回読み込まれてたりしないかな。
mod_perlだとまた結果がかわってきそう。
71 :
nobodyさん :04/12/01 19:47:44 ID:ZtAPmMKL
【質問】Perlでカウンタを作っているのですが、画像が表示されません。 解決方法を教えてください。 どのスレで聞けばいいのか分からなかったので、スレ違いなら誘導をお願いします。 【症状】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 」 設定済。
>>70 >HTML::Templateでも、ファイルからの読み込みは初回のみで、共有メモリにキャッシュを置く事とか出来る。
マジ?
mod_perlでなくてもOK?
レン鯖だとどうなんろう。
>>71 1:<!-- #exec cgi="count.cgi" -->
2:<!-- #include virtual="count.cgi" -->
これでどうだ?
>>72 事故レス
IPC::SharedCache無いとダメか・・・。流石にうちのレンタルサーバにはインストールされてなかった。
75 :
71 :04/12/01 20:13:12 ID:ZtAPmMKL
>>71 <!--#include virtual="count.cgi" -->
<!-- と # の間を詰める。のがポイント。
というか、Perlの問題じゃないじゃん。
>>74 すでにperldoc読まれたかと思うけど、
一応捕捉しておくと、mod_perlじゃなくてもOk, ただし、shared_cacheオプションを使う場合はIPCが必要.
共有サーバーだとしたら、資源の独占は返ってサーバー全体のパフォーマンスを落しかねないので。
もし使えたとしても、file_cacheに留めておくのが無難だと思う。
78 :
71 :04/12/01 21:26:05 ID:???
スレ違いの話題いいかげんにしろや
すれ違いじゃないと思う
一番多いので1万2千行逝ってる。
82 :
nobodyさん :04/12/02 12:10:08 ID: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より後ろは動かない。 誰か教えてくださいませ。。 それか、サブルーチンの書き方がおかしい?
>>82 試しに書いてみた。
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');
こんにちは。質問させていただきます。 会員制のサイトを作る場合、 ユーザー個々のデータを保存するのは、 CSV形式、それともユーザーごとにファイルを作成してハッシュ配列で保存、 どちらが妥当でしょうか? 例えばハッシュのイメージとしては、 Id 1 Pass 1234 Name A男 Age 42 Job 会社員 というように考えています。 CSVだと、 1, 1234, A男, 男, 42, 会社員 2, 5678, B子, 女, 30, 営業 ・ ・ ・ (以下リストが続く) ↑こういう形式で良いのでしょうか・・・。 よろしくお願いします。
すいません、質問です。 CGIが動いているサーバーの種類がWin系かその他系かを判定する方法ってありますか? ファイル名を指定してファイル出力を行なうCGIがあるのですが、 Win系ですと大文字小文字関係なく既に存在するものと同名のファイルは作成できませんが、 Linuxとかですと、大文字小文字が区別されるので、作成可能にしようと思っています。
>>86 サーバの返してくるhttpヘッダにあるかもしれないので取得するとか、
cgiで環境変数SERVER_SOFTWAREを調べるとかPATHから想像するとか、
systemとかopenとか使えるんだったらperlのバージョンとかを出力させてみるとか、
サポートに聞くとか
88 :
82 :04/12/02 17:39:29 ID:???
ありがとうございます。
>>83 動きませんでした・・・。
もう少し考えてみます。
本心では「本当にサブモジュール化しないといけないのか?」と思いつつ
上司にも逆らえず。
>>83 間違ってる?
returnを省略しても同じ結果なのはわかるのですが。
>>87 system関数が使えるなら、win系に存在しないコマンド(lsとかcatとか)を
実行させればいいと思うのですが。
system関数は中のコマンドが成功すれば0を返すので
unless(system "ls -l"){
Unix系のサーバーでやりたいこと
}else{
窓系のサーバーでやりたいこと
}
でできないかな。
俺のようにWindowsにGNUツールを入れてたらどうする? それだったらOSを識別できるコマンドで一度識別してから作ったほうがいいだろー。 unameとかでもいいし。 いちいちunless云々すんのかい? まぁあくまでsystemやらopenやら使えるなら。
90 :
83 :04/12/02 18:26:51 ID:???
>>88 動かないってのはエラーが出るってこと?
それとも正しくソートされないってこと?
一応、動作確認(ActivePerl5.8.4)済みなんだけど・・・
よければ動かない〜の詳細をレス頼んます。
>>82 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:降順),要素]の配列のリファレンス。
当たり前の話だけどさ、やっぱいいソースを沢山見るべきだね。 初めの頃にケン○やらレス○やらばっか参考にしてたが、 あんなソース見てたらダメだな。
どんなソース見てればいいんだ?
YukiWikiなんていいと思うぞ。Wikiってこれだけでできちゃうのかって感じ。 超人業でもなく、ダサダサでもなく、丁度いい感じのソースとおもふ。
初めの頃なんだからさ、掲示板とかで例を挙げてくれよ いきなり Wiki 設置しようとか思わないだろう
@{[何か処理]}@←これ、どういう場面で使うんでしょう?イマイチ意味分かりません。
@{[( ´ω`) ハラヘッピ]}@
ソースを参考にできるような掲示板など存在しない んじゃなかろうかという気がするが、もしあったら漏れにも教えて
掲示板ってキレイに作るの難しいよな。 インラインでHTMLだーっと書いて、途中から条件分岐で何か処理して、 続きのHTMLをまただーっと・・・ってなる。
ソースをぱっと見れた方がメンテしやすいからな。 HTML::template使うとヘッダ、フッタ、フォーム、メッセージ表示部分、って感じに 分けることはできないから、同じようなテンプレートをいくつか用意する事になるし。
TMPL_INCLUDE とか手はいくらでもあるように思うが > HTML::Template でテンプレート分割 それはそれとして、昔 DBI (Pgsql) + Template Toolkit で掲示板作ったが、 コードのほとんどは入力チェック・サニタイズのための if やら s/// やらの羅列で、 あまりコーディングの勉強に使って欲しくない出来に仕上がってしまった経験がある。
>>97 my @str = qw(うんこだ 素敵 ばかみたいだ 楽だ);
print <<"EOM";
ヒアドキュメントに埋め込みができるなんて、
Perlは@{[ $str[int(rand(@str))] ]}よね。
EOM
>>103 実行結果
> ヒアドキュメントに埋め込みができるなんて、
> Perlはばかみたいだよね。
...orz...
105 :
nobodyさん :04/12/03 00:27:48 ID:DFUzRW8v
質問失礼します。 perlでブログは作成できますか? また、何処かに参考サイト、 ソースのおいてあるサイト等があったらご教授ください。
>>105 もちろん可能(ry
スレ違いってことで一つヨロシク
ワロタw
レスQ元にしたBBSを一生懸命strictにしてる最中・・・ もう全く別物。作り直したほうが早かったなこれじゃ。
>>102 Class::DBIと、Data::FormValidatorあたり使えば、
コーディングなんてほとんどしないで掲示板作れるよ。
コーディングの参考にはならんけどね。。
111 :
82 :04/12/03 06:16:55 ID:???
>>89 それもそうだな・・・スマソ
>>90 配列が空になります。
実際はここでソートしたものをファイルに書き出す処理があるのですが、0バイト。
CobaltにPerl5.005の組み合わせです。
これがよくないのかな。
あ、エラーは出ません。
>>92 ありがとうございます。
会社でやってみます。
112 :
nobodyさん :04/12/03 09:03:42 ID:dEjygVC1
こんにちは。質問させていただきます。 会員制のサイトを作る場合、 ユーザー個々のデータを保存するのは、 CSV形式、それともユーザーごとにファイルを作成してハッシュ配列で保存、 どちらが妥当でしょうか? 例えばハッシュのイメージとしては、 Id 1 Pass 1234 Name A男 Age 42 Job 会社員 というように考えています。 CSVだと、 1, 1234, A男, 男, 42, 会社員 2, 5678, B子, 女, 30, 営業 ・ ・ ・ (以下リストが続く) ↑こういう形式で良いのでしょうか・・・。 よろしくお願いします。
114 :
82 :04/12/03 10:50:46 ID:???
>>92 ダメでした。。
use sortでInternalServerError。
サーバーアナライザーで見ると、sortと書かれたモジュールが見つからないのですが
それが原因かな・・・。
もうちっと考えて見ます。
115 :
82 :04/12/03 11:23:05 ID:???
追記
>>92 use sort〜の行を外すと動くのですが、
>my @new = bogosort([[1,1,0], [1,1,4]], @data);
の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。
上司に「サブルーチン化せず、1行にまとめてorで繋げたほうが素直」って
言ってはいるのですが・・・
「無理です」って言ってやろうかと思う今日この頃。
ありがとうございました。
配列内の最大値が配列の何番目であるか判別するためには、どのように書くのが簡潔でしょうか? @list = qw(3 5 8 4 2 9 6 1 7); #この例だと9が保存されている位置の5が欲しい foreachで回しながら比較していくしかないのでしょうか?
117 :
nobodyさん :04/12/03 11:53:46 ID:25445hqZ
>>116 ソートして先頭か末尾取り出せば?
とスレの流れを見て言ってみる
118 :
nobodyさん :04/12/03 11:54:48 ID:25445hqZ
HTMLに記述されたリンクを踏むと、そのページに飛んだりファイルを開いたりダウンロードを行ないますが、 ファイルを開いたりせずに強制的にダウンロードダイアログを表示させる事は可能でしょうか。 例えば、<A href="hoge.txt">hoge</A>などのリンクがあって、これをIEで踏むとIEがファイルを開いてしまいます。 これをダウンロードダイアログを出したいと思っています。 現在使っているサーバー(@nifty)ではCGI設置ディレクトリにあるログファイルなどへの直接のアクセスはできないので、 CGIを通してダウンロードを行ないたいと考えています。 多分出力するContent-typeの周辺をいじればいいのではと考えているんですが、 参考になるようなサイトをご存知の方はいらっしゃらないでしょうか。
>>115 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;
}
>>120 content-typeをapplication/octet-streamにしてやればたいてい
ダウンロードにいくとは思うが、ブラウザの類の挙動の話なので
perlとは関係ないからスレ違い。
>>116 List::Utilのreduce使って
reduce { $list[$a]>$list[$b]? $a: $b } 0..$#list
フォームから0を入力してもらうとき、それを真として処理するにはどうしたらいいでしょうか? 例えば<OPTION>で、0 時として送信したときに偽として処理されてしまいます。
>125 if($input_data != ""){ }
if ($object ne ''){ 処理 }
ごめ、Perlでは違うんだった。 if($input_data ne ""){ }
129 :
125 :04/12/03 14:00:11 ID:???
そんな簡単なことだったんですね^^; ありがとうございました
久しぶりにここ覘いたけど以前にも増してアレなスレになっちゃってますね 昔は参考になるスレだったのに残念です
ここが参考にならなくなったって事は>130が初心者じゃなくなったって事だろ。 めでたいことじゃないか。
132 :
nobodyさん :04/12/03 14:26:10 ID:OybfBlRl
>>82 sub 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"; }
今と昔は普及度が違う
>>131 いいこといった!
俺もここの内容が屁に見えるようになるまでがんばろう!
今は俺にとってここは宇宙です。
135 :
119,132 :04/12/03 14:31:31 ID:OybfBlRl
# 行数が多くなったので、分割 132のdatasort関数の Usage: # datasort(区切り文字, 型, 順序, キー, 配列) # # 区切り文字 ... splitの第一引数 # 型 ... true: cmp, false: <=> # 順序 ... 降順 -1, 昇順 +1 # キー ... キーとなるフィールドのインデックス(0から数える) # 配列 ... ソート対象のデータ # ベンチマーク取ってないけど、(テストも余りしてない) データのsplitが(配列の数)回で済む為、少しは速くなると思う。
137 :
83 :04/12/03 15:31:58 ID:???
>>111 !?空になりますかそうですか。。。
>>115 >>my @new = bogosort([[1,1,0], [1,1,4]], @data);
>の後ろ側、[1,1,4]が効かず、前側の[1,1,0]だけが有効になってしまいます。。
古いPerlのsortは、比較関数が0を返した時に元の並び順が保障されないので
そのようになるです。
というわけでPerlをバージョンアップすべし。
HTML::Templateの質問なんですが。 file_cacheでキャッシュされるのは、何がキャッシュされるんでしょう? templateの構造や内部的なtemplateの解析結果とかがキャッシュされるのだろうか? ページそのものじゃないよね、たぶん。
man HTML::Template によれば、parsed template がキャッシュされるらしい 解析したデータ構造を Storable でシリアライズしてキャッシュしてるんだと思う
>>139 ありがとうございます。よく読んだらperldocに書いてありましたね・・・orz
これでおよそ50%パフォーマンス向上ってんだから、結構時間掛かるんですね。
141 :
82 :04/12/03 17:47:58 ID:???
もうだめぽ・・・自信喪失。 素直に >●先頭から16個目のデータを1次キー、3つ目のデータを2次キーとしてソートする場合 >@address = sort{(split(/,/,$a))[15] <=> (split(/,/,$b))[15] or (split(/,/,$a))[2] <=> (split(/,/,$b))[2]} @address; のように繋げて書く(というか人に使わせる)ようにします。。くすん。。。 また何かありましたら質問させてください。 ありがとうございました。
$a = "&gt;&gt;&gt;&gt;あいうえお。"; このような文字列があるとして、先頭から連続してる&gt;の数を数える方法ってないでしょうか? できるだけ簡潔に書きたいのですが・・・。
>先頭から連続してる&gt;の数 その例だと4つって数え方でいいのか?
>>142 こんなんでどう?
$num = $a =~ s/(?:^|(?<=&gt;))(&gt;)/$1/g;
print $num; # 4
($n)= $a=~ /^((?:>)+)/; $n= length($n)/4;
>>142 my $count = 0;
$count++ while($a =~ /\G&gt;/g);
147 :
145 :04/12/03 21:24:55 ID:???
簡潔さで負けてるので1つにまとめて
$n= length(($a=~ /^((?:>)+)/)[0])/4;
>>144 それだと、 >の連続が後半に再びあったときに・・・
>>143 そうです。先頭から>が幾つ連続してるか、って言い方するべきでした。
>>144-147 ありがとうございます。
>>146 さんのやり方だとそのまま>を任意の文字列への
置換にも使えそうですね。
ああ、\G使うって手もあったか。
&gt;にワロタ
みんな凄いね。考えてたけどサパーリだった。
152 :
144 :04/12/03 23:33:10 ID:???
>>147 >それだと、 >の連続が後半に再びあったときに・・・
なるほろ、そうでつね。指摘サンQ
153 :
nobodyさん :04/12/03 23:36:48 ID:EsHuFZ1r
どうにかしてpackage名に日本語を使用することはできませんか?
154 :
nobodyさん :04/12/04 00:02:39 ID:orEKzBU3
>>153 はじめからutf8でソースを書いてuse utf8するか、
encodingプラグマのFilterオプション使えばいける。
後者の例はたとえば
use encoding 'euc-jp', Filter=>1;
package 日本語;
$変数 = 1;
とはいえ、あまり趣味は良くないね。
155 :
nobodyさん :04/12/04 00:03:00 ID:10+aOFQr
Perl内でSSIと同じ効果得るにはどうしたらいい? <!--#include virtual="****.cgi" -->を使いたい。
156 :
155 :04/12/04 00:04:57 ID:10+aOFQr
多分、ものすごーく簡単なことなんだろうけど、ど忘れっぽい感じ。
157 :
153 :04/12/04 00:17:56 ID:U0vSojEF
>>154 ありがとうございます。utf8ですか。
OSもDBもeucなのでeuc以外では考えていません。ってことは無理なんですね(>_<)
"や'や{などで囲ったり色々してみましたが無理でした。あきらめます。
OSのキャラクタセットは別に考慮しなくてもいいんじゃないか?
>>157 別にDBへの書き出し時にEUCにすればいいんじゃないの?
むしろ重要なのは Perl のバージョンだ
ファイルを読みこんで、上の1行を消して下に現在の時間(time関数の返り値)を追記したいのですが、 配列を使うと行数の数だけメモリを確保してしまって無駄遣いしてしまいますよね。行数は不明です。 配列を使って、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"); また、他に効率の良い方法などはありますでしょうか。 よろしくお願いします。 読み書き共用で開くということもできるらしいのですが、どのサイトを拝見しても詳しい内容が載っていません。 実用的だと思うのですがなぜなのでしょうか。
一行目を読み捨てたらあとは read で読んだほうが速いと思う。 で、rename するので unlink は不要かと。 <R>; while (read(R, $buf, 10240)){ print W $buf; } print W time; close(W) and rename("file2.txt", "file.txt");
164 :
161 :04/12/04 17:43:46 ID:???
>>162 参考になりました、ありがとうございます!
165 :
nobodyさん :04/12/05 14:39:51 ID:hMog6IUx
lwp::simpleを使ってwebサイトの更新時間をしらべるスクリプトなんですが更新時間を取得できないページがあります 取得したいのですがどうしたらいいのでしょうか 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秒 更新
166 :
nobodyさん :04/12/05 14:50:04 ID:eDMBo65d
Perlを始めたばかりの初心者です。 Shift_JISで作っていこうと思います。 ダブルクォーテーションの中で一部の日本語(「表示」など)が文字化けする問題について 知りたいのですが、どういう時に文字化けするのかがよく分かりません。 なぜフォームから受け取る時には文字化けしないんですか? 分かりにくかったらすいません・・・。
>>165 > 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.
フォームからはURLエンコードされて送られるでしょ。
170 :
166 :04/12/05 15:49:18 ID:???
何となく分かりました。 ありがとうございました。
HTMLファイルからフォームを使ってCGIにデータを渡したいのですが、 HTMLファイルをShift_JISで書いていれば送られるデータはShift_JISだと期待してもよいのでしょうか。
>>165 HEADメソッドでだめならGETメソッドを使ってヘッダから取得。
LWP::Simpleではヘッダ部が取れないから、
LWP::UserAgent使うことになると思う。
>>171 一部のブラウザにはeuc-jp固定で送信するものがあるという話。
>>165 全てのサイト/ページが更新時刻を返してくれるわけではない。
特にページがCGIなど動的に生成されていたりすると、
更新時刻という概念自体が無かったりして、Date も Last-Modified も返さないことが良くある。
そういうときは、諦めるしかない。
174 :
nobodyさん :04/12/05 23:57:35 ID:mQuG6gLO
馬鹿は100人集まると100倍馬鹿になる
10000倍では?
MLDBMを使ってデータの書込みを行っているのですが、データを書き込んでも ファイルが生成されません。 サーバは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; }
>>177 とりあえず、tieに or die $!つけてどうなるかみるのが基本じゃないかな
再帰処理でディレクトリ一覧を表示する処理について質問です。 # とりあえずお気に入りの一覧ということで &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レスに分けます、
要するに、 aaa.txt bbb bbb.txt ccc ccc.txt ddd.txt このように表示されてしまいます。 これを、まずはディレクトリとファイルでソートして、 そこからファイル名でソートさせたいと思っているのですが、 ディレクトリかファイルかでソートするにはどのように記述したらいいでしょうか。 上の例で言いますと、 bbb bbb.txt ccc ccc.txt aaa.txt ddd.txt このような表示順序にしたいと思っています。
>>178 有難うございます。
どうやらtieが死んでいるみたいです。
エラー内容はサーバ管理者不在で見れませんが、、、、
>>181 CGIならCGI::CarpのfatalsToBrowser使うとかいろいろやりようあるだろ
FILE::find使った方が楽そうな気が・・・
はにゃーん
>>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
foreachの手前でそうなるようにソートしときゃいいんでねーの? 例えば: 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;
はにゃーん
>>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
}
# つづく
# 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. 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); }
>>179-180 # コードは試してないけど、
まとめてソート
sort { (-d "$dir/$a" <=> -d "$dir/$b") or ($a cmp $b) } @files
ループをディレクトリとファイルに分ける
grep {-d"$dir/$_"}@files
grep {-f"$dir/$_"}@files
>>183 File::Find はソートしてくれないよ。
>>188 >>179-180 です。<OPTION>で選択するファイル一覧を作っていました。
@files = sort { (-d "$dir/$b" <=> -d "$dir/$a") or ($a cmp $b) } @files; でやりたいことが出来ました。ありがとうございます。
190 :
nobodyさん :04/12/06 16:57:38 ID:kMJjfrXb
ぬるぽ
191 :
nobodyさん :04/12/06 16:58:07 ID:kMJjfrXb
誤爆ですた
192 :
nobodyさん :04/12/06 17:03:05 ID:adgUx9sV
>>193 の発言中に、一部不穏当な表現のあったことをお詫びいたします。
>>193 の発言中に、一部不穏当な表現のあったことをお詫びいたします。
漏れが「phpがでたらビターーーン」スレと間違えたせいだ 正直スマンカッタ 今は反省している
199 :
nobodyさん :04/12/06 23:45:58 ID:PVGalzLM
テキストファイルをopenして表示させるのと Socketにより他サーバーから読み込み表示させるのとでは どの程度サーバー負荷は高まるものなのでしょうか?
200 :
nobodyさん :04/12/07 00:27:16 ID:J98ZOjsq
perlでプログラミングをしたときのデバッグの方法はコメントアウトして 実行して・・という風な方法しかないのでしょうか 一度perlでcgiの短いプログラム(50行ぐらい)を作ったことがあるんですが、 こんな短いのでもバグをとるのにすごく骨を折りました。
>>200 好きなのを選べ
っ【Google】
っ【検索ワード】
っ【Perl】
っ【デバッグ】
>200 二分検索法って知ってるかい? アルゴリズムってのは、なにもプログラムを組む時にしか使えないものじゃないぞ。
>>200 そうか?エラーメッセージを読めばどこが悪いかなんてすぐ分かるが。
まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
204 :
200 :04/12/07 15:33:29 ID:???
>>201 文法チェックはブラウザ上でソースを入力するとやってくれる
サイトがあったんで、それを使っていました
(cygwin?がうまくインストールできなかったってのもあります)
コマンドでデバッグをするのと違いはあるんでしょうか
>>202 どんどんせばめていけばいいんですね
>>203 >まさか500エラーが出なくなるまで闇雲にいじってんじゃないよな?
そのとおりです。なんで500エラーがでるのかが分からなくて
どこも修正してないに、何回も実行してみたりして・・
結局原因のひとつはcgiのファイルのパスをフルパスで書いてたのが
いけなかったんだと思います。ほかにもあったけど少し前なんで忘れてしまった。
>>204 マジレスしてやるから帰ってな。
Perlいれてローカルで動かせ
206 :
nobodyさん :04/12/07 15:51:19 ID:9tRllW3i
みなさん、唐突ではありますが、 きれいなコード書いて公開してる人のURL教えてください!
208 :
nobodyさん :04/12/07 16:27:59 ID:9tRllW3i
>206 んーと、コードが載ってませんね。 きれいなコード見て、学びたいので、 そういう感じでお願いします。
>>206 www.cpan.org。どれがきれいかは知らんがたくさんあるので
いくつかはあるだろ。
私もどれが綺麗か分からないのでご質問させて頂いているんです。。
211 :
200 :04/12/07 17:38:09 ID:???
>>205 コードはインフォシークの無料HPスペースにアップロードして
実行しています。最終的には動作させることができました。
>Perlいれてローカルで動かせ
意図がわからないのですが、これをするとどんな利点があるんでしょうか?
アップロードして実行するのも慣れてくると短時間でできるので。。。
>>211 Perl の吐くエラーメッセージを読める
ひょっとして、Perl が行番号入りでエラーメッセージを吐いてくれる
ということを知らなかったりする?
>>211 もし仮に
while (@hoge) {
処理
}
と書こうとして @hoge を $hoge と書き間違い、さらに $hoge に何かしら文字列やら入ってたら
無限ループ作っちゃうでしょう。
それを鯖にUPして実行したら鯖に負荷がかかりっぱなしになる。
鯖が落ちたら君の責任。共有鯖なら鯖会社だけでなく他の鯖利用者にも迷惑がかかる。
ローカルなら君のPCに負担かかる。君だけが被害を受けるが全て君の責任。
どっちがいいよ?
215 :
nobodyさん :04/12/07 18:29:20 ID: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{ "携帯電話以外のメールアドレスとして処理" } としてみたのですが、どうも上手くいきません。 (何のアドレスを入れても携帯以外のアドレスとして処理されてしまいます。) 何が間違っているかどなたか教えていただけますでしょうか。 よろしくお願いします。
216 :
215 :04/12/07 18:41:14 ID:???
すいません、215です。 処理が逆になってました。 (携帯外メルアドでも携帯メルアドでも同じ処理になってしまうので大差ないんですが。) よろしくお願いします。
はにゃーん
$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/ )
218 :
215 :04/12/07 18:56:42 ID:???
>>217 JAPUさん
迅速で的確なレスありがとうございました。
希望道理のCGIが実行できました。
入門書や教えていただいたURLにも早速行って勉強します。
本当にありがとうございました。
パーラーなら $nb=~ m!\@(?:docomo|ezweb|vodafone)\.ne\.jp$!i
…などと書くのは恥と思え
あ,書名微妙に違ってました。 「初めてのPerl」が正解。 どうも最近「はじめての」と平仮名で書く習慣が… # There's more than one way to do it.
222 :
nobodyさん :04/12/08 04:01:02 ID:CFZe8E7O
@{+shift} の処理内容がどうしても分かりません。 記号ばっかで検索もできない…
>>222 @{shift};
ソフトリファレンスと解釈される。
# use warningsで曖昧と指摘される。
@{+shift};
+は変数名に使えないから、@{+shift()}と解釈される。
@{shift()}と等価。
訂正 ×ソフトリファレンスと解釈される。 ○@shiftと解釈される。
まぁ@{+shift}はワケワカランわな。 @{shift()}または@{shift(@_)}が無難。
226 :
222 :04/12/08 20:32:23 ID:???
>>223-225 ありがとうございます。
+{ hash_ref } とか {; block } とかと同じような原理だとは思ったんですが、
どうしても探し出せなかったので助かりました。
UTF-8の文字列処理で躓いてます。
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をインストールしないと無理でしょうか?
>>227 勝手にインスコロールして use lib しる!ってレスが返ってくる悪寒。
>jcode.pmをインストールしないと無理でしょうか? この時点で、まだ何もやってないのに質問してる教えて君ってのが丸出しだな
Jcode.pmってpure perlだっけ。
そりゃ共用鯖で実験するのはヤバいだろ。
はにゃーん Unicode 絡みは XS でかかれていますが,Pure Perl の環境でも動作するよう Jcode::Unicode::NoXS が用意されています。 実際にはユーザが意識することは無く,自動的に Jcode::Unicode or Jcode::Unicode::NoXS が読み込まれるので安心です。
LWPのPurePerlが欲しいのは俺だけじゃないはず
>>234 車輪の再発明は感心できないが、今回はそれに該当しないので許可する。
君が書きたまえ
以下のようなファイルからdtの部分とdlの部分だけ切出したいのですが、 複数行にわたっており正規表現のやり方がわからなくて困っています。 どのようにしたら、取り出せるでしょうか? <dl> <dt>title1 <dd>aaa<br> bbb ccc <dt>title2 <dd>aaa<br> bbb<br> ccc </dl>
237 :
236 :04/12/09 20:30:31 ID:???
こんな感じでやりたいのですが、複数行が取り込めません... よろしくお願いします。 $i = 0; while(<>){ if(m/<dt>(*.)$/){ push($dt[$i]); } if(m/<dd>(*.)$/){ push($dd[$i]); } }
フラグ立てれ
239 :
236 :04/12/09 21:41:05 ID:???
フラグを立てればできそうな気がするのですが、具体的には どのようにすればいいかが浮かばないです... 2個目の<dt>または</dl>がくるまで読み込んで、そこでフラグを 立てて... すると一組目の<dt><dd>セットまでしか読めないし... ??
こう? push(@{$1}, $2) while m#<(d[td])>((?:(?!<d[td]>|</dl).)+)#gsi;
241 :
236 :04/12/09 22:21:16 ID:???
>>240 ありがとうございます。1行でできるなんて思いませんでした。
<dt>aaa
bbb
ccc
<dd>ddd
eee
fff
となってる場合、行にまたがってる部分、bbb,ccc,eee,fffが取り込まれ
ないようです...
この一行を理解しようと頑張ってみましたがムズカシすぎました。
複数行にわたるのでやっぱりフラグが必要ですかねぇ...
>>233 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をそのまま実装してるみたいだね。
と、思ったら、0x2140 (\)は U+FF3C (FULLWIDTH REVERSE SOLIDUS, \) になってるなぁ。
>>242 おお、なるほど。ASCIIの範囲はそのままになるように
してる関係で0x2140(\)を0x5cにしちゃうと、もとから
0x5cだった場合と区別つかなくなって不便だからあえて
変えてるんだろうね。
世の中この変換表だけだったらすっきりしたんだろうけど
なぁ。
>>241 $_ にすべての行を取り込んでいます?
{ 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);
}
それぞれの修飾子についてはマニュアル等にて熟知すべし。
Perlは書けるが、正規表現が苦手な第三者からすると、
>>240 や
>>245 を見て、俺もまだまだだなって思った。
詳説読むか
正規表現は奥が深い。 深すぎるけどね。
ttp://www.din.or.jp/~ohzaki/perl.htm#Tag_Remove Perlメモのタグの削除について質問です。
こちらのページでは「$str には HTML文書全体を入れておきます」と書かれていますが、
open (DATA, "<index.html");
@line = <DATA>;
このようにして読み込んだ場合、一行ごとに分けられて配列に入れられますよね。
どのようにして$hensuにHTML全体を格納するのでしょうか。
現状では、HTMLを配列に入れた後で
$data = join ("", @lines);
などとして、一行にまとめているのですが。
{ local $/; $data = <IN>; }
>>248 read DATA, my $data, -s DATA;
>>250 レス感謝です。ファイルハンドルに対してもreadや-sが使えるのですね。
試してみたところ、期待通りの動きをしてくれました。
248への回答と思ってもらえなかった249が哀れだな...
やべ、ワロタw
コーディングとは違うので、微妙にスレ違いかもしれませんが失礼します。標準モジュールが一切利用不可のサーバーを使ってます。 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のファイルをアップしていけば、使えるものなのでしょうか。
>>254 そもそもファイルを置けるのなら置いた場所を適切にuse libして
やればあとはそのままいけそうなものだが。それともuse機能自体を
つぶすような改造入ったperlなのか?
>標準モジュールが一切利用不可のサーバー 鯖変えれ
useが使えないって事は無いだろ。 Net::SMTPに関連する.pm全てそろえてからuse libすればいいんじゃね?
>>254 use libとかはプラグマなはずだけど。
lib.pmもなくて使えないとしたら @INC で代用。
pathさえ通せばrequireにする必要ないよ。(requireする場合だとimportも必要)
多重代入ってできないですか? ($a,$b,$c)=@hoge[1,3,5] とかやってもだめでした
% perl -e '@hoge=qw(a b c d e f); ($a,$b,$c)=@hoge[1,3,5]; print "\$a=$a \$b=$b \$c=$c\n";' $a=b $b=d $c=f できるけど?
261 :
259 :04/12/10 16:04:27 ID:???
すいません、ホントは多重配列でした ($a,$b,$c)=@hoge[0][1,3,5] ができず
262 :
nobodyさん :04/12/10 16:17:39 ID:tDYU+a6s
今までずっとソースのコードはEUCで統一していたのですが、 プロジェクトマネージャが変わった関係で、ソースは全てSJIS に統一しなければならなくなってしまいました。 今までは、出力はSJISに変換してSJISのページを出し、そこからの 入力はまず全てEUCに変換し、処理を行っていたわけですが、 SJISに変更となると、一見変換処理は必要なくなって楽になるかとも 思えますが、SJIS特有の問題(「表」の文字等の)もあるので、入出力 時にこれだけは必ずやっておけということがあればご教授いただきたい 次第です。 個人的対策としましては、フォームからの入力を全てハッシュに入れる 段階で、今までは $form{name} = 入力値 としていたものを、 $form{name} = quotemeta(入力値) にすることによってなんとかなるん じゃないかと安易に考えております。
ここはコーディングスレだよな。
$ perl @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 リファレンス、デリファレンスがわかってないだけ
265 :
259 :04/12/10 17:08:40 ID:???
ありがとう 精進します
>>262 入力をquotometaしてもほとんどどうにもならない。ソースコードの中に
出てくる「表」とかがやばい。というあたりを理解してないあたりで、
たぶんはまるだろうな。合掌。
まあperlのソースをSJISにしようというあたりで終わってるので、不運だ
と思ってあきらめなされ。
いっそ5.8以降にしてuse encoding 'Shift_JIS'で内部処理は全部unicode
にするのがいいかも?
quotemetaしてもあまり意味内ような。
>>262 EUC-JPのコードに依存した処理を探した方がいいかも。
案外ありそう。
正規表現とかでマッチ対象にする場合はquotemetaした方がいいと思うけど、 それがSJISに起因する問題の根本じゃないし。
SJISに移行すること自体が間違い。
sjisからeucへ移行ってのは良く聞くが、逆は聞いた事無い。っつーか正気? 正直、問題がある部分個別に対応するってのがFAかと。 一発でこうすりゃ大丈夫なんて解決策があったら、そもそも問題にならない。 そのプロジェクトマネージャーはきっと馬鹿で、PCと同じエンコードにした方が 作業効率が上がると思ってるんだろう。
そんな馬鹿がよくPMやってられるもんだ。 プロジェクトの敵は文字コードでもなく、バグでもない。 馬鹿なマネージャーの無意味な口出し。
とはいえ馬鹿なマネージャを説得するよりはまだ バグと格闘した方が楽だったり...
時間の無駄だね。 一生フリーター気分ならそれでもいいだろうけど。
まあ5.8にしてEncode使うのがいいんじゃね? それはそれで問題出るんだけど。〜とか。
メタキャラが解釈されてプログラムが異常終了するよりはマシ。
perlはunicodeとsjisのマッピングに問題ある?
>>277 perl特有の問題というわけではなく、そもそもunicodeとsjisの
マッピングに問題があるというべきだな。既存の文字コードに
対してちゃんと変換表を決めなかったので複数並立してわけわか
というのが現状で解決の見込みほとんどなし。
>>233 のリンク先読んでみ。
>>278 サンクス。
javaだとSJISだったりMS932だったりフラフラしてて「どっちだよオイ!」
って時期があったんだが、perlはどうなのかと思った次第でした。
みんなstrictで書いてる?
使い捨て以外(= まともにメンテする予定)だと use strict は常識的だと思ってます。 下請けに出すときは,use strict パスしないと一切認めない(no strict は原則不可), -w で警告つぶせ,が条件でした。 # なので,出せるところがかなり限定されてしまったのですが。 -- > useが使えないって事は無いだろ。 実はPerl4 (ギャー
perl使いってperl使いのクセにこだわる奴は妙にこだわるよな 俺もそれ気味だけど
strict,-w,carp、全部リリース時は外すんだが、そんなもん? あくまでデバッグ用。Cのassert()に近い感覚なんだが。
あー、でもstrictはともかく、-wとかwarningとかfatalsToBrowserとかが ネット配布スクリプトにあるとちょっと萎える。
CGIでの事なのだけれど、 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で殺してエラー表示するのってやめた方がいいかな?
286 :
262 :04/12/11 03:33:34 ID:???
皆さん、助言感謝です。 とりあえずまずやることをまとめてみました。 月曜日にプロジェクトマネージャを説得してみます。
287 :
nobodyさん :04/12/11 07:30:08 ID:tdpIuDpB
perl OLE で EXCEL のセルを取得すると 日付のところが Win32::OLE::Variant=SCALAR(0x19e99fc) となってしまいます これを元の H16.12.9 の文字列に戻すにはどうしたらよいのでしょうか?
289 :
nobodyさん :04/12/11 08:47:42 ID:tdpIuDpB
>>288 use Win32::OLE::Variant; すると
普通に 2004/12/09 の文字列が取れるようになりました
元号はこの際どうでもいいです。
どうしても必要なら2004から16に変換します。
use strict; でundefな変数参照の警告が鬱陶しい。ヒアドキュメントに埋め込むときは特に。 みんなどうしてる?
291 :
nobodyさん :04/12/11 13:18:29 ID:i36zMpTH
jcode.plにバグがあってsjisに変換できないのですが、 どうしたらいいのでしょうか?
・・・・・・。 バグだと思う個所を修正してcontribすれば?
293 :
291 :04/12/11 13:25:27 ID:???
>>292 ええっ!?
俺がライブラリを弄るんですか!?
294 :
291 :04/12/11 13:30:20 ID:i36zMpTH
検索したら、バージョン2.xxだとそういうことが起こるらしいんです。 バージョン1.xxならば解決されるらしいです。 そこで1.xxの最終バージョンを入れてやってみたのですが、エラーの量が増えましたorz
295 :
291 :04/12/11 14:18:27 ID:i36zMpTH
ちゃんとしたjcode.plを配布しているサイトはありませんでしょうか? さっきオフィシャルページからダウソしたやつにはなぜかHTMLタグが入っていました。 HTMLタグを削除してもエラーの個数は変わりませんでした。 もう俺の手元にあるjcode.plはわけがわかりません。
>>291 もまいの方がわけわからん。もまえが思うバグの内容も書かずにどうしたらいい?とは何様のつもりだ。
298 :
291 :04/12/11 14:49:05 ID: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が欲しいのですが・・・
ここはコーディングスレ
300 :
291 :04/12/11 14:56:04 ID:i36zMpTH
>>299 すいません、どこで質問すれば教えてもらえますか?
そのエラーでバグ呼ばわりされるjcode.plもかわいそうに・・・ ウザいから終わらせてやる。 jcode.plではなくスクリプトのせい。 作者に聞け。
302 :
291 :04/12/11 15:05:44 ID:???
>>301 俺のスクリプトですか!!!???
でも、それが分かっただけでもOKです。
ありがとうございます、スクリプトを弄ってみます。
>>290 undefな変数参照の警告って
Use of uninitialized value in string at 〜
ならそれはstrictじゃなくてwarnings(または
-wオプション)で出てるものだよ。
普通に書けばはじめから出ないようにできる
と思うけど、どうしてもうざければなるべく
狭い範囲をブロックで囲んで
{
no warnings qw(uninitialized);
...
}
ですかね
defined使えばいいんでないの?長くなるけど。
>>303 それっす。
-wとusr strict;は常に使えとしつけられたので...
HTML::Template使うと良く遭遇した気がします。(最近perlでの開発から離れてるから忘れ気味)
306 :
nobodyさん :04/12/12 21:09:08 ID:LYqEO+UH
$hoge = "aaa<br>IMG=img/hoge.jpg<br>bbb<br>ccc<br>IMG=hoge.jpg<br>"; ↓ 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」までいっちゃいます。 教えてください。
>>306 $hoge =~ s/IMG=([^<]+)/<img src="$1">/g;
308 :
306 :04/12/12 23:13:37 ID:???
おみそれしました。
309 :
nobodyさん :04/12/13 01:12:16 ID:UkWYfRd/
>>309 >1: 自分はこういう事がしたい。
>2: それでこんな風にやってみたが・・・
>3: こんなエラーが出て上手く行かなかった。
311 :
309 :04/12/13 01:54:21 ID:UkWYfRd/
>>310 すいません。
>1: 自分はこういう事がしたい。
2バイト文字(Shift_JIS)をパターンマッチさせたい
>2: それでこんな風にやってみたが・・・
テンプレのサイト([テクニック])を見てもよく分からなかったので自分で検索して、
このページが出てきたので書いてある通りにやってみた
ttp://mind.f.fiw-web.net/program/perl/tips0502.html >3: こんなエラーが出て上手く行かなかった。
エラーは出てません。。
一致したら変数に1が入るようにしてあるのですが、それが入らないんです。
1byte文字ならマッチしたときにちゃんと1が入ります。
>>311 そのサイトコピペしてやったけど普通にできるが。
eucでマッチしなくてsjisではマッチしたことを確認したよ。
>>307 に補足しておくと。
Perlの正規表現では繰り返し("*", "+") を指定するとなるべく長くマッチしようとします。
なので,
1. "*?", "+?" などの最短マッチ
2. [^<]* のように文字を限定
のいずれかを使用する必要があります。
寝よう…
最近ようやくモジュールというものを覚えてきたのですが、例えばNet::SMTPなどを使用する際に、 use Net::SMTP; $smtp = Net::SMTP->new('mailhost'); $smtp->mail($usr); $smtp->to('postmaster'); などと記述しますが、 この場合の$smtpというのはインスタンスのようなもので、 上記の場合のmailやtoというのは、引数を指定した関数呼び出しということでしょうか?
モジュールの中身見てみれ この場合だとSMPT.pmな サブルーチンでmailとかtoとかdatasendとかあるから
316 :
309 :04/12/13 11:10:21 ID:rJW07thI
>>312 コピペでやってみましたができませんでした。
検索対象の文字コードと、検索語句の文字コードはどちらもsjis。
出力して確認してみたのですが、
双方とも同じ文字列かつ、同じ文字コードであるにも関わらずパターンマッチしません。
関係あるか分かりませんが・・・
検索対象の文字列はサーバー側に保存してあるデータを取り出し、
それをsplitで区切って準備しています。
その文字列は保存する際にsjisに変換して保存しています。
検索語句の文字列はブラウザから入力された文字列をCGI内部でデコードし、
jcode.plを使用してsjisに変換しています。
>>316 とりあえず再現する最小コードをカキコ汁。
318 :
309 :04/12/13 13:32:52 ID:rJW07thI
>>317 これです。
最小コードで、コマンドラインから確認しました。
#!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;
2byte文字の正規表現は (?:[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]) ではないかと。
320 :
nobodyさん :04/12/13 16:29:18 ID:hnMBax6X
現在perlでWEB作成をしておりますが sendmailでつまづいております。 if (!open(MAIL,"| $sendmail -t $to")) { return(1); } ユーザが入力したメールアドレス($to)に不正なアドレスが 入力されるとsendmailでエラーを吐いて、落ちてしまいます。 (Invalid host name・・・・) メールアドレスを正規表現を使って全てチェックするのが 困難なのでsendmailのエラーをキャッチしたいのですが 無理なのでしょうか?
$!
>>320 Email::Valid
Email::Valid::Loose
322>> ありがとうございます。 携帯(docomo等)でも受け付けるため Email::Valid::Loose を使用するということまではわかりました。 少し試してみます。
>>322 ところで・・・sendmailのエラーをそのまま
キャッチする方法はないのですか?
無いなら、無いで結構です。
調べてもなかったので気になったもので・・・。
ここで質問する内容にあってるかどうかわかりませんが・・・ 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
>>325 DBI だけでなく DBD::mysql が必要。
ただし DBD::mysql は xs モジュールなので、mysql.pm を置くだけでは動かない。
make する作業が必要 (Cコンパイラ必須)。
328 :
327 :04/12/13 18:23:53 ID:???
>>327 訂正。
s/capture_STDERR_from/open_a_pipe_both_to/;
329 :
325 :04/12/13 18:33:18 ID:???
>326,>327 回答ありがとうございます。 DBD::mysqlのコンパイルにチャレンジしてみます。 ちなみにCPANからのモジュールインストールはやってみたんですが、 「モジュールインストールは許可していません」ってレンタル鯖業者から怒られましたorz
>>318 if ($word =~ /(?:$sjis)*?\Q$s\E/){
クォートメタを忘れずに。
型は\x8c\x5eというコード。
\x5eこと"^"は正規表現の先頭にマッチだから、
マッチすることなく常にNGとなる。
>>54-58 あたりを参照。
332 :
nobodyさん :04/12/13 23:51:01 ID:a6u3bRjN
DBI DBD::mysql つかって MySQLサーバに問い合わせするとき スクリプトがMySQLサーバに送信するデータの漢字コードってどうやって決まるの? 多分MySQLサーバに接続するときに、このキャラクタセットを使いますよって言ってる と思うんですけど、そのキャラクタセットはどうやって決められてる?
ちょっと思いついたんですが、SJISで全角数字を半角にするには、 $num = "20041214"; $num =~ s/[\x82]//g; $num =~ tr/O-X/0-9/; こういうのって何か問題あったりしますか? 0x82はSJISの2バイト目にも現れないようなのですが、他にいい方法があったりしますかね。
>>325 すなおにPHPの使えばいいんじゃないの
SJISって/0-9/みたいな指定ってできたっけか &jcode::tr (\$value, "0123456789", "0-9"); これで動かない?
>>334 $numがSJISの数字のみからなる文字列と保証できるなら
それでいけるだろう。
でもSJISは何かとperlでは扱いにくいので避けたほうが
いいと思うけどな。入り口出口で変換して内部はEUCが
楽だと思う。
unicodeが日本語についてあんなに変じゃなけりゃ5.8
以降でunicode使うともっと楽だったんだろうけどね。
338 :
nobodyさん :04/12/14 14:14:33 ID:XUzVLI8W
LinuxのPerl(ver5.005_03)にて、あるファイルを定期的に解析し、結果を ========================= ・・・・・・・・ ・・・・・・・・ 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」です。 スクリプトに問題がありそうということでしたら、 詳細の内容を記載させていただきます。 よろしくお願いします。
なぜ出力ファイルが644なのか教えてもらおうか
340 :
338 :04/12/14 14:26:55 ID: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の質問じゃないみたいになってしまいました、すいません
341 :
338 :04/12/14 14:30:57 ID:XUzVLI8W
>>339 所有者(root)の書込み権限があれば良いと思い
「-rw-r--r--」
と設定してます
コンソールから実行できて cron で実行できない場合にまず疑うべき項目としては 1. 実行権限に問題は無いか 2. スクリプトや入出力先をカレントからの相対パスで指定していないか
>>338 open(OUT,">>log.csv");
実際のソースにもスペースあんのか知らんが・・・
log.csv がフルパスじゃないじゃん
345 :
338 :04/12/14 15:06:20 ID:XUzVLI8W
>>342 解決しました!
> 2. スクリプトや入出力先をカレントからの相対パスで指定していないか
が原因でした。
open(OUT,">> log.csv"); の部分を
open(OUT,">> /フルパス/log.csv");
とすることで目的の動作を行うことができました。
基本的なミスで、板汚し申し訳ございませんでした。
でもとても参考になりました。ありがとう!
- - - - - ここまでは、ご覧の釣堀の提供でお送り致しました - - - - -
openの戻り値ぐらいはちゃんと見ろよな
>>334 文字列に数字以外が混じると嫌だから、もうちょっと安全に書くかな。
(規格上は\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;
とかが効率良さそう。
349 :
nobodyさん :04/12/15 00:07:10 ID:8kSVNViR
Encode::from_toでsjisからeucへ変換して使用しているのですが、旧漢字などの 場合に文字化けしてしまいます。 この場合に、文字化けしたかどうかを調べるにはどのようにしたら良いのでしょうか?
350 :
nobodyさん :04/12/15 09:24:08 ID: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";
351 :
nobodyさん :04/12/15 09:29:58 ID:8kSVNViR
\@list
352 :
350 :04/12/15 10:02:46 ID:3pwV+643
>>351 解決しました!ありがとうございます!
すみませんがもうひとつ質問させてください。
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行にするしか方法がないのでしょうか。
もうちょっとスマートな定番の方法があったら教えてください。
>>352 @{$this->{list}} = localtime();
これと352の下の2行は意味が違うのに注意。これは
$this->{list}に入っているリファレンスが示す配列の
中身を置き換えるが、352の方法では$this->{list}を
新しく作った配列へのリファレンスで置き換えること
になる。
354 :
350=352 :04/12/15 11:13:34 ID:3pwV+643
>>353 ああ、なるほど。意味はわかっていました。
中身を書き換えたかったんです。リファレンスの置き換えは苦肉の策でした。
自分では、
@($this->{list}) = localtime();
ってのも試してましたがエラー。カッコの種類が違ったんですね…。
ありがとうございました!ほんと助かりましたです。
基礎浅杉
$test =~ s/\x0D\x0A|\x0D|\x0A| | //g; の最後の全角スペースがどうやら引っかかっていない みたいなのですが、全角文字は違った表記で書かなくては ならないのでしょうか。 ご教授いただけると有難い次第です。
>>356 Perlメモ見れ
文字コードがなにかわからんけど、全角文字のマッチでバグるパターンがある
>>357 全角スペースは(?:\x81\x40)で表現しなきゃいけなかったんですね。
勉強になりました。
有難うございます。
360 :
nobodyさん :04/12/15 20:07:39 ID: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番の方がよさそうに見えていたのですが。 現在、ローカルでしかテストできる環境がないため、 実動作でも有効なのでしょうかご教授下さい。
>>360 必要なものだけ入れれば? いや、ログが膨れ上がったりしないのならいいが
> 現在、ローカルでしかテストできる環境がないため、 > 実動作でも有効なのでしょうかご教授下さい。 (´-`).。oO(何のためのローカルテストなんだろう)
Winのローカル環境とほぼ同じと思っていい?
364 :
nobodyさん :04/12/15 21:55:29 ID: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です。
>>364 私のところでは問題ないけど。
二行目にこれを入れてみそ。
use CGI::Carp qw(fatalsToBrowser);
367 :
364 :04/12/15 22:39:07 ID:???
>>365 回答ありがとございます。
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.
369 :
364 :04/12/15 22:53:50 ID:???
>>368 ごめんなさい。ちゃんとインストールされてませんでした。
ご迷惑をおかけしました。
…ところで、*.pmを扱うのは初めてなのですが
*.plの場合は*.cgiがあるディレクトリに置いておくだけで
動作しましたが、*.pmの場合はインストールしないと
動作しないのでしょうか?
無料ホスティングサービス等を利用する場合に
自分が希望する*.pmが無い場合は、どうすれば良いのでしょう?
371 :
364 :04/12/15 23:06:50 ID:???
>>370 なるほど、鯖管じゃないと*.pmのインストールは
できない訳ですね。
>>329-330 等を見てる限り
自分の望む*.pmが、鯖にインストールされて
なければ、使えないって考えた方が良さそうですね…
色々とありがとうごさいました。
>>371 Jcodeは自分の好きな場所において use libすれば使えるが。
>>371 インストールが必要なものと置くだけで使えるものがあるのだよ。
とりあえずCPANか何処か行ってJocde一式拾って来い。 アーカイブの中身で必要・不要の判断がつかないなら全部そのままサーバの好きな場所にぶち込め。 で、use lib "ぶち込んだディレクトリ";とやってからuse Jcode;だ。
>>309 の
/(?:$sjis)*?$s/ に x 修飾子が無いけど。
376 :
nobodyさん :04/12/16 00:14:20 ID:jXnHIVD7
変なクソコテが沸いてるから晒しage
377 :
nobodyさん :04/12/16 01:29:55 ID:B5pcTDRp
あるカンマ区切りのテキストの文字列を1つづつ100個ランダムに呼び出して、 htmlに表示したいのですが、 その際常に10番目には同じ文字列を表示させたいのです どのように書けばいいのでしょうか
>>359 助言感謝です。
これを回避するのはちと難しそうですね。
ちょっと考えてみます。
>>374 最近pmのカスタムインストール地獄からご無沙汰だったが、そういえそんな感じだったな。
何か懐かしい。
>>377 foreach(0 .. $#ARRAY)
>>377 10行目に10番目の要素を表示したいのか、
10行目に特定の文字列を表示したいのかでちょっと変わる。
1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
383 :
nobodyさん :04/12/16 14:55:31 ID:kPNHSAIc
CGIから正規表現を受け取ってマッチに与えたいのですが、 セキュリティ上何に気をつけたらいいですか?漠然としていてすいません。 とりあえずtaintモードで、use re 'eval'は宣言してません。
>>383 バックトラックを大量に発生させてCPUを消費させること
ができるかも。
385 :
nobodyさん :04/12/16 16:35:35 ID:ZCA0MXpE
>>384 なるほど、それはまったく考えてませんでした。
バックトラックを大量に発生させる正規表現の検出なんて
思いつきません_| ̄|○
自鯖なので、ちょっとの負荷ぐらいならいいのですが、
タイムアウトさせることにします。
CGI::Sessionを使用してセッション管理をしているのですが CGI::Sessionはセッションの有効期限があり、有効期限を 過ぎるとエラーになるまでは良いのですが、有効期限が 切れたセッションデータ(ファイル)がディレクトリに無限に 溜まっていきます。 ユーザーがログアウトするなりして、セッションを閉じれば 消えるのですが、ブラウザを閉じられたりするとセッション を消すタイミングがわかりません。 これらの有効期限切れのセッションデータは、どのように して削除すれば良いのでしょうか?
>>386 CGI::Session::ExpireSessions
>>387 ありがとうございます。
…しかし、ファイルが消えてくれません。
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 );
どこか、間違ってる所はあるでしょうか?
>>388 examplesにある例もそんな感じだから、動きそうなもんだけどね。
verboseを1にしてるからなんかメッセージでてないすか?
ありがちな間違いとしては、カレントディレクトリが適当でない
(temp_dirが相対パスなので)か、実行するユーザが適当でない
あたりかと。
>>389 ごめんなさい。消えました。
原因はセッションファイルの頭に付く'cgisess_'を
変更してた為でした。ExpireSessions.pmの中の
'cgisess_'を同じように変更したら、うまく動きました。
どうもご迷惑をおかけしました。
>>377 ループを0〜8と10〜99に分けるとか
ループの中でif分噛ませるとか
配列に入れといてあとから[9]を上書きするとか
392 :
nobodyさん :04/12/18 00:47:15 ID:l7mnvpO6
timelocal に無効な日時を渡すとエラーになりますが、 timelocal 内のエラーメッセージを表示させずにエラーを検出し、 自分で定義したエラー処理を行いたいのですが、どうすればいいでしょうか。
>>392 エラーが返ってきたら好きな処理すればいいだけだろうが。
>>392 my $t = eval{ timelocal(0, 0, 6, 18, 12, 104) };
$@ and print "エラーですな $@";
395 :
392 :04/12/18 16:45:30 ID:l7mnvpO6
>>394 おお!できますたよ。ありがとうございます。
396 :
nobodyさん :04/12/18 22:25:58 ID:Zy8umN1o
そういえば、今日はPerl の17歳の誕生日だな。 誕生記念age
ここでPerl娘のAAキボン
_,,,,,,,---,,,,_ . ,,-'''~;;;;;;;;;;;;;;;;;;;;;;~'-_,,,,_ . /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~ヽ, . /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;;;;;;;;;;;;;;ヽ /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;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
(⌒∨⌒)/::"\ (⌒\:::::::::/⌒(⌒∨⌒) ( ̄>::( ゚Д゚)<(⌒\:::::::/⌒) ( ̄/:::::::: (_>::( ゚Д゚)::< /((⌒∨⌒(_/U::U\__) / (⌒\::::::::/ (_∧_)`∨⌒) 、@, <(__>::( ゚Д゚)::<__し//J\::::::/⌒;@@^ |ヽ(_/::::::::\_)(_>::( ゚Д゚).つ|/` | ヽ. (_∧_) // (_(ノ:::::::\_) | \し|.|J ////(_∧_) l `.:7 ̄ ̄ ̄ ̄ ̄/ し"J ヽ / .:::/ / ̄ ̄ヽ(,,゚Д゚) ~ ̄ヽ < おめでとうございます! ヾニニ=/./ハゞ\=ニン / / /| |ヽ \ (__ ̄l/__U"U V`"
PHPでいうところのapache_request_headersのPerl版ってないでしょうか? いや、絶対なんか便利なモジュールがあると思うんですが、ちょっと検索してもスパッとでてこないので……
>>400 ApacheのモジュールだからできることでCGIだったら無理だろう
Web上でtxtファイルを編集できるcgiを作ろうとしてるのですが txtファイルのアドレスを送ってファイルオープンしようとしたら出来ませんでした アドレス自体は、確認したところちゃんと送られてるようでしたし ファイルも、送られてくるアドレスでなく、相対パスをいれたら開くことが出来たんですが urlではファイルのオープンは出来ないのでしょうか?
>>400 ,401
mod_perl 環境下で Apache::Request の headers_in() を使え
という話になるわけだな
PHPもmod_phpのときしか使えないって書いてあるしな。 ただ、どうしても生のヘッダ全てが欲しいならしょうが ないが、CGIでも環境変数経由である程度は情報もらえる ので、それでなんとかなることもある。
>>402 そんな奴が危険度の高いものを作るな
そんなスクリプトいっぱい落ちてるだろうが
407 :
400 :04/12/20 13:51:18 ID:???
>>401 ,404,405
む、mod_perl必須ですか。mod_phpがなかったのでPerlならと思ってみたんですが……今のレン鯖じゃだめかー
やりたかったのはIf-Modified-Sinceをぶんどることなので環境変数経由じゃダメっぽい。
レスありがとうございました。
>>407 apacheなら環境変数HTTP_IF_MODIFIED_SINCEに入ってくると思うけど
質問です。 次のような状況で、エラーは出ないのですがこれは問題ないのでしょうか。 ご指導下さい。 script.cgiでuse strict;って書いてコーディングを厳格化しています。 そこで、require "library.pl";としてあります。 library.plには、宣言されていない変数が使用されていますが大丈夫でしょうか。 library.plではstrictしていないのでこれは問題ないのでしょうか。 よろしくお願いします。
>>409 use strict;でもscript.cgiの記述が対象になるだけで
requireされたライブラリの中身までは見ない。
遠隔でプログラムするのに一番マシな環境って何ですか? FTP使えなくてTeraTermからviでコーディングさせられてて、超しんどいです。 できたら予約語ハイライトがあったら嬉しいですが これよりマシな環境なら何でもいいので、どうかお願いします。m(_ _)m
ここはperlコーディングスレです。
413 :
409 :04/12/20 23:10:03 ID:???
>>411 自分のPCからFTPクライアントが使えないのか、shからもFTP出来ないのか、
>>412 って事だから、この際PerlでFTPクライアント組んじゃえ。
そしたら自分でFTPサーバ立てれば(もしくはどっかにUP)、shから落とせるな。
Net::FTP使えば、ワンライナー程度でも十分いけそうな感じ?
ま、別にFTPにこだわる理由は無いのだが・・・
415 :
411 :04/12/21 01:59:02 ID:???
>414 レス有難うです。 とりあえず入力補完があるらしいemacsで頑張ります。 非武装サーバにログインして、そこからssh経由で開発サーバに接続 という2段構えになっていて、どっちのサーバも設定触れないので・・。 スレ違い申し訳ない。平にご容赦を。
>>415 scpとか。
コピペでviに流し込むとか(teratermだと無理かな?)。
Unix板の方が適切なレスもらえると思うけど。
perl/tkはここでいいですか?
kermitなりxmodemで転送できない?
sshつかえるならscp使えるだろ? Windows上からアップしたいならWinScp使えば?
421 :
nobodyさん :04/12/22 19:14:08 ID:PL97VF7o
「;」区切りのCSVファイル(10行あったとします)があったとして、それを1行ずつ読み込んで、それぞれ別々の 配列に格納したいのですが、なかなか上手くいきません・・。 全部グローバル変数とかでやるなら、 open FH '<', "data.csv"; $i = 0; while(<FH>){ chomp; $count = sprintf("data%03d", $i); @$count = split(/;/); $i++; } close(FH); と記述して一応は出来たのですが、最近use strict;なるものを知ってからは全く手が出なくなってしまいました。 どういった記述をすれば別々の配列に格納することが出来るのでしょうか? まだuse strict;について全然理解していない段階で聞くのもどうかと思ったんですが、思い切って書いてみました。 説明も上手く出来なくて申し訳ありませんが、何かご指導お願いできないでしょうか。 よろしくお願いいたします。
>open FH '<', "data.csv"; 何これ???
>>422 きっと参考にしたプログラムの"data.csv"の部分が
"$file"とかになっててその名残であろう。
>>421 エラー嫁。
strictの意味は調べりゃ出てくんだろ。
>「;」区切りのCSVファイル ワラタ
>>421 strictすると変数名を勝手に使えなくなるんだよ!
だからこれ以上質問を続けないでね!
>>421 配列の配列を使う。
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
>>421 の希望は「別々の配列に格納」だぞ。
ま、なんとなくそういう前提で書こうとしてるだけの気はするけどな。
どうしてもそうしなければならない理由はいくら考えても思いつかないし。
お教え願います。 use strictを記述すると 変数名に型宣言をしないとエラーが表示される ということで、早速以下のようにコードを書いて試してみたのですが エラーがまったく出ずに ブラウザには「test : 0」と通常通り表示されるのみです。 何故エラーが出ないのでしょうか。 #!/usr/bin/perl -w use strict; $a = 0; print "Content-type: text/html\n\n"; print "test : " . $a;
$aだから出ないのですよ。
434 :
431 :04/12/23 00:45:14 ID:???
お教えの通り $aでなく$abcにしたら見事エラーがでてページが表示されませんでした。 知りませんでした… ありがとうございました。
ちなみに$bも出ない。 つーかperldocに思いっきり書いてあるから。
>>435 これですね。
Because of their special use by sort(),
the variables $a and $b are exempted from this check.
>>434 多分、なんでそうなるのかを考えなければプログラム技術はのびない。
正論だとは思うが。 となると本当に極めるにはPerlのソース読むが一番と。 ま、確かにそうだな。
>>436 俺も知らなかった。一文字変数は$iしか使わないしなぁ。
4.999〜と9を15回続けると5未満の判定が出るのはもちろんだが、 9を16回(4.9999999999999999)繰り返すとなんで5以上の判定なんだ。 print "数値を入力: "; $value = <stdin>; chomp ($value); if ($value >= 5) { print "5以上\n"; } else { print "5未満\n"; }
釣り?
>>440 0を足してみれば分かるかも。
$value = 4.9999999999999999;
print(0+$value);
Perlの内部で値を正しく表現できないと表現誤差が出る。
そういうときは、
use bignum;
を宣言する。
なるほど
444 :
nobodyさん :04/12/23 23:37:19 ID:a8M2UJvQ
レンタルサーバーで 使いたいモジュールが入ってるか調べたいのですがどうやって調べられますか?
PHP::Perlinfo
CookieをIE6に食わせることが出来ません。 expires値も食わせてるし、IEの設定をヤワにしても駄目。 Firefox1.0はちゃんと食ってるんですが…。 IEに独特な制約とかって、ありましたっけ。
>>446 ここはコーディングスレですが?
ま、間違ってりゃなんだってうまくいきませんけど。
>>447 ん、IEに食わせるのに必要なコーディングが
あるのかと思ったんですけども。
なんか変なこと訊いてますかね…。
>>448 じゃあ
正しいヘッダを吐くようにコーディングすればIE6でも食ってくれます。
>>445 use PHP::Perlinfo;
perlinfo();
こうやってみましたけど、500エラーになっちゃいました。
>>450 Perlinfo.pmを入れてあるのか?
>>449 正しいヘッダですか(つーことはFf1.0は正しくなくても食うのか…)。
とりあえず、ありがとうございます。
453 :
446 :04/12/24 01:47:51 ID:???
>>449 正しく書いたら動きました。
というか記載できてると思ってたものが抜けてました。orz
本当にありがとうございます。
454 :
nobodyさん :04/12/24 08:09:11 ID:o66Ux/q0
画像ファイルをアップロードさせたときに、縦横のサイズを取得す方法はありますでしょうか? やりたいことは、画像ファイルをアップしてもらったときに、その画像を表示させる際、widthとheightの指定をするために、数値が必要なのです。 表示する際に取得しても、アップされたときに取得してdatファイルに書き込んでもどちらの方法でもいいんですが、 いいやりかたがありましたらお教え下さい。
456 :
450 :04/12/24 10:56:48 ID:tsjI5bY5
>451 だからレンタルサーバーだからわかりませんて。
>>456 別に.pm無くても調べれるし、そういうスクリプトも配布されてるけどな。
てめーのその書き方が気に入らないから教えない。
勝手に調べろ。どーせすぐ見つかる。
>456 RPM使うのが手っ取り早いんじゃ?
>>425 コンマ セパレーテッド バリュー ではなくて
コロン セパレーテッド バリュー なんだろうな。
>>456 @INCのディレクトリでも読み込んでろグズ
そもそも500エラーでエラーログ見ないのは終わってる。
おまえの次のセリフは「レンタルサーバーだから見れません」という!
「レンタルサーバーで必要なモジュールが入っているかどうか調べたい」 -> レンタル業者のサポートセンターに電話して確認汁 「500エラーになってしまいます」 -> レンタル業者のサポートセンターに電話してエラーログを教えてもらう 一番確実、簡単、早いヽ(゚∀゚ )ノ
デバッグ中はさんざんガイシュツだが use CGI::Carp qw(fatalsToBrowser); を頭の方にいれとくだけでエラーメッセージが ブラウザに出るようになるからかなりやりやすく なると思うのだが。
だから、サーバ上でデバッグするなよと(ry
Cygwinでやってるけど、無理やりCygwinにインストールしたimagemagickが案の定まともに動いてくれなくて、 結局サーバでやるしか無い場合もちらほら。
469 :
nobodyさん :04/12/24 22:32:19 ID:cTzXcA78
sendMailでメールを送信したいのですが、うまくいきません。
通常の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 = 'メール送信エラー';
}
ドコモはスパムブロッカーで送れない。
471 :
nobodyさん :04/12/24 23:12:43 ID:cTzXcA78
それはsendmailで送れないということですか? 前に、Net::SMTPとかいうの使ったら送れたんですが・・・。
472 :
nobodyさん :04/12/24 23:13:38 ID:cTzXcA78
てゆーか、携帯にメール送るシステムってどこにでもありますよね・・・?
「メール送信正常に処理しました。」なのに届かないのなら、 sendmailのログを見ろ。これ以上はperlいじってもわからない。 「メール送信エラー」になるのなら、$!を表示させるべし。
・ドコモの場合は送れても遅れることがある(数時間や数日は珍しくない) ・送信を規制しているIPアドレスがある(らしい) ・スクリプトを実行しているドメインは$mlfrom と一致しているか?
base64
>469 $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 . "?=";
478 :
nobodyさん :04/12/25 23:20:20 ID:bFVNXg4w
あるディレクトリの全てのファイルのパーミッションを一括で変換したいのですが chmod 0777,<*>; 単純にやるならこれで大丈夫なものの、 ディレクトリ > ディレクトリ > ファイル のように階層が深くなると書き方が判りません。 何か定石はないでしょうか?
>>478 PerlでやりたけりゃFile::Findが楽。
481 :
478 :04/12/25 23:49:48 ID:bFVNXg4w
>>479 ありがとうございます。
ただ、Perlでの記法が知りたいのです。
言葉足らずで申し訳ありません。
form要素でdatファイルに書き込みをするようにしたんですが、 type="file"を使うときはenctype="multipart/form-data"にしろ、とあったので、 form要素にそれを記述したら、書き込み自身できなくなりました。 サーバーによってファイルのアップロードができない、とかそういうのはあるんでしょうか?
>>482 マルチパートに対応した方法でよまないとだめ。
>>483 そうなんですか。
その言葉をヒントに調べてみます。
485 :
482 :04/12/26 01:58:00 ID:???
調べて読んでみましたが、絶望的に分かりませんでした。 データの受け取り方がテキストとは違うようですね。
>>485 フォームからCGIへ値を渡す時、何を使ってデコードしてるんだい?
CGI_Lite.pmあたりを使ってりゃ、問題は無いはずだよん。
ソースはりゃいいだろ
488 :
482 :04/12/26 02:24:06 ID:???
>>486 if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
とやって、$bufferを散々弄繰り回しておりました。
type=fileを使うのは初めてなので緊張してます。
CGI_Lite.pmというものを探して使い方を勉強してみます。
有難う御座いました。
489 :
482 :04/12/26 03:25:48 ID:???
cgi_lib.plというのを使って、バイナリデータを拾うところまで出来ました。 あとは、これを画像ファイルとして生成するだけなんですが、 GIF89aから始まる文字列の中のどこに元々のファイル名が含まれてるんでしょうか。 抽出方法がありましたら教えてくださいますようお願い致します。 単純に文字列の中には見つかりませんでした。
意図的にコメントなどで埋め込まない限りファイル名なんて入ってねーよ
491 :
482 :04/12/26 03:31:54 ID:???
>>490 回答有難う御座います。
ということは、<input type="file">のパスを抽出出来るようにしなくちゃいけないわけですね。
なんだかいろいろ見えてきたような気がします。頑張ります。
しなちくも何も、 cgi_lib.plの中身を読めばいいだろ。
493 :
nobodyさん :04/12/26 09:31:51 ID:mhqMgdk4
教えてください。 PHPからperlをexecで実行させる処理を書いてるのですが perlスクリプトへの引数で エスケープが必要な文字ってなにがあるのでしょうか? 試した限りでは " は \" \ は \\ にして " で囲えばいいかなと思ったのですが。
"で囲まなくても、 print qq|ここに"でも\でも好きなだけ書くがよい|;|
おっと、最後の|が余分だた
496 :
493 :04/12/26 10:28:19 ID:???
>>494 ごめんなさい
実行スクリプトの引数の話しです
第一引数:aaa
第二引数:aa"a
第三引数:a\a
xxx.pl "aaa" "aa\"a" "a\\a"
こんな感じなのですが
それは Perl とは関係なくシェルのメタ文字をエスケープせんとならんつう話だな PHP なら escapeshellarg 使えば済むような気がするが、スレ違い気味だ
498 :
nobodyさん :04/12/26 13:06:01 ID:RQ2dyxHH
あのさぁ、やってみりゃ答え出ることじゃん。 print join("\n", @ARGV),"\n"; とかやって確認できない?
つか、PHP厨なんだからPHPだけで完結するようにしてしまえばいいだろ。 PHPでPerlなんか起動するなよ。
そんなPHPを責めないで… 俺もmySQL使う時はPHP使うよ。 Perl+DBは遅いイメージがあるし、mod_perl使えないし。 誰かこのイメージ払拭させてくれませんか?(スレ違い)
504 :
nobodyさん :04/12/27 14:15:25 ID:Wb/eo+Or
質問させてください。 useの行で $ ../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に追加できていないということなのでしょうか?
use lib '/xxx/xxx/xxx'; かuseの前に BEGIN { push(@INC, '/xxx/xxx/xxx'); }
506 :
504 :04/12/27 14:28:57 ID:???
>>505 ありがとうございます!
スクリプトを読み込むと同時にuseが処理されてたということ
だったのですね
ずっと悩んでました m(__)m
携帯コンテンツ等の、セッション管理について質問です。 私は今までずっと引数でセッションIDを引き回す方法をとって いたのですが、とある案件でmod_perlの「PerlTransHandler」と いうものを使うことにより、自作モジュールをプログラム読み 込み前にロードし、セッションIDをsubprocess_envというものを 使用して環境変数に埋め込むという方法を知りました。 これであれば引数を使用することはなくなりますし、静的ペー ジでもセッションIDを保持することが出来ます。 これからこの方法を使っていこうと思ったのですが、今回の 案件がモジュールのインストール関連を許可してくれない 関係で、この方法はとれなくなってしまいました。 この他に似たような方策があれば、ご教授いただきたく思っ ております。 宜しくお願いいたします。
508 :
nobodyさん :04/12/27 17:19:58 ID:d87nS7mB
文字コードはEUCです。 my $a = "123456789"; $a =~ s/(?:\xA3([\xB0-\xB9]))/ chr(ord($1)-0xB0+ord('0')) /eg; print $a; >123456789 ↑自分で全角数字を半角数字に変換するコードを考えたのですが、 マルチバイト文字などの中間に誤ってマッチしてしまいます。 例→隠隠 1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには 完全に誤作動してしまいます。 どうすればよいでしょうか?
>>507 Apache::ClickPath かあ。URLのパス部分にセッションIDを埋め込むやつだよね。
頑張れば mod_rewrite で似たようなことを実現できそうな気もする。
ただその場合「Perl コーディングの質問」では無くなってしまうのだけれど。
「mod_rewrite すらダメ」と言われると厳しいかも。
>>510 そうです!まさにそれでございます!
mod_rewriteでしたらできる可能性があるんですね。
ちょっと上司に使用許可を求めてみたいと思います。
0を渡したら、aa 1を渡したら、ab (略) 25を渡したら、az 26を渡したら、ba (以下略(ただし、zzまでの有限配列)) となるようにしたいのですが、どうすればいいのでしょうか? 全部記載した配列を使ってるのですが、重そうなので簡単な方法があれば知りたいです。 おねがいします
>>512 キミがしたいのは、こうゆうことか?
foreach ('aa' .. 'zz'){
$list[$count++] = $_;
}
514 :
508 :04/12/28 11:18:22 ID:/d0b1jT1
>>509 jcode.plでもできるようです^^;
アホなことをしてしまいました。
しかしどうやってるのでしょうか?
>1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには
>完全に誤作動してしまいます。
これをどうやってクリアにしたのか気になってjcode.plのtrの中身を
見てみましたが・・・・・・・orz
字句解析でもしてるんだろうか
515 :
513 :04/12/28 11:44:05 ID:???
>>512 おっとおいらもボケていた。この1行で終り。
@list = ('aa' .. 'zz');
516 :
512 :04/12/28 12:11:25 ID:t9GmHYc3
>>513 >
>>512 > foreach ('aa' .. 'zz'){
> $list[$count++] = $_;
> }
今、それとほぼ同じコードなんだけど、676個も要素をメモリに読み込んでるから軽く出来る方法はないかとカキコしますた
このスレであってるか微妙ですが、 掲示板の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'); あたりだと思うのですが半角カナ→全角カナへのコンバートをしないようにするためにはどうすればいいのでしょうか
h2z はよくプログラミングで使われるパターンで、 hankaku to zenkaku の意味
半角カナが使用できないjcode.plなんてあるのか?
>517 jisコードには半角カナが無いので、jisコードに変換した時点でアウト
521 :
518 :04/12/28 16:16:28 ID:???
投稿を管理者にメール送信ってやつかもね。 それだったらJISへ変換は当然として、そこは半角にはできないな。 いずれにしても改造スレのほうが適切じゃないか?
SJISって言おうぜ。JISは別物が既にあるんだし。
質問です、 $var1='あかさたなはまやらわ'; $var2='亜加差多菜羽真矢裸和'; この二つの変数を使って s/あ/亜/g; s/か/加/g; s/さ/差/g; … みたいな置換をしたいのですがグルっても分かりませんでした。どういう処理をすれば良いんでしょうか。
527 :
517 :04/12/28 21:20:58 ID:???
>>518-523 レスありがとうございました。
良く考えたら半角→全角変換しないでいいのならjcode.pl自体使う必要がないので、
cgi中からjcode.plを抜き取ればいいだけでした。
>>512 my @key = ('a'..'z');
my $keynum = scalar @key;
# my $d = 675;
my $code = $key[$d/$keynum].$key[$d%$keynum];
# 繰り返し使うなら、配列の方が負荷は軽いと思う。
>>526 文字コードとPerlバーションを書くべし。
>>527 JISコードへのコンバートはしなくていいの?
529 :
526 :04/12/28 22:01:07 ID:???
>>528 SJISです。
バージョンは5.0(AAACafe)ですが、多分5.8にうpすると思います。
>>527 それでいいのか?携帯サイトか?
SJIS(つーかページのエンコード)以外の文字コード送られてくる可能性は無いのか?
>>529 微妙だね。
String::Multibyteを使ったもの。
use String::Multibyte;
my $mbcs = String::Multibyte->new("shiftjis");
my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
print $mbcs->strtr('あめんぼ あかいな あいうえお', $var1, $var2);
532 :
531 :04/12/28 23:32:16 ID:???
jcode.plを使ったもの。 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;
533 :
531 :04/12/28 23:38:14 ID:???
自力で(無茶な方法採用。) 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; }); }
534 :
531 :04/12/29 00:18:35 ID:???
jcode.pl版は間違いがありました…以下差し替えで。 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"); }); }
537 :
nobodyさん :05/01/03 03:52:58 ID: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を使って地道にやらないとだめかなぁ
>>537 @hoge = grep(!/いらない値/, @foo); とかやって@hogeから
539 :
nobodyさん :05/01/03 04:17:37 ID:Jw9YIMiU
阿\xa5鬢\xb3壜\xa3 今作成中のアクセス解析でshift_jisで出力した際 検索文字列に上のような文字化けが出るんですが、 これ元がどの言語コードが分かりますでしょうか? 漢字 \ x アルファベット 数字 という規則的な並び方してるのですが、 お分かりの方いたらご教授お願いしますm(__)m
>>537 俺だったら、おとなしくforeachを使うと思う。
少し考えてみて、いい方法があったら、後で書き込みます。
>>538 それだと、配列中に要らない値が重複して存在する場合、
その値に対応する要素が複数削除されるぞ。
>>540 >それだと、配列中に要らない値が重複して存在する場合、
>その値に対応する要素が複数削除されるぞ。
元質問だといらない値以外が残ればいいんじゃないの?
>>539 shift_jisで出力する前の値を書け
543 :
540 :05/01/03 05:39:41 ID:???
splice(array, offset, length) を使えば楽みたいね。今まで使った事なかった、鬱 orz 例(※検証してません): @foo = qw(1 2 3 4 5 6); splice(@foo, 1, 2); print join(',',@foo) , "\n"; 結果: 1,4,5,6
コーディングとはちょっと違うんだけど。 CPAN 経由でインストールしたモジュールをアンインストールするには どうすればいいの??
>>544 cpan使ったことないけど、
cpan -c
かと。
@bar= @foo[0 .. $n-2,$n..$#foo];
>>547 というか元質問自体が曖昧なので、同じ値を削りたいのか
n番目の値を削りたいのかどちらともとれるし。
550 :
540 :05/01/03 16:01:28 ID:???
>>547 読んでるよ。
offsetとlengthは、537に合うように変えてくれれば良い。
その意図で543の様に書いたんだし。
ま、549の言う通りだな。
540の指摘が癇に障ったなら謝るわ。
>>549 >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 が再度書くまで放置するしかあるまい。
>>537 中身を見て、取り出すなら。('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回すかなぁ。
それって@foo[2]の3だけ除くんでしょ?
だったらそこまで複雑にしなくても
>>543 のように
splice(@foo, 2, 1); でいいのでは?
言い方がおかしいか。 「@foo[2]の3だけ除かれる」
>>553-554 >>552 は中身が'3'の最初のものを削除するんだけど、
'3'が常に$foo[2]にあるとは限らないとしたら?
または、配列に'3'が含まれていなかったら?
質問では、配列の内容は
> 例えば
だから実際は、
use List::Util qw(shuffle);
my @foo = shuffle (1..10);
なんて物かもしれないしね。
>>555 >'3'が常に$foo[2]にあるとは限らないとしたら?
>または、配列に'3'が含まれていなかったら?
全然影響しないでしょ。
>splice(@foo, 2, 1);
foo[2]を1個取り除くだけなんだから。
元質問が複数の要素を一度に取り除いたものを得たい、または
要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
>>556 > 中身を見て、取り出すなら。('3'を取り出してみるとすると)
> 中身が'3'の最初のものを削除するんだけど、
これは無視?
> 要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
別も何も、これをコード化したものですが。
>>549 さんの
> というか元質問自体が曖昧なので、同じ値を削りたいのか
> n番目の値を削りたいのかどちらともとれるし。
という意見の"同じ値を〜"の方のコードを書いたまでです。
558 :
537 :05/01/03 19:03:14 ID: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でそのままやるのは無理そう?
559 :
nobodyさん :05/01/03 19:39:41 ID:BmWNnWLw
Perlの関数の括弧があるのとないのって、どう違うんでしょうか? 例↓ open IN, "aaa.txt"; open(IN, "aaa.txt"); 私の持っている本には、括弧が書いてある本と書いていない本が あるのですが、括弧についての説明がなくてよく分かりません。 説明しているサイトも見つけられませんでした。 よろしくお願いします。
560 :
nobodyさん :05/01/03 20:13:20 ID:1lDTWYQS
括弧が無い場合、Perl が勝手に括弧を補って構文解析してくれる。 ほとんどの場合プログラマの意図したとおりに補ってくれるが、 ごく稀に、意図しないところに括弧を補って恐ろしい動作をしてくれることもある。 まあ演算子の優先順位を厳密に考えてれば防げることなんだが、 それよりは括弧を明示的に付ける方が楽ではある。
>>558 配列を壊していいならspliceで、壊したくなければ
>>546 の配列
スライスでいいんでない。要素の位置で指定する場合は配列を
そのままgrepでは無理です。どうしてもgrepつかいたけりゃ
0..$#fooでインデックスの配列作ってそっちにgrepする手はある
けど。
オーバーフローや浮動小数点の誤差を気にしなくていいのならば、
配列を加工しようとせずに全部の要素の和からn番目の要素の値を
引き算する方がいいかもね。
COOKIE、GET、POSTとかで、%00をブロックした方が良いって聞いたけど、 どこをブロックすればいいの? 正規表現で全部チェックすれば良いのかな。。。 あと、安全のためにブロックした方が良い文字ってある?
>>562 どの文字をブロックするか考えるより、何を通していいか考えて
それだけ通すようにした方がいいと思うよ。
あとは出力するときに過不足なくエスケープすること。
-Tフラグを使うとすこし安心かもね。汚染除去するときの正規
表現を適切なものにしないと意味ないけど。
564 :
559 :05/01/03 22:38:42 ID:???
>>560 それじゃ、Perlでは括弧は常につけておいた方がいいということなんですね。
他の言語はVBしか知らないのでVBですみませんが、
VBだと関数の戻り値がある場合は括弧が必須で、
ない場合はどちらでもいいようです。
Perlでも何か違いがあるのかと思っていました。
どうもありがとうございました。
565 :
nobodyさん :05/01/04 01:14:24 ID:WiFbXIfd
Perlは変幻自在な妖怪みたいな言語
,. -?‐ `'' 、 ┏┓ ┏━━┓ /.,;彡;, ..,;,. ゙ミヽ、 ┏━━┓ ┏┓ ┏━┓ ┏┛┗┓┃┏┓┃ /ソノ;彡;彡;彡;彡'゙ヽ;゙i;,ヽ ┃┏┓┃┏┛┗┓┃ ┃ ┗┓┏┛┃┗┛┃┏━━━{i;゙|il|l!ノ彡';彡;'','⌒ ゙!l!l}i゙!━┓┃┃┃┃┃┏┓┃┃ ┃ ┏┛┗┓┃┏┓┃┃ {ノl!|!;ソ;ノリノ'″Perlノ;li|l!1 ┃┃┃┃┃┗┛┃┃┃ ┃ ┗┓┏┛┗┛┃┃┗━━━'{i|{il{li゙!ソ;' ` ' `"″!l}!i|!━┛┃┃┃┃ ┃┃┗━┛ ┃┃ ┃┃ '{;l!|{i!リ'' _ノ ;i|!レ' ┃┗┛┃ ┏┛┃┏━┓ ┗┛ ┗┛ '゙i!|!;'、,_´__,ノ '″ ┗━━┛ ┗━┛┗━┛
質問です。 例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」 が入っていたときに<p>から</p>までの間の「あああいいい」を取り出すにはどうしたら良いでしょうか? よろしくお願いします(;´Д`)人
568 :
567 :05/01/04 18:09:51 ID:???
あ、違った・・・すみません、脳みそまとめてから質問しますorz
569 :
nobodyさん :05/01/04 18:16:31 ID:ufv1QlyO
スレ汚しすみません。改めて質問です。 例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」が入っていたときに <p>から</p>までの間の「あああいいい」を編集して例えば「いいいううう」等にして $mesが「あああああ<p>いいいあああ</p>いいうええええ」となるようにしたいのですが どのようにしたら出来るでしょうか?
置換えなら正規表現でもいいが、編集してって何よ?
その置き換えを<p>から</p>までするにはどうしたらいいんでしょうか・・・
>>569 # <p>〜</p>までを抜き出す
$mes =~ m|^(.+)<p>(.+)</p>(.+)$|;
$before = $1;
$inside = $2;
$after = $3;
# 中身を書き換える
$inside = "いいいううう";
# つなげる
$mes = "$before<p>$inside</p>$after";
ってこと?
はいっ、そういうことです。
574 :
nobodyさん :05/01/04 23:16:36 ID:Y/b3Mf5i
質問なのですが、 Use strict; を使って書いてるのですが、サブルーチンの中から複数の値を返したい時はどうすれば良いのでしょうか? 例えばですが、 sub a{ my $a = 1; my $b = 2; my $c = 3; } というサブルーチンがあったとして、$a, $b, $c, それぞれの値を参照したいという感じなんですが・・・・。 既に出たような質問だったらすみませんが、よろしくお願いいたします。
>>574 配列で返す
($a1,$b1,$c1) = a();
sub a {
my $a = 1;
my $b = 2;
my $c = 3;
return ($a, $b, $c);
}
既に何度も出ているような気はまあ確かにする
576 :
574 :05/01/04 23:38:07 ID:???
>>575 早速レスして頂いてありがとうございます。
配列で返すとは思いつきませんでした。まだまだ知らないことだらけです(汗
教えて頂いたことを試してみます、どうもありがとうございました☆
577 :
574 :05/01/05 00:13:08 ID:???
試したらうまいこと出来ました、ありがとうございました☆ 勢いでもう一つ質問してしまいますが、複数の配列を返したい場合はどうしたら良いでしょうか?(とりあえず同じように試したらダメでした) 調べてみた所、リファレンスを使って返すとあったのですが、それが最良の方法でしょうか? ↓こんな感じで・・・。 sub foo { return \%hash, \@array; } いろいろ聞きまくってしまって申し訳ありませんが、よろしくお願いいたします。
ちょっとした質問です。 13 <= $teens && $teens <= 19 という評価式はなんだか冗長なのでもっと見やすくすることはできませんか? $teens == 13 .. 19 くらい簡単に書けてもいいような気はするのですが。
>>577 一緒くたにしたあと長さで分離する手もあるにはあるが
普通はリファレンス使うのが良いと思う
>>578 perl 6 になるとなんかその手の書き方ができるようになると聞いたが
今のところは我慢しる
580 :
nobodyさん :05/01/05 02:10:00 ID:V9sS6I44
質問させてください。 現在9個の要素が入っている配列@arrayの0から4までの要素を my ($a, $b, $c, $d)にいれて、コピーした要素を配列から消去 したいのですが、スマートな方法はありませんか。 my ($a, $b, $c, $d) = shift @array;感じとしてはこんな風に・・・ よろしくお願いします。
581 :
580 :05/01/05 02:14:50 ID:V9sS6I44
↑ごめんなさい、0から3です。
>>577 調べろ
sub a {
my %hash = ( a => 1, b => 2 );
my @array = ( "a", "b", "c" );
my $ref = [ \%hash, \@array ];
return $ref;
}
583 :
nobodyさん :05/01/05 02:18:17 ID:elOzKoqY
>>580 spliceを使えばよいかと。
こんな感じで。
splice(@array, 0, 4);
584 :
580 :05/01/05 03:11:37 ID:V9sS6I44
>>583 なるほど、こんな便利な関数があったのですね。
ありがとうございました。
if ($hoge - $foo == 0 || $hoge - $foo == 1) { } これって一つの条件式、あるはもっと簡単に出来ないでしょうか
あららそんな近くに答えがあったんですね すいませんでした。。&& thx;
588 :
578 :05/01/05 04:12:42 ID:???
>>579 回答ありがとうございます。
今初めてPerl6に期待しちゃいました。
Perl6…開発開始してからもう何年経ったっけ?w
>>585 # 1以下
if ($hoge - $foo <= 1) {
# 処理;
}
ただし、0.5とかも入っちゃうけど…。
質問です。文章中において >| <strong> 文章 → 文章 |< </strong> みたいな事をしたいのですが、どうしたらよいでしょうか。 自分で考えたのは $mes =~ s/(>\|)((\n*.*)*)(\|<)/<strong>$2<\/strong>/g; この場合 >|あああ|< → <strong>あああ|< >|いいい|< >|いいい</strong> となるので $mes =~ s/(>\|)((\n*[^(<\|)]*)*)(\|<)/<strong>$2<\/strong>/g; としたのですが、これだと >| |< の中にlやtがあっても駄目です。
>>593 正規表現の部分にちょっと無駄な部分があるような希ガス
$mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs;
(Perl5以上で)これでいいんじゃないかな。
解説
・ >| と |< を括弧でくくる理由がわからない。
・繰り返し記号の後に ? を使ったら、最短でマッチする。
・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。
594です ごめん、ちょっと電波が $mes =~ s/>\|/<strong>/g; $mes =~ s/\|</<\/strong>/g; じゃだめなの?
それだと >| ちりぬるを |< いろはにほへと|< とかなっていた時に困った事になるんです。 なので、「>|を発見したら、以降に|<があればそれぞれを置換し、これを最後まで繰り返す」ような事を したい訳なのですが、いい案が思いつかないんですよね・・・。
>・ >| と |< を括弧でくくる理由がわからない。 「>|」とかっていうのは記号の例えでして、掲示板でタグを使えない代わりに そういう記号でマークアップさせようという意図からです。・・・が正直厳しいです。 >・繰り返し記号の後に ? を使ったら、最短でマッチする。 >・オプション s を使うと、 . (←半角ドットね^^;)も改行文字にマッチするようになる。 勉強になりました!ありがとうございます。
じゃあ $mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs; ってやってしまおう。 括弧でくくる、ってのは (>\|) これね。グルーピング、説明不足ですまん
599 :
nobodyさん :05/01/05 21:09:19 ID:fN7gQymP
print "@$row[0]"; を実行した結果が、 あいうえおかきく print "@$row[0]\n"; を実行した結果が、 あいう えおか きく となる配列の要素を、 「あいう」、「えおか」、「きく」 それぞれ別の変数(もしくは配列)に入れる方法を教えてください。 print "$a, $b, $c"; を実行すると、 あいう, えおか, きく (↑例えばこのように出力したい) chomp、 split(/\n/, @$row[0]) では不可でした。
>>599 print "@a"; を print "@a\n";にかえただけで改行が
少なくとも2箇所増えるような@aはオレには思いつかない。
601 :
nobodyさん :05/01/05 22:30:59 ID:DtV5vUlC
use utf8; で作っているのですが、 DBに格納してあるutf8の文字列を取得するとき、その都度 utf8::decode($str) としてUTF8フラグを付けているのですが、自動的にUTF8フラグが付くようにする にはどのようにしたらよいのでしょうか?
602 :
593 :05/01/05 23:36:16 ID:???
>598 ありがとうございます。 $mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs; にしたら動くには動いたのですが >| <strong> >|ああああ|<→ >|ああああ</strong> |< |< となってしまいました・・・結果を見れば多少納得しつつも改善策が思いつかないです・・・。 Wiki的記法スクリプト作ってる人って凄い・・・orz
ぁ、ためしに $mes =~ s/>\|(.*?)\|</<strong>$1<\/strong>/gs; を2行連続して書く事で602の現象は回避できました・・・が、 これだと激しく手順がおかしい・・・(;´Д`)
じゃあWikiのソース参考にすれば? 文章の整形や修飾に関しては全然難しい事やってないよ。
>>599 その質問の真意はよくわからんけど、
馬鹿正直に答えるとまずprint関数の定義をいじらんとダメかな。
perlはめちゃくちゃな言語なんでいじる手段は複数あるよ。
でも、きっと君が望む回答じゃないと思う。
まず本当に自分がやりたい事を整理しなされ
>604 そうなんですか。 実は読んだのですが、2日前にPerl始めたばっかりなんで結構チンプンカンプンでした・・・。 精進します。
つまり >|.*?|< という括弧のネストを解決したいわけだな
>>593 括弧の種類が一つならば、ネストは考えなくてもいい。
my ($open, $close);
$data =~ s/(>\|)|(\|<)/$1 ? ($open++, "<strong>") : ($close++, "<\/strong>")/ge;
($open > $close) and die "開き括弧が多すぎます";
($open < $close) and die "閉じ括弧が多すぎます";
609 :
608 :05/01/06 12:23:08 ID:???
訂正です。閉じが先に来るパターンを忘れてました。 my ($open, $close); $data =~ s/(>\|)|(\|<)/ $1 ? ($open++, "<strong>") : (($open <= $close and die "対応する開き括弧が見つかりません"), $close++, "<\/strong>")/ge; ($open > $close) and die "対応する閉じ括弧が見つかりません";
ut
つーか
>>595 でいいじゃん、残り全部強調したいのかも知れないし
>>611 |<あああ>| →</strong>あああ<strong>
|>| →</strong>strong>
この辺りを許容するかどうかだけどね。
許容するなら、
>>595 のでもいいし。
613 :
599 :05/01/06 13:53:22 ID:???
>>600 >>605 回答ありがとうございました。解決しました。
print文がLoopされていて
@$row[0] がそのつど書き換わっていただけでした。
素人甚だしく申し訳ございませなんだ
>612 許容でいいんじゃないの? >609みたいに親切にエラー表示しなくてもいいような気がする・・・ 意図する表現にならなかったらユーザーが文法間違えたってことだから、 入力したユーザーが修正で再度入力すればいいだけじゃないの? 掲示板で使うってことだから、書き込む前に変換後のプレビュー画面でも見せて そこで修正するかそのまま書き込むかユーザーに選ばせればいいと思う。
質問 XMLをハッシュに変換したいのですけどどうしたらよいでしょうか
616 :
nobodyさん :05/01/06 21:25:44 ID:VJDwnbh+
サブルーチンの中で<STDIN>を使って入力した値を受け取り、その値を比較に使おうと 思っても上手く行きません・・。何が原因なのでしょうか? sub a{ my $input = <STDIN>; if($input eq "a"){print "a\n";} } こんな感じのソースで、入力時に「a」と入力してもその後の文字列比較が上手く いかないようで、printが行われません。何でなのでしょうか? 初歩的な質問ですいません。
my $input = <STDIN> chomp $input; if($input eq ...
>>615 なんか久々に見る大胆な質問だな
DOMツリーを作るなら XML::DOM とかあるが、どういう形のハッシュで出力させたいんだ?
619 :
616 :05/01/07 00:37:45 ID:???
>>617 なんと改行文字が含まれていたからなのですな・・・・。
ドツボにはまってました(汗
どうもありがとうございました!
>>615 XML::Simple が丁度 XML <=> Hash 変換してくれるモジュール。
>>619 このケースに限らないが、困った時はまず変数の中身を確認しろ。
use Data::Dumper;
print Dumper($scalar);
print Dumper(\%hash);
print Dumper(\@array);
多次元配列をサブルーチンの中で生成して、リファレンスを返したのですが、その多次元配列を 別のサブルーチンで扱うにはどうしたら良いのでしょうか? リファレンスを渡すだけだと、 Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY ref while 〜 と怒られてしまうのですが・・・・。 よろしくお願いいたします。
>>622 リファレンスを返すだけで普通は扱える。つか俺は使えている。
たぶん君の書いたコードが間違っているのだろう。
動かないコードと、何を読んでその書き方を憶えたか、を晒すと、
後学のためになると思う。
624 :
622 :05/01/07 12:20:19 ID:tb1n+4Nw
>>623 そうなのですか、まだ苦戦してます。やろうとしてるのは次みたいな感じです。
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";
}
}
とすると前述のエラーが出て怒られてしまいます。
何故なのでしょうか?
最初の質問が説明不足でしたが、よろしくお願いいたします。
625 :
615 :05/01/07 12:28:40 ID:???
>>620 やってみましたがリファレンスで返されて使いづらいのですが
>>624 sub b{
× my $abc = $_;
○ my $abc = $_[0];
○ my $abc = shift;
>>624 あと気付いてるとは思うが、
$abcに代入してるのに、$dataでデリファレンスしても
どうにもなんねーべや
628 :
624 :05/01/07 14:30:35 ID:tb1n+4Nw
>>626 ,
>>627 レスありがとうございます。
$abc = $_[0];
で受け取って、$abc でデリファレンスしてみましたが、同じ様に
Can't use string ("ARRAY(xxxxxxxx)") as an ARRAY 〜 と出てしまいました。
$abc を表示したところ、ARRAY(0x810e7f0) と表示されたので、引数の受渡し自体
は上手くいっていると思いますが、そこからのデリファレンスがどうしても出来ません。
@{$abc}
@{$$abc}
とか、いずれも前述のエラーの対象となるようです・・・。
ここらへんざんまり良く分からないのですが、教えて頂けないでしょうか?
たびたびすみません
>>628 エラーが出る直前のあたりに print $abc; を入れて様子を見てみそ
630 :
624 :05/01/07 14:51:20 ID:tb1n+4Nw
並べて書いてみました。 sub 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) ・・・・・ と表示されます。 構文がおかしいのでしょうか?
×b("$ref") ○b($ref)
>>630 あ、わかった気がする。
use strict してないでしょ。
633 :
624 :05/01/07 15:19:31 ID:???
>>630 問題解決しました!
引数として指定するときに""で囲ってました、リファレンスを渡す場合はいらないのですね。
気づいてみると単純なものでしたけど、ハマってました。
どうもありがとうございました!
>>632 use strict;
してました。もし同じことをするのにuse strict;を外すと、これまたエラーになってしまうのでしょうか?
変数を""で囲むという文化はどこから来たんだ
訂正 フォームの部分→記事の部分
>>633 そのケースだとuse strictをしていないと*エラーにならず間違った動作*をする。
Perl初心者です。1つ質問させて下さい。 例えば 「今日は(・∀・)な日だった」 という文があったとして、この文から日本語だけを削除して 「(・∀・)」 このような文にしたいのですが、どのようにプログラミングすればいいでしょうか?
$data = '今日は(・∀・)な日だった'; $data =~ s/.*(\Q(・∀・)\E).*/$1/s;
$hoge='今日は(・∀・)な一日だった'; $hoge=~s/今日は//og; $hoge=~s/な一日だった//og; は間違いです
642 :
nobodyさん :05/01/07 23:27:50 ID:GrSDiTmV
gethostbyaddr関数の第2引数ってどういう意味なんでしょうか? 本によって、PF_INETと書いてあったりAF_INETと書いてあったりします。 よろしくお願いいたします。
>>639 記号を残すということかな?
Shift-JISでひらがなを削除するにはこんな感じ。
$data = '今日は(・∀・)な日だった';
$data =~ s/\x82[\x9F-\xF1]//g;
あとは
>>5 のPerlメモから「日本語を扱う」とか、正規表現について調べたらいい。
645 :
642 :05/01/07 23:41:11 ID:???
>>643 すいませんスレを間違えました。
逝ってきます
647 :
639 :05/01/08 00:01:23 ID:oXOik1WL
>>640 >>641 >>644 みなさんご丁寧な回答、本当にありがとうございます。
ひらがな、漢字、カタカナ、英語の文字を削除したかったのです。
644さんの通りやったら、ひらがなを削除することができました。
ASCIIコードで範囲を指定してやればいいのですね。
次は漢字、カタカナを頑張って調べてみます。
use strict; 条件下で、サブルーチンの中で宣言したローカル変数は、返り値として外部に渡したらグローバル変数になるのでしょうか?
何の為のローカル変数?
>>648 返り値は値であって変数ではない。その辺の概念を
勉強しなおすことをおすすめする。
my $r = 1;
return $r;
は、$rという変数を返すのではなくて$rという式
の値(=1)を返す訳だ。
俺もこれ気になったことあった。 sub a{ my @array = (1, 2, 3); return \@array; } $a = &a(); で返り値受け取ったとすると、リファレンス使って@arrayの値を参照したり、 配列をしたり出来る訳だけど、となるとmyで宣言したローカル変数はいずこへ・・・と思ったりした。 これって、シンボリックリファレンスの@arrayは消滅するけど、そこで確保された値は残っていて、 ハードウェアリファレンスを用いることで@arrayを参照できる・・・・ってことでいいのかな? (一度確保した値はメモリ上にいつまで残っているのだろうか?) 適当に覚えた知識ゆえ間違ってたらすまん。 玄人の方訂正やつっこみよろしく頼みます。
どこかから参照している限りは残るんじゃなかったっけ。
変数を宣言すると、名前と実体が確保される。 実体は参照カウンタ型ガーベッジコレクション付きのメモリに確保される。 実体は参照されている数がカウントされていて、カウントが0に(誰も参照していなく)なると破棄される。 変数がサブルーチンから抜けるなどでスコープから外れると、 変数の名前が破棄されて、参照カウント値が一つ減らされる。 しかし、リファレンスによって参照されている限りカウントは0にならないから実体は破棄されない。 (ここでのリファレンスはシンボリックではない、ハードリファレンスのこと) C,C++の(一般的な実装の)ローカル変数のようにスタック上にメモリを確保する訳じゃないから、 こんな芸当ができる。
Perlの変数には注目度というものがあります。 誰かに注目されている限り神様が生かしてくれます。 友達のお婆ちゃんはこれが原因で亡くなりました。
いつの間にかリファレンスの話になってるけど、 この辺は「初めてのPerl」読めばすっきりすると思う。 クロージャとかも混乱しやすいね。
下記の2パターンのような文字列から値だけを取得したい場合どうすればいいのでしょうか? 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;
要点を絞れよ 言ってることがよく分からん
1つ質問させて下さい。Perl初心者です。 ファイルの中身が「abcCLEてすと」である文章をopenして、 $text = "abcCLEてすと" とし、これから「abc」を削除しようと思って $text =~ s/a|b|c//g; print "結果:$text\n"; として、結果を表示すると 「結果:bkEてすと」 と表示されます。 abcは削除されているようですが、他の文字が文字化けしています。 文字化けさせない為には、どうすればいいでしょうか?
659 :
656 :05/01/08 14:21:24 ID:???
>>659 だからよ、そのパターンってのが何に入っているんだ?
配列か?変数か?ハッシュか?
splitとか言ってるってことはもう格納してあるんだろ?
>>656 フォーマットが固定されてるなら、正規表現のパターンマッチで切り出すのが楽だと思う
662 :
656 :05/01/08 18:35:50 ID:???
>>660 splitでやって失敗したので困ってます
,で区切った場合、""で囲まれたところで,が出てきたら大変なことに・・・
>>661 正規表現はちょっと苦手なので、なるべく避けたいと思ってたり・・・
それに、それがすべてではなく、順番なども異なっている鯖もあるかもです
>>663 やっぱり正規表現使うしかないですか・・・
少しだけ正規表現を調べてきます
>>658 $text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
結果:CLEてすと
化けないよ。
>>664 なんか良く分からんが、絶対使われない(っぽい)<>とかで区切っちゃダメなの?
Windowsで、"abcCLEてすと"だと化けるな。(CLEは全角)
なんかよくわからんがひょっとして、SJISでパターンマッチした→化けたよ助けてどらえもーん、 という話か? それなら「それはきみがわるい」でまとめちゃうぞ
http://www.rescue.ne.jp/study/pack/ 画像を文字に変換するというスクリプト(バイナリデータを16進ダンプし、
それをスクリプトに埋め込んで復号)を試してます。
上記のサイトの変換、復号cgiをレンタル鯖(Linux+Apache1.3+Perl 5.008003)に
設置してやると正常に動くのですが、ローカル(Win2k+Apache2+Perl 5.008004)
だと画像が壊れてビットマップがぐちゃぐちゃになってしまいます。
$data = pack('C*',hex($_));
ここらへんに原因があるとしか思えないのですが、、、
Windows+Perlでファイル出力の場合ならbinmodeにしたりするところですが、
こういう場合はどうしたらいいでしょうか。
>>670 1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
なにが悪いか解ったけど、質問の方法を考えてもらってからにしよう
binmode(STDIN); 全体像が見えないので勘で答えてみた。
>>673 当たり。
だけど、質問者に考えてほしかったなぁ
驕
つか、CGIレスキューなんだろ?
>>659 > 2種類のWeb認証ヘッダを取得して変数に代入したいということです。
ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
679 :
670 :05/01/09 14:17:11 ID:???
680 :
670 :05/01/09 14:32:59 ID:???
すみません。解決しました。 やはりbinmode(STDOUT);でした。 IEのキャッシュを消してリロードしたら表示されました。(^-^;)
>>680 自力解決乙。
ちなみにその二つの画像ファイルをバイナリエディタで見比べてみると
0xBC の 0A F6 F4 の部分が壊れた画像では 0D 0A F6 F4 となっている。
これくらい自力で調べられるようにしておくといいかも。
>>658 Perlバージョンが分からないから、とりあえず。
use encoding "shiftjis";
$text = "abcCLEてすと";
$text =~ s/a|b|c//g;
print "結果:$text\n";
683 :
659 :05/01/11 22:55:58 ID:???
>>678 > ここで言ってる「Web認証ヘッダ」とはクライアントからサーバに送られるAuthorizationヘッダの事か?
サーバーからの要求のほうです。
> このヘッダはセキュリティ上の理由でCGIには渡されないと言う事を知っているか?
もちろん知っています。モジュールを使えば取得できることも知っています。
今回は、CGIにブラウザから渡って来るのではなく、Socketで取得してますのでこの点は関係ありません。
配列の中で重複する要素の番号を返すプログラムを考えているのですが、 どうやるとスマートに出来ますか? 一応自分で考えてみたのは 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++; } ってな感じの初心者丸出しコードなんですが(汗 見難いですね・・・。 結果としては上手く出来たのですが、もっと良いコードの書き方があるかと。。。 いかがなもんでしょうか?
685 :
684 :05/01/12 00:38:26 ID:???
Σ(゚Д゚;エーッ! 半角スペース使ったせいで死。。すいません
Σ(゚Д゚;エーッ!
>>684 my @list = qw/test1 test2 test3 test4 test5 test2 test6 test7/;
my %count;
@_list = grep $count{$list[$_]}++, 0 .. $#list;
print @_list;
>>687 それだと5しかでないけど、欲しい結果は1,5なんじゃない?
私ならこうする。
my %count;
foreach (0..$#array) {
push @{$count{$array[$_]}}, $_;
}
my @number = map @$_, grep @$_ >= 2, values %count;
すみません初心者の質問なんですけど、ご教授ください 連想配列の要素の数はどうやってもとめればいいんですか?
>>688 そうだったんか。俺ならこう。
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;
692 :
684 :05/01/12 02:23:19 ID:???
>>687 さん
>>688 さん
レス有難うございます。
>>688 さんの仰るように、例でいくと1, 5が欲しかったです。
それで、今
>>688 さんのコードを試して見たのですが・・・・・。
あっさりすぎるほどに求めていた答えがでました。私が書いた50行がたったのコレだけで
出来てしまうんですね(汗 悲しい部分もありますが、すごく感動ですね。
本当にありがとうございますm(_ _)m
ですが・・・・コードがまだ理解出来ないのがイタイです(笑
もし
>>688 さんに少しお時間ありましたら、ほんとにさわりだけでもいいのでコード解説とか
お願いできませんか? 解説頂いても理解出来ないかもしれませんが、人のコード使っておいて
まったく何やってるか分からないってのも困りますし、自分のためにならないぽいので。。。。
こちらはお聞きすることしか出来ませんが、もし余裕があればお願いします。
>>677 さんのコードも試してみました。
こちらも重複する項目の番号が返ってきました。
こちらの説明が足らなかったので申し訳なかったです。けどパッと書けてしまうみなさんは
すごいですね。私もまだまだ頑張らないと。
>>687 さん
>>688 さん、本当にありがとうございました
693 :
nobodyさん :05/01/12 09:12:09 ID:SoBMVf5u
携帯用の非会員制ネットショップをPerlで構築してる途中です。(最後にmysqlに突っ込む形式)
携帯はキャリアごとに画像形式などが違うので完全に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
>>693 相手のIPで照合するとセキュリティ的にも最高品質ですよ。
なのでサーバー側にファイルを作るか、MySQLでやるかだけですね。
>>694 post形式でやってれば通常のセッションIDを保持していく方法でもセキュリティに
差はないだろ。
696 :
nobodyさん :05/01/12 10:52:46 ID:190vuMua
>693
>
http://www.2ch.net/?page=index&商品番号=数量&商品番号2=数量2 >等の形式で常にリンクURLの後ろに注文内容を保持していく方法です。
>getの制限である255byteはそうそう超えないんで大丈夫だと思いますが・・・・
どう考えても、やめた方がいいだろう。
おれは、携帯の場合、ファイルベースの簡易的なセッションを自作して使ってるけどね。
>PCサイトではcookieに注文内容を詰め込んでいたので
さらにこれも危険。
>694
携帯ってリクエスト毎にIP変わらなかったっけ?
>>690 すみません、調べたのですがわからず質問したんですけど
教えていただけないでしょうか?
699 :
693 :05/01/12 11:53:12 ID:SoBMVf5u
>>694-696 >どう考えても、やめた方がいいだろう。
え;どうしてでしょうか?
漏れるからですか?アクセショップなので注文内容は漏れていいですが・・・
っていうか注文内容が漏れてまずかったらお店で買物なんてできませんよね。
もしかして住所などの個人情報を懸念してるのですか?
それでしたらSSL+POSTでやっていますが。
もう少し自分で調べてみますm(_ _)m
a,b,c 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 /,/;} なんかおかしなことに。
↑誤爆ですハッシュで一発でした
>>701 せっかく問題を提起したのだから、解決コードも書いて置くと後学の為になるし、
コードに改善点があれば誰かが指摘してくれるよ。
703 :
693 :05/01/12 14:07:08 ID:SoBMVf5u
問題に気付きましたorz URLに注文内容を圧縮して持たせる場合常にURl自体に注文内容が含まれてるので 購入中にトップページにブックマークした場合、いつ来てもブクマしたときの 注文内容が残ってしまいますね・・・ しかしURLにセッションIDを持たせたとしても同じことがおきますよね。 もちろんサーバ側のファイルを最終アクセスから2時間たったものは消していけば いいですけど、古いセッションID付でブクマされると何か嫌ですよね。 みなさんはどうやって古いID付でブクマークされるのを防いでるのですか?
>>703 全部のリンクをPOSTにして、hiddenフィールドでデータの受け渡ししたら?
俺だったらセッション管理するけど。
706 :
nobodyさん :05/01/12 19:39:08 ID:iuHcyFLg
URLエンコードについてお願いします。 持っている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]だから記号もエンコードしてしまうのではと 思うんですが…。 よく分かってなくてすいません。よろしくお願いします。
>693 最初にアクセスしたtimeでも引っ張って一時保存ファイルでも作れば? そっちに注文内容とか入れ込んで、一時保存ファイルの作成時間が一時間以上前のものなら消すとか >696 >携帯ってリクエスト毎にIP変わらなかったっけ? DoCoMoは変わる、auは変わらない、Vodaはシラネ
>>706 前者が正しいが、区別せずにデコードする事が多い(例外は見たことない)ので問題無い。
>>706 reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
これはエスケープする。
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
これはエスケープしなくてもいい。しても構わない。
http://www.ietf.org/rfc/rfc2396.txt
710 :
706 :05/01/12 20:57:40 ID:???
Perl使ってDBから読み込んだものを表示するプログラムを作っているのですが、「弊社」が「弊ミ」と文字化けしてしまいます。 日本語文字コードらへんで何か変わった問題とかあるんでしょうか・・・。どう対処すればいいのか分かりません… 宜しくお願いします。
>>711 DBへ格納している文字の文字コードは?
そのプログラムソースの文字コードは?
恐らく、その両者の文字コードが一致していないと思います。
713 :
693 :05/01/13 09:14:06 ID:mOXqnzCM
>>704 スレ違いなのですか?
Perl特有の解決方法などがあると思いましたが、全言語共通なんですか?
とりあえず誘導ありがとうございますm(_ _)m
>>705 postでやるのは考えましたが、テキストリンクぽく見せるのが不可能ですよね。
ボタンやセレクトボックスになってしまうと違和感があるので・・・
cookieもCGIセッション管理も、perlに限った話ではない。 よってスレ違い。
そもそもここコーディングスレだし
>>712 さん
ありがとうございます。表示以外は全部EUCです。
ただ、文字コードの違いだったらもっと激しく全部文字化けすると思うんですが、一部の文字なんです。
他の件でPHP使ってるときにも¥が入るとかそういうのがバックスラッシュのエスケープとかであったので、
それと似たものなのかなぁと色々検索したんですが、、、、それっぽいのも見つからず…。
どうしたもんでしょうか…
>>716 わたしとしては「弊社」より「弊ミ」のほうが面白いからOKかと。。
>>716 Shift_JIS の「社」は \x8E\xD0 。
EUC-JP の「ミ」も \x8E\xD0 。
719 :
nobodyさん :05/01/13 14:25:30 ID:F0U77FE9
Encode::from_to でcp932からutf8へ変換を行っているのですが、そのあと、 文字化けを起こしている(マッピングに失敗した)文字を?とか★とかに変換 したいのですが、どのように行えばいいのでしょうか? ごくごくまれに外字と思われるものがあるのです。 一旦dbに入れてcsvとかで出す時にそのたった1文字のためにそれ以降全部バケちゃうことがあるのです(泣)
ヒアドキュメント内でモジュールのメソッドを呼ぶ時はどうやればいいですか? メソッドが返す値はただの数字です。
ヒアドキュメント内じゃないといけないのか
先に計算すればいいだろ.
Winの環境でタイムアウト処理はできますか?
1: 自分はこういう事がしたい。 2: それでこんな風にやってみたが・・・ 3: こんなエラーが出て上手く行かなかった。
#use strictはしています。 コマンドプロンプトからPerl -cでぷろぐらむのチェックをしたら syntax okが出るにも関わらずlocalhostからブラウザでやってみると 500エラーが出るのは何故でしょうか? こういうときはどうやってデバッグすればいんでしょうか? 何が悪いのか検討がつかずに困っています。
726 :
720 :05/01/13 16:06:32 ID:???
>>721-722 たしかできたはずですが久しぶりなので思い出せないのです。
一旦リファレンスにするような感じだったと思うのですが^^;
728 :
725 :05/01/13 16:16:56 ID:???
できましたm(_ _)m cgi::sessionのコンスラクタ呼び出しの際に3つ目の引数にカーリーブレス?を付けておくのを 忘れてました。 しかし今回は運良く早期発見できましたが、こういうときにいいデバッグ方法あrましたら 教えてください。
エラーログを見る
>>726 print <<EOF;
1 + 2 = @{[ 1 + 2 ]}
EOF
>>716 Shift_JISなら分からなくも無いけど…。
Shift_JISの「ミ」も\xD0。
# またはDBの最新バージョンで人柱状態?
>>719 0xF040から0xF9FCの外字なら、予めチェックするしかないかも。
>>731 ?
全文検索のスクリプトに、5件毎や10件毎表示させる機能をつけたいのですが うまくいきません 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; } (続く)
735 :
734 :05/01/13 21:17:55 ID:???
(続き) #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"; } #} }
736 :
734 :05/01/13 21:19:50 ID:???
実行結果は1件もHITしなくなりました 動作も正常に動いてはいないようです どなたか知恵を貸してください よろしくお願いします
737 :
nobodyさん :05/01/13 21:27:49 ID:RpTwbNys
単純なスペルミスじゃねーのかい? $begin $bigin use strict を使う癖をつけましょう。
738 :
734 :05/01/13 21:57:15 ID:???
>737 ご指摘ありがとうございます うっかりミスです しかし直しても動作は変わりありません 構文自体が悪いのでしょうか? 頭がテンパってきました 助けてください…
739 :
nobodyさん :05/01/13 22:01:32 ID:RpTwbNys
>>738 もうちっと、ソースを整理して晒しておくれ。
search2というのが何なのかも分からないし・・・。
740 :
734 :05/01/13 22:21:11 ID:???
>739 すみません、インデントつけます 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; } (続く)
741 :
734 :05/01/13 22:23:11 ID:???
#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"; } # } }
742 :
734 :05/01/13 22:29:34 ID:???
と○ほさんのWwwsearchをもとにしています #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"; } が自分で付け足した所です
744 :
nobodyさん :05/01/14 07:32:45 ID:3YybYM3/
$hoge=1.4*325; とやると$hogeは455になるのに、 $hoge=int(1.4*325); とやると$hogeは454になってしまいます。 他の数字でも起こるようです。何故ですか? というか、意図した通りにさせる方法はありますでしょうか。
745 :
720 :05/01/14 08:13:20 ID:???
>>730 ありがとうございます。
全然誰も答えないからこのスレ、レベルが下がったのかとおもいました;
数スレ前では自分で誰かに回答してあげた覚えもあるんですが、最近の過去ログは
普通の人は見れないようで。
>>all
お前らもっと精進しろよ、な。
746 :
nobodyさん :05/01/14 09:27:13 ID:AgX5dpSc
my $a = "a*b*c*d"; 異なる意味をもつ字を*で連結した上の文字列の中から1字を消して連結用のアスタリスクの数も 正常にする。 ということがしたい場合どういうみんなコーディングする?aとdでは処理が変わるんだよね。 しかしそれをなるべく簡潔にしたい。
>>744 慣れていないと面食らうがほとんどのプログラミング言語ではそれが標準仕様。
詳しい説明は「浮動小数点数」「精度」などで検索すれ。
防ぐ方法は幾つかある。まぁこのケースなら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) (ただし破滅的なほど遅い)
749 :
nobodyさん :05/01/14 09:35:33 ID:az2EqpkZ
$hoge1と$hoge2の2つの変数があるとします。 この2つの変数内の文字列を比較していって、先頭から同じ文字が続くところまで$hoge2から削除するにはどうすればいいでしょうか。 たとえば、$hoge1=a/b/c/d/,$hoge2=a/b/c/d/e/f/だったら、$hoge2=e/f/としたいのです。
750 :
746 :05/01/14 09:37:35 ID:AgX5dpSc
一応自分のコーディング(aの場合) $a =~ s/a[*]?//; $a =~ s/[*]*$//;
$a =~ s/^$hoge1//; ?
>>750 $a .= '*';
$a =~ s/a\*//;
chop $a;
$aを使うのはお勧めできないがそれは置いておこう。
753 :
749 :05/01/14 10:58:23 ID:az2EqpkZ
あ、すみません 例が適切でなかったかも知れません $hoge1='a/b/c/d/e/f' $hoge2='a/b/c/d/g/h/' だったら、 $hoge2='g/h' にしたいのです
754 :
nobodyさん :05/01/14 11:42:26 ID:LszGQepz
unixサーバ上で 「Win32::OLE」は使えないのでしょうか? もし使えないなら、代わりになるものはありますか?
>>753 my $re = '';
foreach (reverse split //, $hoge1) {
my $q = quotemeta($_);
$re = "(?:$q$re)?";
}
$hoge2 =~ s/^$re//;
>>753 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
757 :
734 :05/01/14 12:52:14 ID:???
>743 誘導ありがとうございます 逝ってきます
758 :
nobodyさん :05/01/14 15:29:10 ID:AgX5dpSc
携帯用のショップのCGI部分をPerlで作成中です。 現在注文管理部分の注文してくれた客に出す「確認メール」というものを作成するための メールフォームを作っています。 docomoでは500byteまでという制限があります。 500byteなんてあっというまなので対策を考えてます。 一つ考えたのは500byteを超える場合は2通に分割するという方法です。 しかしマルチバイト文字の途中で分割すると2通目以降が悲惨なことになるので どうにかしてそれをクリアにしたいです。 「確認メール」の内容はその時によって違うので、先に分割地点を決めるのは無理です。 メールフォームを使うのは500byteの意味を知らないパートさんで、入れ替わりなので 扱う人間に期待をするのは難しいです。 メールフォームでつくられた本文を受け取り送信する側のCGIで何とかしたいです。 日本語を綺麗に途中で分割することってできますか?簡単にできるモジュールなどありましたら 教えてください。
760 :
758 :05/01/14 15:49:19 ID:AgX5dpSc
>>758 Jcodeモジュールのfold使えば?
762 :
758 :05/01/14 16:20:31 ID:AgX5dpSc
>>761 Jcodeですか。調べてみます。
ところで
$a = 100/3;
のように$aに小数点が含まれる場合は切り上げをしたいんですがどうすればできますか?
切捨てはintで一発ですが、切り上げは一度小数点があるかないかを調べないとダメです如根。
>>762 if ( $a =~ /\./ ) {
int $a;
$a += 1;
}
整数でなければ小数。
>>762 $kiriage = ($a == int($a)? $a : int($a + 1));
>>762 POSIXモジュールのceil使う手もある。
767 :
758 :05/01/14 16:59:43 ID:AgX5dpSc
>>762 perlメモ風の切り上げ処理は
$tmp2 = int($tmp1) + ($tmp1 <=> int($tmp1));
かな。
>>747 ありがとうございました。整数でやってみます。
769 :
nobodyさん :05/01/15 13:17:48 ID:X2SjZomE
プログラミングを頑張るのではなく、500バイトに納まるように書かせる努力をした方がいいと思うけどなぁ。 何通もメール送られたらユーザーも迷惑でしょ。
770 :
nobodyさん :05/01/15 14:59:51 ID:2P0rPuHE
Perlのテストしてたら出来なくて。 formtest.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があるんですが、それはは動き ます。
772 :
nobodyさん :05/01/16 10:58:07 ID:LfCWlcLW
ネットショップとかで全頁をCGI(Perl)にするときに、商品数があまりなくても すぐ2000行とかになっちゃうんですが、普通ですか? 長くなりすぎてちょっとした内容修正の時にも該当箇所までスクロールするのが面倒 だったりします。 みなさんはどうやっておられるのでしょうか? HTML部分を別ファイルにしてメインプログラムから読み込むだけのような 形式にしてるのでしょうか?
DBでも使えば?
・ネットショップとかでページにロジックを埋め込むのは止めろよ ・コードの行数は処理次第。各ページ2000越えるのはありえない。全体で2000行のCGIでショップ運営もありえない ・めんどくさがりすぎ。行ジャンプかインク李メンタルサーチで移動 ・HTMLは当然別
> ネットショップとかでページにロジックを埋め込むのは止めろよ ページベースの設計してるPerlCgiは今はそんなにないよ。
商品数によってプログラム規模がでかくなると 思ってる時点でなんかヤバイ気がするんだが 気のせい? もちろん大量の商品があるのでみつけやすいよう に検索や分類の機能を作りこむとかで規模増える ことはあるだろうけれども、そういう意味で言っ てるようには見えない。
たしかにスクリプト中に商品データ書いてるようにしか見えない。
778 :
772 :05/01/16 12:13:57 ID:LfCWlcLW
>>773-776 多分みなさんレベルから見たらかなりマヌケなコーディングだと思います;
基本的に一つのindex.cgiで全頁のメインを書いてます。
現状ではHTMLもかいてます。それぞれわけるなら全面CGIにする必要性もあまり感じられませんし。
>>776 行数は増えていくと思います。商品の紹介文などを別にしない限りは。
多分みなさんが言うのはHTMLや商品コメント、価格その他はDBに突っ込んで
メインから読み込んで処理しろということだと思います。
現状は商品コメント以外はテキストファイルに作ってありますが、
なんとも中途半端な状態です。
かなりヒントになりました。あちがとうございます。
一つ質問ですm(_ _)m
使い終わった変数をundefしたいというか削除したいのですが、
undef $a;
これだとスカラー一つ筒しかできないのですがどうやればいいんですか?
my ($a,$b,$c,$d) = (undef)x4;
今はこうやってますが、これってほんとに
undef $a;
undef $b;
..
と同じ効果が得られているんでしょうか?一応中身は消えてるみたいですが。
779 :
772 :05/01/16 12:19:44 ID:LfCWlcLW
my ($a,$b,$c,$d) = (undef)x4; 書き間違えです。 ($a,$b,$c,$d) = (undef)x4; こっちです。
>>779 my ($a,$b,$c,$d) = (undef)x4;
foreach($a,$b,$c,$d){
printf "%sdefined", defiend $_ ?'' : 'Not';
}
>>780 アー逆スマソ。
my ($a,$b,$c,$d) = (undef) x4;
printf qq|%s -> %sdefined\r|, $_, defined $$_ ? q|Not| : q|| foreach(qw|a b c d|);
>>772 よくわからんが、HTML::Template 使うと幸せになれるとかそういう話じゃないのか
使い終った変数を undef したいというのも、なぜそんなことをしたいのかよくわからん。
巨大なメモリを喰うオブジェクトを destroy して解放したいというならわからんでもないが。
>>778 まず、明示的なundefが必要なグローバル変数を減らせ。
>>772 みたいなやつが商売で使うものを作るとは恐ろしや・・・
>>784 $cはエラーになるが、
$aと$bはエラーにならないのは知ってるよね?
787 :
784 :05/01/16 19:35:11 ID:???
>>786 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.
>>784 > グローバル変数をundefするというのなら、
> undefするより別の名前の新しい変数を作るべきです。
undefにはメモリの開放という働きもあるので、一概にはいえない。
>メモリの開放 (´,_ゝ`)プッ
>>789 チンカス君はメモリの開放という表現が嫌いかな?
↓これを
$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は実装メモリで加減してくれ。
use Benchmark; $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)
ガベージコレクタの邪魔にしかなりませんね
>>791-792 馬鹿?
実装メモリの1/4位は取ってみろ。
test1は何見てんの $a確保→開放→$b確保→戻る 意味ねー
>>794 undef有効の場合
>>790 は各々1回しか実行しない。
$a確保→$a開放→$b確保
使用メモリ: $sizeMB
>>793 は各々10000回実行する。
$a確保→$a開放→$b確保→$a確保→$a開放→$b確保→
使用メモリ: 2*$sizeMB
全然違う。
>から始まる行から>のない行まで(まだレベルが低いのでネストは対応してません)、を引用にしようと思い、 $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要素を閉じる、という処理です。 現状では問題は発生しませんが、 「こんな書き込み方をされたらこんな問題出るだろ」というのとかありましたらお教え下さい。 次はネストに挑戦しようと思ってるんですけど、この段階で穴がありそうな気がして前に進めません。
797 :
784 :05/01/17 07:07:24 ID:???
>>788 確かに変数を増やすのはメモリを使いますが、
>>790 のような何MBというデータは
果たして本当にグローバル変数で確保しておく必要があるのでしょうか。
メモリの1/4を使うというというのなら、設計から見直して、変数を局所化する方法を
探してみたほうが良いと思います。
>>796 想定している$resの内容がちょっとわからないけど、
$res = "<p>>引用<br></p>";
<blockquote><p>>引用</p></blockquote><p></p>
# 続くP要素内がカラになる
$res = "<p>>引用</p>";
<p>>引用</p>
# 引用できない
799 :
772 :05/01/17 08:55:35 ID:???
みなさんありがとうございます。 作成中はuse strictしてるので、局所化はしています。 undefしたいのは気持ち的な問題で、コードを自分で読むときに この変数は用無しというのをハッキリさせたいだけです。 あほらしいと思いますが、ブロック内でのローカル変数も たまにundefしています。メモリ云々は考えていません。
800 :
772 :05/01/17 09:03:45 ID:???
>>781 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が聞いてるようです。
>>798 引用の次に文章が来ないと、引用にならない、って問題ですね。
なるほど。甘かったです。
802 :
nobodyさん :05/01/17 10:46:32 ID:1F0SQQP0
my @a = qw/1 2 3 4 5 6 7......99/; この配列の中から0以上50未満の一番大きい数値を値として持っている のは何番目かを簡単に調べることはできますか? sort関数はなにやらややこしいので、いまいち理解できていませんが、 やはりsort関数を使わないと難しいでしょうか?
>>802 降順ソートをかましてforeach内ifの条件を50未満にすれば一発。
804 :
802 :05/01/17 11:52:05 ID:1F0SQQP0
>>803 ありがとうござまい。とりあえず作ってみました。
1つのサイズの上限を決めて改行分割の最大限サイズで分割するものです
一応動くのですが他に思いつかないので無限ループをしています。
$limitがいくつであってもループから抜けれるようにはしてありますが、
できれば無限ループは怖いし、共用サーバでは他人に迷惑をかける可能性があrますので
避けたいです。
無限ループを使わずにこれと同じような処理をすることは不可能でしょうか?
805 :
802 :05/01/17 11:55:51 ID:1F0SQQP0
my $ascii = '[\x00-\x7F]'; my $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>"}
>>802 $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の方が速いかも。
807 :
nobodyさん :05/01/17 16:41:34 ID:wVIIMywn
POSTで送られてきた内容に対して 値を返したいのですがどうすればいいでしょうか?
1: 入力されたユーザー名のユーザーを作りたい 2: System("su passwd useradd $username その他のオプションも exit"); これじゃ無理だと思いながらやたンですけどヤパリ無理でした
>>808 sudoつかえば? 注意して設定しないと穴になるけど。
811 :
nobodyさん :05/01/17 21:05:30 ID:fcKelFvp
配列の中に特定の要素が一つでもあればOKと言うような コードを書くのに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と同じもしくはそれ以上の速度が出せるような コーディングの仕方はないものでしょうか・・ アドバイスお願いします。
813 :
811 :05/01/17 22:07:21 ID:???
>>812 大変貴重なページを教えていただきありがとうございます。
How can I tell whether an list or array contains a certain element?
あたりに載ってますね。それ以外にも勉強すべき内容が沢山あって本当に助かりました。
814 :
nobodyさん :05/01/18 01:27:26 ID:5YMtxRb8
CIGでアクセスログの取得を考えています。 ログ取得に関する部分は下記の通りです。 if(open(FL,">> $file")){ print LOG "時間\tIP\tHPST\tなど…\n"; close(FL); chmod 0666,$file; } ログの解析や表示に時間がかかるのは問題ないのですが、 保存には負荷がかからないようにと考えています。 追加書込モードなら負荷や破損を押さえられると思うのですが、 20万〜30万行程度の蓄積となると負荷は相当違ってくるものなのでしょうか?
815 :
814 :05/01/18 01:29:10 ID:5YMtxRb8
>>814 に関して訂正
ログ取得に関する部分は下記の通りです。
if(open(FL,">> $file")){
print FL "時間\tIP\tHPST\tなど…\n";
close(FL);
chmod 0666,$file;
}
816 :
nobodyさん :05/01/18 01:43:47 ID:Oto1zFxV
SSIが使えないので、Perlスクリプトをimgタグで呼び出すように作ったんですが、 IEで見た場合、画像が無い時のxが表示されてしまいます。 これをうまいこと出さないで、imgタグでスクリプトを呼び出す事は出来るでしょうか?
>>816 1*1ドットの透過画像でも表示させましょう。
818 :
nobodyさん :05/01/18 02:46:19 ID:sIFYihq9
会員約500人分のデータ(URLやサイトの紹介)をWeb上管理したいですが、 このぐらいの数を管理するのに良い方法ってありますか? 使っているサーバはPHPは使えません。 今まで修正・削除などを 「ファイル開く→全データ取り込む→該当データを検索→処理→処理結果を反映して保存」 この単純な方法でやってきたんですが、もっと良い管理方法がありますか?
820 :
nobodyさん :05/01/18 03:43:06 ID:mDYssaxT
フォームメールを改造しています。 print <<END_OF_MESSAGE; … $ { PrintMessage() } … END_OF_MESSAGE sub PrintMessage { #ここにある配列を加工したものを上に出すにはどうしたらいいでしょう? }
>>820 その関数PrintMessageではデータの加工ぐらいしか行わない方が良い。
${}を使ってヒアドキュメント内で出力させるようにするにはprintを使わないと行けない上に、
出力した物は${}があるところではなくヒアドキュメント内の一番最初に出力される。
だから、一回ヒアドキュメントやめるか、配列とか変数に入れといてヒアドキュメント内で出力した方が吉。
823 :
nobodyさん :05/01/18 04:22:12 ID:mDYssaxT
>>821 > 出力した物は${}があるところではなくヒアドキュメント内の一番最初に出力される。
げげっ、それは知りませんでした。書き直します。
ありがとうございました。
>>821 副作用じゃなくて文字列返す関数にして、スカラー式を
文字列リテラルに埋め込む慣用句の${\(式)}使えばいい。
print <<END_OF_MESSAGE;
…
$ { \PrintMessage() }
…
END_OF_MESSAGE
sub PrintMessage {
my $s = "適当な文字列";
return \$s;
}
825 :
nobodyさん :05/01/18 10:17:22 ID:aExMxO8W
my $a = "aeo,huor,tuuu,gfd"; my $b = "aio,r,3s2r,waaaas,tuuu,huor"; $bの中から$aにないものを削除したいんですが、どうすればいいでしょうか? $aにあるものを削除するのはわかるので、$aにあるものを$bから新しく$cに移す という方法は思いついたのですが、なんかいけてないんですよねorz もっとかっこいいやりかたできませんか? 人間の脳みたいに、違うものという判断をしたら該当部を削除するといった処理を。
>>825 こんなんでどうでしょう?
#--------------------------------------------
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;
#--------------------------------------------
827 :
826 :05/01/18 12:17:02 ID:???
↑ map と split の前に タブスペース お願いします。(見やすく) 私も質問なんですが、 ライブラリとかモジュールは、 @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) 〜 でやればなんとかできるんですが、 もっと上手い方法でできるなら教えてください。 調べてもわからなかったのです。 そういうことを書いてあるページとかあったらそれでもいいですので。
>>820 sub PrintMessage{
my $message;
# ...
return \$message;
}
print <<EOT;
${ PrintMessage() }
EOT
>>821 ごく一般的なイディオムだと思うが?
>>824 知識が半端過ぎますから!残念!
>>828 関数の戻り値は文字列にして${}の中でリファレンスとる方が
オレは好きだな。
sub PrintMessage{
my $message;
# ...
return $message;
}
print <<EOT;
${ \PrintMessage() }
EOT
830 :
820 :05/01/18 13:25:04 ID:fG6Vu+xI
その後、下のようにしたのですが、配列(文字列配列)の2番目以降の先頭にスペースが 入ってしまいます。 print <<END_OF_MESSAGE; … @hairetu … END_OF_MESSAGE 配列の中身を出すには、↑のようなやり方はまずいんでしょうか?
>>830 配列を文字列リテラルに埋め込むときは要素間に特殊変数$"($LIST_SEPARATOR)の値が
埋め込まれる(デフォルトは空白)。
これが嫌ならば$"を空文字列にしておくか、配列をつなげた文字列を作って別の変数
にいれてそれを埋め込むか、式を埋め込む慣用句で${\join('', @hairetu)}などと
する。
832 :
820 :05/01/18 13:43:04 ID:fG6Vu+xI
>>831 おお、ありがとうございます!
> ${\join('', @hairetu)}
↑これでうまくいきました。(ぺこり
PerlにCのatoi()に相当する関数はあるの?
>>833 二通りの答えが考えられるが、質問の詳細が分からないので両方書いておく。
1.ある
2.ない
perlは文字列の先頭が数のように見える文字列は数として 使うと自動的に数に変換するので、明示的にatoiのような ことをする必要はない。 しかし、atoiとは違って小数点を含んだ文字列は適当小数 に変換してしまうので、厳密にatoiと同じ仕様が欲しければ CPANモジュールのatoiのようなものを使うか自前で似たような ことをしなければならない。
eval()使えばいい。
>>835 すまん、POSIXのatoiはC-specificなので存在しなかった。
整数部が欲しければintを使えということになっている。
もちろんperlのintだとCのint型があふれるような大きな
数でもそれなりに変換できてしまうので、全く同じでは
ない。
例えば手元のC処理系ではatoi("9999999999999")は
2147483647になるが、perlでint("9999999999999")
はそのまま9999999999999だった。
その辺まで同じにしようと思うとXSでatoi呼ぶモジュール
作る方が楽かもな。
838 :
nobodyさん :05/01/18 16:52:34 ID:SYAXE7mK
phpで、あるファイルのmime typeが「jpgまたはjpeg」であるか否かを判定するには、 どうかけばいいんでしたっけ???
ベンチマークをしたいので、 use benchmark; と書きましたが、syntaxエラーになりました。 どうすればよいですか? #! パス use benchmark; print 'テスト';
#! パス use Benchmark; print 'テスト';
ダブルヘッダー
>> DOS窓でテストしていますので、今はコメントアウトしています。
>>845 benchmark; をコメントアウトすればわかるだろ。
RDMをフラットファイルで取り扱いたいのですが、サーバにDBD::CSVが入っていません。 何か良い選択肢は無いでしょうか?
お爺さんは山へ芝刈りに、お婆さんは川へ選択に…
849 :
nobodyさん :05/01/19 17:43:55 ID:ay48KDLy
PerlMagickの質問です。 下のソースで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画像にするにはどうしたらよいのでしょうか?
>>849 $simg->[...]で1枚だけ適当に取り出せばいいんじゃないかな。
$simg = Image::Magick->new;
$simg->Read($inimage);
$simg = $simg->[0]->Transform(geometry=>$width_size);
$simg->Write($putsam_jpg);
とか。
851 :
nobodyさん :05/01/19 20:17:15 ID:ms2pliGv
プロセス間通信で共有メモリを使ってメモリ節約したいと思い IPC-SharedCacheと言うモジュールを見つけたのですが windows環境では使えないみたいです。 windows環境で共有メモリを使えるようにする方法はないものでしょうか? OSは2000SP4です。 助言いただければ幸いです。 #必死こいてドキュメント英訳したのに・・最初にactivestate行って使えるか確認しとくんだった。
852 :
nobodyさん :05/01/19 23:06:54 ID:yPuKv0T8
CGI始めて1ヶ月たらずのド素人です。どなたか教えて下さい。 htmlのページから < a href="abc.cgi">A氏</a> < a href="abc.cgi">B氏</a> というようなリンクでabc.cgiを呼び出した時、abc.cgi側で、 A氏、B氏のどちらのリンクで呼び出されたかを判断するに は、どうすれば良いでしょうか?A氏で呼ばれた場合と、B氏 で呼ばれた場合で処理を変えたいのですが。。なにか関数とか あるのでしょうか? なにか的外れなことを言ってたらすいません。m(_ _)m
<a href="./abc.cgi?auther=A">A氏</a> <a href="./abc.cgi?auther=B">B氏</a> とか、 続きどぞー ↓
<a href="./abc.cgi?orewa=A">A氏</a> <a href="./abc.cgi?orewa=B">B氏</a> とか、 続きどぞー ↓
855 :
nobodyさん :05/01/20 00:21:57 ID:yz6Kh3Ct
ore dattara auther dehanaku author to kakuna-.
>>851 Win32::MemMap というモジュールなら共有メモリを使えるとの噂は聞いているのだが、
入手方法すらわからん状態なので、俺の代わりに見つけてきてくれ
857 :
nobodyさん :05/01/20 01:00:19 ID:xH8/53fr
>853 >854 >855 852ですが、せっかく回答頂いたのですが、なにせ素人でいまいち 分かりません。。 "?"の後は変数名でしょうか?html側で変数に値をセットしておけば、 abc.cgi側で参照できるのですか?(全然違う??) できれば、cgi側の記述はどうなるか教えて下さい。m(_ _)m
>>827 なにをどう簡単にしたいのか解らんが、サブルーチンにするんじゃだめなのか?
後、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];
861 :
849 :05/01/20 14:03:27 ID:???
>>850 1フレームだけの抽出が出来ました。ありがとうございます。
862 :
851 :05/01/20 14:57:39 ID:???
863 :
851 :05/01/20 14:58:39 ID:???
Microsoft (R) KKCFUNC バージョン 1.10
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も完了し 正常にインストールされる為、原因がわかりません。
864 :
851 :05/01/20 15:07:00 ID:???
連書き失礼します。 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等を生成してくれないため試すことができません。
865 :
nobodyさん :05/01/20 18:15:40 ID:8gUpqVNO
EUC-JPでURLエンコードされた文字をUTF-8に変換したいとき Encodeモジュール使ってやると $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
866 :
865 :05/01/20 18:29:47 ID:???
いけました
868 :
nobodyさん :05/01/20 21:58:37 ID:2X1THOk4
tieを使ってDBMファイルに書き込んでるんですが、DBM内から任意のハッシュのみを削除するにはどうすればよいのでしょう? 例えば$data{"test"} = "foo";というデータがあって undef($data{"test"});としても$data{"test"}=undefとなって削除できないです・・・。
869 :
851 :05/01/20 22:03:45 ID:???
>>867 ・・・おっしゃる通りでした。てっきコンパイラそれ自体だとばかり思っていました。
そうすると逆に正常にインストールできたモジュールのほうがおかしいことになりますね。
誘導までして頂いてありがとうございます。
因みに
nmake15.exeを解凍し、でてきた
NMAKE.ERR
NMAKE.EXE
README.TXT
を同様にC:\perl\added\に置いて設定しましたがエラーがでてしまいました。
これからは誘導先に移らせて頂きます。
871 :
nobodyさん :05/01/20 22:08:28 ID:2X1THOk4
すいません、馬鹿な書き込みしました。868は忘れてください。 DBMファイルに一定の連想配列が保存されている時に、それらのデータを読み込まず 任意の連想配列のみを削除することは出来ますか? データを空にすることはできるのですが、その連想配列自身を消すことが出来ないんです・・・。
あ、 delete $data{'test'}; ですたm(_ _)m
873 :
nobodyさん :05/01/20 22:32:19 ID:2X1THOk4
>>872 ありがとうございます。やってみたんですが、やっぱり消すことが出来ません。
ハッシュの書き込みなんですが以下のようにやってます
%writehash = (%writehash, %$data);
%$dataが追加するデータです。
もとのデータを%$dataに読み込んでdeleteし、
%writehash = %$data;
とすれば実現できたんですが、一度データを読み込まなければいけないので、、、
>>873 手元では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
>>859 ありがとう!(゜∀゜)
やってたこと同じだったけど、1行文が簡潔で参考になりました。
876 :
nobodyさん :05/01/21 12:37:45 ID:AnHfdE4Z
while(1){ while(1){ if ($a == 1){ ここで二つの無限ループを抜け出したいんです} } } ifの中になんと書けば2つ一気にでられますか? activeperl5.6.1が自宅環境でサーバでは5.8.1のようです。 宜しくお願いしますm(_ _)m
NUKERU: while(1){ while(1){ if($a == 1){ last NUKERU; }
878 :
876 :05/01/21 13:49:59 ID:AnHfdE4Z
>>877 ラベルを使えばいいんですね。
でもラベルってループ文が出てくるより前に書くのですか?
無限ループになりそうで怖くて試せません。
後ろに付けてもぬけれましたが、その後の処理をしてくれませんでした。
while(1){
last A;
print 1;
}
A:
print 2;
表示結果は白紙です。どういうことですか?
879 :
876 :05/01/21 13:51:47 ID:AnHfdE4Z
できました;
880 :
nobodyさん :05/01/21 16:01:36 ID:AnHfdE4Z
初歩的ですみませんが、 use CGI:cookie; などの::はどういう意味でしょうか? モジュールは通常ファイル名とpackage名が同じでないといけませんよね? でもactiveperl5.6.1に標準付属のモジュールは結構ファイル名とpackage名が 違うのがあります。 どうしてそれで正常に動作できるのでしょうか? package名なんてファイルを開いて見ないとわかりませんよね?
>>880 フォルダ内にあるよってことさ。
だから例えば
use lib '/home/ユーザ名/public_html/cgi-bin';
のようにしてcgi-binの中にCGIというフォルダを作成して、その中にCookie.pmを
コピーすればCGI::Cookieの名前で呼び出せる。
まあ標準付属のモジュール以外使えないサーバ使ってる人間にとっては常識なんだがね。
882 :
880 :05/01/21 17:23:19 ID:AnHfdE4Z
>>881 そうなのですか?
今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を見つけられないというエラーではないのでしょうか?
それはさらに他のファイルに依存しているというだけの話だし、 お前が省略した@INCの中身のどれかのディレクトリの下に auto/CGI/Session/autosplit.ix があればよし、なければ インスコがうまくいってないということだな。
884 :
nobodyさん :05/01/21 19:59:35 ID:4xlCPraB
apache + mod_perlで作成していたのですが、SSLを導入したところ、 [Thu Jan 20 17:45:21 2005] [error] 1992: ModPerl::Registry: 103:Software caused connection abort at ・・・ といったメッセージが ssl_access_logn に出るようになってしまいました。 sslを使わなければこういうメッセージは出ません。httpsでアクセスした時だけです。 なぜこういうことが起きるのでしょうか? (このスレで合ってるかな?)
886 :
nobodyさん :05/01/21 20:18:35 ID:4xlCPraB
888 :
nobodyさん :05/01/21 20:40:01 ID:4xlCPraB
親切にどうも。 分からないならそう言えば^^
そこでんな事いわなきゃ親切な香具師が教えてくれた物を、
諦めるか自力で調べる気になったのだろう。 結構なことじゃないか。
>>888 > 分からないならそう言えば^^
「わかりません」のレスが大量に付いたりしてもそれはそれでおもろいな。
わかっちゃいるけど わかりません スイスイスーダララッタ、スラスラスイスイスイ♪
893 :
nobodyさん :05/01/22 09:44:47 ID:e2M6eLer
自分のHPでTrackback Pingを受信したいのですが、 可能ですか?
894 :
880 :05/01/22 10:18:03 ID:6KUU/iOa
>>883 ありがとうございます。あの後自分の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 ローカルパス;
}
}
宜しくお願いします。
>>894 CGI::CarpのfatalsToBrowserが有効になる前にエラーに
なってるのがいちばんありそうだな。置き方が悪いとか
#!〜のあたりがおかしいとか。
鯖のエラーログを見るのが一番早いと思うのだが。
BEGINルーチン内で制御構造使ってもuseはすべてコンパイルされるだろうに。。
897 :
880 :05/01/22 10:54:56 ID:6KUU/iOa
>>895 #!〜の部分は問題ないです。置き方が悪いかはわかりませんが、
既に稼動させてるCGIは5-6個ありますので、そのときと同じ手順ですので
問題ないかと思うのですが・・・
共用サーバでもエラーログってユーザごとにみられるんですか?
通常どこらへんにあるのでしょうか?
>>896 以前は@INCにpushしてた名残なのです。
898 :
880 :05/01/22 11:14:58 ID:6KUU/iOa
解決しました。
899 :
nobodyさん :05/01/22 12:18:08 ID:XoEEKIhN
掲示板を製作中なのですが、 入力フォームのテーブル幅の変え方(Perlに記述する$〜〜) を教えていただけないでしょうか? 書き込んだ後の、表示される記事のテーブル幅の変え方は分かったのですが 入力フォームがどうしても分かりませんでした。 どうぞヨロシクお願いいたします
901 :
nobodyさん :05/01/22 15:42:18 ID: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にはそのようなことは書いてありませんでしたし。 エロイ人お願いします。
>>901 File::findとかでディレクトリ一覧を得てからpush
904 :
901 :05/01/22 17:04:29 ID:6KUU/iOa
>>903 ありがとうございます。
ところで
/home/usr/site/lib
などにあるPerlの標準付属モジュールなどはどうやって@INCに追加されているのでしょうか?
モジュールがインストールされたときに自動的にPerl本体のオプションファイル
みたいなものに書き込まれているんでしょうか?
907 :
901 :05/01/22 19:03:50 ID:6KUU/iOa
>>905 そういう意味ではないのですが;
>>906 @INCの中身を見る限りでは大元だけを登録していて、CGIフォルダなどの個別は
してませんよね。
かわりに
multi treed ...なんとかっていう文字がくっついてるんですよね。
それを付けることによりUNIXがこのファイルより下位層という意味を
汲み取っていたりするんですかね?
>>904 perl.cのS_init_perllib()関数で定義してる模様。
実際の各定数(ARCLIBとか)は環境によって定義するファイルが異なっている。
/win32/config_H.vc(win32 VC用?)では
#define ARCHNAME "MSWin32-x86-multi-thread"/**/
のように定義されてる。
質問です localtime関数で得た時間を配列に代入し、昔に同じようにして配列に代入した値から時間差を秒単位求めたいのですが、 掛け算しまくって秒になおすのを考えたのですが、ほかにもっと良い方法はありませんか?
>>910 timelocalでUTCに戻して引き算
>>910 そもそもlocaltimeに渡す前の値をとっとけば引き算するだけで良かったのにね。
後悔先に立たず。
え、localtime使わずに時間を求める方法があるんですか?
そこは驚くところなのか... time() を教えずに localtime() だけを教えている書籍やWWWページが 結構ありそうだな
timeとlocaltimeの説明を読めばわかるが、現在時刻を 求める関数はtimeで、これはいわゆるunix timeという 1970年1月1日0時0分0秒GMTからの秒数を返す。こっちの 方が足し算引き算もそのままできてコンピュータには 扱いやすい。 しかしそのままでは人間には扱いにくいので見慣れた 年月日時分秒に分解してくれるのがlocaltimeと いうわけだ。こっちは本来はlocaltime(<unix time>) という形で引数を与えて使うのだが、式を省略した ときはtimeの値(=現在の時刻)が与えられたことに なる。 というのをはしょってlocaltimeだけ教えられるとこう いう悲劇を生むのだろうなぁ。
うわ、全然知りませんでした 思いどおりにできました 分かりやすい解説ありがとうございました
917 :
nobodyさん :05/01/23 00:38:29 ID:vqv+/2ig
>>918 すいません。
ソチラ行ってまいります。
920 :
nobodyさん :05/01/23 18:54:50 ID: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'};という感じで変数に 代入して参照できると思うのですが、上記の場合はど記述すれば よいでしょうか?
>>920 どこに入っているかといえば、
$ENV{'QUERY_STRING'}の中に入っている。
923 :
nobodyさん :05/01/24 10:28:19 ID:Yl+XYDvu
sendmailを使って6通連続同一相手(携帯電話)に送信するスクリプトを書いたのですが、 連続送信すると携帯キャリアによっては全部受信するまでに1日近くかかってしまいます。 このスクリプトはメルマガを携帯用に分割して送信するためのものなのですが、 何とか正常に受信できるようにしたいです。 少し感覚を空ければ多少はマシになるかなと思うのですが、Perlでは プログラムの実行中に「1分間停止」みたいな命令はだせないのでしょうか?
924 :
nobodyさん :05/01/24 10:41:34 ID:Yl+XYDvu
sleep!
うむ sleep ただし cron か何かで起動するならいいが、 CGI で実行中に1分も sleep すると タイムアウトで kill される恐れがあるので 気を付けてな
926 :
923 :05/01/24 13:54:19 ID:Yl+XYDvu
>>925 それは知りませんでしたm(_ _)m
とりあえず10秒ずつ休ませるだけで問題なく受信できるようになりましたので、
大丈夫だと思います。
927 :
nobodyさん :05/01/24 14:38:48 ID:KnbcSRWW
$test{"hoge.hage"} $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"} を削除する方法です。
928 :
923 :05/01/24 14:45:29 ID:???
>>927 foreach ( keys %test ){
delete $test{$_} if $_ =~ /^hoge/;
}
929 :
nobodyさん :05/01/24 15:15:44 ID:KnbcSRWW
>>928 ああ、そんな方法があったんですね!ありがとうございます。
ついでに連想配列のキーは数千単位(或いはもっと)であるのですが
速度や効率の面ではどの程度から気にすべきでしょうか?
あ、もしかしてこの方法だと $test{"hogegege.hage"} $test{"hogehage.hage"} のようなhogeを含むものを全部消してしまいますかね? 正規表現で対応すればいいのかな。 #実際のプログラムだと不特定の数字を使っているので #1と11と111が出てきたりします
正規表現でいいんじゃないのかね。 あとスライスをまとめてdeleteした方が速いかも。 delete @test{grep /^hoge\./, keys %test}; とか。 あるいは$test{'hoge'}->{'gege'}->{'hage'}の ようにすれば delete $test{'hoge'} 一発だけど 他の処理のからみもあるので大局的にこれがいい かどうかはわからん。
sub X{ 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の数や位置がいけないのかな・・・必ず残った分が実行されてしまうんです。 なにとぞご教授の方よろしくお願いします。
無限に再帰しようとしてるようにしか見えないのだが釣り?
>>933 釣りじゃないんす。
まじで初心者なもんで原因が分からないんで教えてください。
X();はある障害が起こってないか常に確認をする為にこまめに入れてます。
ABCDEFGH....と順調に動作させたいんですが、
もし障害のXが起きたら$aの値の最初に戻って繰り返しをしたいんですが・・
ここまで目が腐るコード久しぶりに見た。
>>934 お前これ実行した事ねーだろ。
936 :
932 :05/01/25 02:24:52 ID:???
>>935 色々試して何度も実行してますが、解決法が分かりません。
知識0に近い状態からこういうものを作らなければいけなくて
lastとか入れたり色々試したんですがダメで何日も苦闘してます。
初心者って書いてあったんで最終的に質問してみたんですが、
ダメデスカ…。
問題が抽象的な上に何をやりたいのかがわかりにくい。 それ以前に >sub X{ # ← X の中で >if(X()){ return; } # いきなり X 呼んだら無限ループになるだろ
938 :
932 :05/01/25 02:46:47 ID:???
すみませぬ。書き方がよろしくなかったです。 丸い物体が迷路を進むものでテンキーの2468で前後左右に進んで それをsendKeyで送って進みます。 sub X{ if(cmpBmp(X, Y, "$DIR/abcチェックポイント.bmp")){ return; } チェックポイントの黄色い点を画像認識でマッチングさせてそこで つっかかってるようなら最初$aの値に戻るっていう風にしたいんです。 画面内でつっかかると自動的にstart位置に戻ります。 でもこの場合、Bの直後に戻ってもABCDCDのように残った部分もループしてしまって うまく迷路を進むことができず、結局次のEの地点まで行けないのです。
動かんコードを「動くようにして」っていう質問はスレ違いだからね。
>>932 やりたい事は分かった。
要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
それも別の場所でも使うと。
そ れ は 無 理
もっとスリムに書く方法があるべ?ほら。もっと簡単に思いつくぞ?
942 :
932 :05/01/25 05:23:55 ID:???
>>937 ですよね・・ヒントありがとうございます。
>>939 スレ汚し失礼しました。
>>941 >要はマッチングの部分と一連の流れを一つにまとめてサブルーチンにしたいわけだな?
>それも別の場所でも使うと。
はい、その通りなんです。でもやっぱ無理なんですね。
他に方法・・・思いつきませぬ。。
とりあえずサブルーチンの事は後に置いといて考えてみます。
どうもでした。
2005年版パンチ3/5か?
平凡パンチ
久しぶりにココに来た。 テンプレがめっちゃ少なくなってる。 テンプレ見に来たのに。 なんでやねん。 しかもム板のコピーだし。 さらに932はム板でもわけの分からん質問してるし。 ほとんどマルチだし。 なんでやねん。
946 :
nobodyさん :05/01/26 12:13:41 ID:/LVNqA6M
携帯電話用HTMLに変換するスクリプトを作ってます。 <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それぞれの文頭の半角スペース二個が描画されてしまいます。 原因わかる方、お教え願います。
>>946 処理の要所要所でprintしてどこで混入してるか発見したまへ
配列を""で囲んでるのが原因でないの
>>947 それが一番の早道ですよね。
@に入れる直前の時点では文頭の半角スペースがなかったようなので、よくわかりません。
>>948 $a = @a
とすると、配列の行数が出るので、""で括らなきゃいけないと思い込んでました。
とったら一個減りました。
あと一つなんですが、もうちょっと頑張ってみますです。
有難う御座いました。
950 :
946 :05/01/26 13:05:30 ID:???
解決しました。
どこでかわからないんですが、文頭に半角スペースが入ってました。
>>947 「@に入れる直前の時点では文頭の半角スペースがなかったようなので」
とか間違った生意気な発言をしてしまい申し訳ありませんでした。
念のため、もう一度試してみたら見付かりました。
有難う御座いました。
文字列リテラルに配列埋め込む意味とか、printにリスト渡す意味とか 全く理解しないで書いてる香具師が多いってことなのかねぇ...
952 :
946 :05/01/26 13:44:53 ID:???
>>951 私、ですか?
私が@配列に入れた理由は、
header
body中身
footer
のbody中身を18KBで分割するために、@配列に入れました。
なんかおかしいでしょうか?
全て独学なので、間違った使い方をしている可能性は高いですが。
>>952 たとえば文字列リテラルに配列を埋め込むことについては
perldata(1)に
配列変数は、ダブルクォート文字列中で、配列のすべての要素を変
数 $" 中に示す区切文字 (デフォルトはスペース) でつなげて展開
されます。 以下は同値です:
$temp = join($",@ARGV);
system "echo $temp";
system "echo @ARGV";
と説明されているのだが、これを理解していればそのような間違いは
普通しないし、仮にやってしまったとしてもおかしいと分った段階で
これに思い当たりそうなものだということ。
956 :
nobodyさん :05/01/26 22:18:17 ID:NprQarfg
有難う御座いました。
957 :
946 :05/01/26 22:47:36 ID:???
>>954 理解以前にそれ、読んでませんでした。
なんとなく始めて、なんとなく出来上がったので、
問題にぶち当たってから調べる、という非効率的な学習の仕方をしてました。
一度、ちゃんと仕様とか読んだ方がよさそうですね。
糞ソースを見たら 「KEN丁のせい」と思え
959 :
946 :05/01/27 03:44:05 ID:???
>>958 私、ですか?
人のソースは見てないのでわかりません。
配列をダブルクォートで展開すると$"が挟まるのは、初心者には予想できないだろうと思う。 特殊変数がきちんと解説されている本やサイトって少ないしね。
スカラー変数を出力するときに print $hoge,"\n"; print $hoge."\n"; みたいな書き方もあるけど、 print "$hoge\n"; って書いたほうが単純で分かりやすい。 たぶんこういう記法に慣れてるせいで、リストの時も同じような書き方をしてしまうんだと思う。
ヒアドキュメントでよくEOMって使われてますが これって何かの頭文字ですか。
EOT: End Of Text EOD: End Of Data ならわかるがEOMはしらん
EOL: End of line EOF: End of file EOM: End of message
966 :
962 :05/01/27 13:02:45 ID:???
なるほどそうですか。ありがとうございました。 でもそうなると「EOMで挟む」っぽい構造になるのが気持ち悪いですね。 見た目的に。
つ [EOE the End Of Evangelion]
>>966 理解が浅い。
EOMまで、と宣言してEOMの場所を明示しているんだよ。
気持ち悪くない
>>966 自分の視認性を考えたらそのヒアドキュメントに名前をつける、という感覚の方が、
あとでメンテするときも楽だと思うのだが、そんな俺の発言は余計な御世話だったと思う。
970 :
nobodyさん :05/01/27 15:56:03 ID:ZopGQTdq
$a = qq|<center>hogehogehoge<br>hogehogehoge<br></center> あいうえお<br>kakikueko<br> |; $aの中のものを置換したいです。 <center>は<CENTER>に </center>は削除 <center>..</center>内の<br>は<BR><CENTER>に <center>..</center>外の<br>は<BR> こういうのをしたいんですが正規表現で一発では無理ですか?
>>970 アホな漏れはつい
$a =~ |(<center>.*?)<br>(.*?</center>)|\1<BR><CENTER>\2|g;
とか考えたが、これじゃあ<br>が一個以上だとダメだなw
正規表現では無理じゃない?<center>(*.?)</center>こうしてから
$1 =~ s|<br>|<BR><CENTER>|g;
ってやって元の場所に突っ込むとかは?
あ、元の場所に突っ込みようがないか?
>>970 $a =~ s|<center>(.*?)</center>|<CENTER>@{[\1 =~ s/<br>/<BR><CENTER>/]}</CENTER>|g;
とかでどうだ?
今は試す環境がないからなんともいえないが
>>970 パズルとしてはおもしろいのかもしれないが、
メンテしにくくなるだけなので素直に順を追って
複数回に分けて置換した方がいいと思うぞ。
974 :
970 :05/01/27 16:19:43 ID:ZopGQTdq
$a = qq|<center>hogehogehoge<br>hogehogehoge<br></center> あいうえお<br>kakikueko<br> |; @a = $a =~ m|<center>(.*?)</center>|; $_ =~ s|<br>|<BR><CENTER>|g foreach @a; $a =~ s|<center>(.*?)</center>|<CENTER>@a|g; 一応できました。不備があったらお願いします。 それともっといい方法がありましたらお願いしますm(_ _)m
>>974 ・・・・・・漏れよりできる人なのねorz
恥ずかしくなってきた;
一応
$a =~ s/<br>/<BR>/g
が最後に足りてないよ・・・と^^;
気付いてるんだよねきっと
しかし漏れがなんとか1行でやってみせる。15分だけr時間をくれ。
976 :
970 :05/01/27 16:27:33 ID:ZopGQTdq
あ・・・・ 全然ダメでした。 正規表現のgオプションを使っている時って「今何回目」という 情報をもっていないのでしょうか?
「%%」という文字列を内部処理でアラーム(\a)に位置変換し、 最後にまた「%%」へ戻すようにしているのですが、日本語等で アラームが使われるようなことはありますでしょうか。 あるとその文字の一部も「%%」になってしまうのでどうしようか 考慮しております。 ご教授いただけますと幸いです。
駄目だ。
eオプション使えば1行でいけそうなのに、後一歩でできなかった。
>>976 よかったら役に立てて下さい。
$a =~ s|<center>(.*?)</center>|"<CENTER>",$1=~s/<br>/<BR><CENTER>/|eg;
$a =~ s/<br>/<BR>/g;
$1を置換してそのまま置換後文字列を埋め込む方法がわからなかったorz
質問させてください。 ショッピングカートのCGIを配布しているのですが、 MacOS9とIEの組み合わせだとバグが出てしまうという指摘を受けました。 商品が11種類以上になるとバグが出るそうです。 Winの場合、もしくは商品が10種類以下の場合は正常に動きます。 MacのIEだとperl内での変数の処理が特殊である場合などがあるのでしょうか。 例えばforeachを使ったときに「$_」の値が正しく認識されない、 等のバグなどがあるのでしょうか。 もしもあるのだとしたら、Macとそれ以外のOSの動作の違いなどを 解説したサイトがありましたら教えていただけると嬉しいです。 よろしくお願いします。
>>979 CGIの場合、perlは鯖の中で動きます。
そして出力内容がブラウザに返されて表示に使われるわけです。
従ってperlは無罪です。
バグつーのが何を指してるのか一切情報が提示されて無いのでアホかと思いますが、
不都合が生じる際の入出力の差異(GET・POST値、cookie HTTPヘッダ等)や
JavaScriptを利用しているならその解釈の差異を確認するのが解決の糸口になると思われます。
以降は別スレ或いは別板で質問するのが適当でしょう。
次スレ立ててくる
>980 手のつけようの無いバグで焦ってしまっていましたが目が覚めました。 言われてみればその通りです。 GET・POST値の差異というヒントをいただけただけでもとても助かりました。 ありがとうございます。
よくそんなレベルで配布なんかするよなー。 しかもショッピングカートをきたもんだ。 ((((;゚Д゚))))ガクガクブルブル
配布元がこれだと大変だな。
>>977 \aはコントロールコードだから、どの文字コードの漢字もかからないよ。
コーディング以前にいいアルゴリズムが思い浮かばん
>>970 my $center = '';
$a =~ s{(</?center>|(<br>))}{uc(($2 or $center = $1 eq '<center>' ? $1 : '', '').$center)}ge;
my $center = ''; $a =~ s{(<(/)?center>)|(<br>)}{uc(($3 or $center = $2 ? '' : $1, '').$center)}ge; こっちの方がいいか。
>>986 ご返答有難うございます。
安心して使うことができました。
991 :
970 :05/01/28 09:30:02 ID:dK9OtT7G
>>989 それはどうなってるのでしょうか?
はじめに<center>を見つけると$center=<center>をして、
その後の<br>発見では自動的に<BR><CENTER>への変換。
</center>を見つけると$center=''で$centerが空っぽになる。
その後<br>を見つけると<BR>.''のようになる。
つまり<center>..</center>ないの<br>という捉え方ではなく
<center>がでるとフラグonで、</center>がでるとフラグoff。
状態情報を保有させてる感じなんですね。面白いですね。
1つわからないんですが$1,''の部分の''は何の役割があるのでしょうか?
これがないと確かに動作が変わるみたいですが・・・・・・どういう意味なのか
どういう瞬間に使われているのかわかりません。
もしよろしければご教授お願いします。
>>970 ストリクタンとしては、
どっちも使うなよ
って言いたいの
993 :
970 :
05/01/28 11:39:46 ID:dK9OtT7G >>992 ???
ストリクトとどういう関係があるのでしょうか。
それに置換後文字列はHDMLとしてはvalidですよ?
っていうかストリクトとなんて概念HDMLにあるんですか?
それともPerlコーディングにもストリクトとかあるんですか?
HTMLの場合はセマンティックウェブの観点など、ストリクトである意義はありますが、
プログラミングの世界ではストリクトとはどういう意義のもとに成り立ってるのでしょうか?