Perl コーディング初心者質問コーナー Part35
1 :
nobodyさん :
04/05/26 16:48 ID:kkhhiYmo いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
nobodyさん :04/05/26 16:49 ID:kkhhiYmo
3 :
nobodyさん :04/05/26 16:50 ID:kkhhiYmo
4 :
nobodyさん :04/05/26 16:50 ID:kkhhiYmo
5 :
nobodyさん :04/05/26 16:51 ID:kkhhiYmo
6 :
nobodyさん :04/05/26 16:52 ID:kkhhiYmo
PostgreSQLで、 createuser hoge with password hogeでhogeというゲストユーザを追加し、 権限を持つユーザで、testdbというデータベースに入って、 grant select on testtable to hoge; で読み取り権限のみを与えたのですが、 DBD::Pgで、このデータベースに接続しようとすると、 DBI connect('dbname=testdb','hoge',...) failed: (no error string) と言われて繋がりません。 IDとパスを権限を持っているユーザのものに書き換えると繋がるのですが…。 原因がわからず困っています。どなたか知恵を貸してください。 Perl5.6.1、PostgreSQL1.4.2です。
スレタイ100回音読汁
PerlでのCookieで質問です。 フォームにテキストフィールドが3つあり、POST時にCookieに取り込み、再びフォームのページを表示させるとあらかじめ値が入るようにしています。 $vaild = ("Tue, 31-12-2030 23:59:59 GMT"); $cookie_data = "name\:$name<>mail\:$mail<>color\:$color"; print "Set-Cookie: $title=$cookie_data; expires=$vaild\n"; このようにしているのですが、この状態ですと3つの値が同一のCookieに取り込まれます。 有効期限(この場合は$vaild)も同一ですので、期限が切れれば全部の値が無効になりますが、 この中で特定の値(例えば$colorだけなど)の有効期限を変更するということはできるのでしょうか。 Cookie取得後は3つのフィールドに値が入っていた状態を、一定期間後にフォームのページを見ると2つのフィールドのみに値が入るようにしたいのです。
>PostgreSQL1.4.2 釣りか?
Possible attempt to put comments in qw() list という警告が出てしまいます。 もちろん use strict しているのですが、はずしても出ます。 動作上は問題ないのですが、出来れば出ないようにしたいと思ってます。 警告内容は qw() で記述した配列内に # の文字があるのでこれが コメント文字とバッティングするということだと思います。 どうしても配列要素が膨大で、いちいちクウォートするのを回避できれば と思っています。 もちろん、no warnings すれば出ないのですが、もっといい方法がない でしょうか?
13 :
12 :04/05/27 11:27 ID:???
すいません、解決しました。 # の要素順番を変えたら出なくなりました。
14 :
12 :04/05/27 11:29 ID:???
すいません、やっぱり出ました。もうわからなくなりました。 じぶんがなにものかさえも・・・
15 :
12 :04/05/27 12:27 ID:???
何だか直ったりおかしくなったりの繰り返しです。 何がいけないのでしょうか・・・
>>12 素直にno warnings使うのがいいと思うがな。そのためのもんだし。
不安ならブロックの中に閉じ込めてno warnings "qw"とかすれば
他の警告への影響も最低限になるだろう。
あるいは
@a = split(/\s+/, <<QW);
foo baa
foo#bar abc
xyz
QW
とかする手もなくはないがそこまでする?
>>16 5.005 辺りまではそういう風に実装されてたよ。
#--- test.p ---
my @array = qw(a b c d e);
__END__
> perl5.005 -MO:Deparse test.p
my(@array) = split(/\s+/, 'a b c d e', 0);
> perl5.8.3 -MO:Deparse test.p
my(@array) = ('a', 'b', 'c', 'd', 'e');
19 :
nobodyさん :04/05/27 20:42 ID:1K93G7MZ
質問です。 Net::Telnetを使ってroot権限で作業をしたいのですが suでのログインがうまくいきません。 timed-outになるので恐らくパスワード待ちの状態でタイムアウトしてると 思うのですが正しいコマンドを知っている方いましたら教えてもらえないでしょうか? my $host = 'host'; my $user = 'user'; my $pass = 'pass'; my $prompt = '/\[.+\]/'; my $supass = 'supass'; my $telnet = new Net::Telnet( Timeout => 10,Prompt => $prompt,); $telnet->open($host); $telnet->login($user, $pass); $telnet->cmd("su"); $telnet->waitfor(/Password: /); $telnet->cmd("$supass");
20 :
nobodyさん :04/05/27 20:46 ID:1K93G7MZ
質問です。 Net::Telnetを使ってroot権限で作業をしたいのですが suでのログインがうまくいきません。 timed-outになるので恐らくパスワード待ちの状態でタイムアウトしてると 思うのですが正しいコマンドを知っている方いましたら教えてもらえないでしょうか? my $host = 'host'; my $user = 'user'; my $pass = 'pass'; my $prompt = '/\[.+\]/'; my $supass = 'supass'; my $telnet = new Net::Telnet( Timeout => 10,Prompt => $prompt,); $telnet->open($host); $telnet->login($user, $pass); $telnet->cmd("su"); $telnet->waitfor(/Password: /); $telnet->cmd("$supass");
21 :
nobodyさん :04/05/27 20:46 ID:1K93G7MZ
質問です。 Net::Telnetを使ってroot権限で作業をしたいのですが suでのログインがうまくいきません。 timed-outになるので恐らくパスワード待ちの状態でタイムアウトしてると 思うのですが正しいコマンドを知っている方いましたら教えてもらえないでしょうか? my $host = 'host'; my $user = 'user'; my $pass = 'pass'; my $prompt = '/\[.+\]/'; my $supass = 'supass'; my $telnet = new Net::Telnet( Timeout => 10,Prompt => $prompt,); $telnet->open($host); $telnet->login($user, $pass); $telnet->cmd("su"); $telnet->waitfor(/Password: /); $telnet->cmd("$supass");
悪気はなかったんです・・_| ̄|● 書き込んだらサーバーエラーになってCtrl+F5押しても 書き込まれてなかったのでうっかり・・・ 本当に申し訳ないです。 できれば解答をお願いしたいです
>>19-22 - $telnet->waitfor(/Password: /);
+ $telnet->waitfor('/Password: /');
$telnet->cmd("su"); → $telnet->print("su"); cmdはプロンプトを待つ。 デバッグするならDump_Logぐらい取れよ。
25 :
nobodyさん :04/05/28 15:08 ID:NnBdFpi6
聞く場所間違ってるぞ。 配布元にサポートBBSがあるじゃないか。
27 :
25 :04/05/28 23:44 ID:NnBdFpi6
すいません私の勘違いでした。
28 :
nobodyさん :04/05/29 14:19 ID:eHv0ssyS
質問です、 1.あるサイトを運営しているのですが、顧客管理のcgi(画面)で、顧客をある条件(性別や年齢) 等で抽出し、そのヒットした顧客を画面に表示し、さらに、チェックボックスでチェックされた 顧客に対してのみsendmail にてお知らせメールを送る機能を追加しようとしています。 2.それで、抽出した顧客の一覧(チェックボックス付き)の画面出力まではできたのですが、 sendmailプログラムにチェックボックスにチェックされたユーザの一覧データがうまく送信されません。 3.エラーはでないのですが、チェックされた顧客が10人あっても一人分しかメール送信されません。 具体的に言いますと form method=post action=cgi input type=checkbox name=mail_to value=a input type=checkbox name=mail_to value=b /form で、タイプをチェックボックスとして、cgiに渡します。 この場合、cgiで受け取るデータはどの様な形式で入ってくるのでしょうか? name が同一の名前なので、 配列 $mail_to[0] $mail_to[1] かと思ったのですが、違うようですし、 データの内容がカンマで区切られて入ってくるでもないようですし・・ 尾永井します
全角は(ry
>28 標準入力を変数に変換している部分による。 同一の名称のフォームオブジェクトのデータを受け取りたいならその部分を修正しなければならない。 その部分のコードが読めるならなぜ一つしか受け取れないかもわかるはず。 なお、Perlで受け取る時点では「mail_to=a&mail_to=b」などの形で入っている。 ちなみに、こういう場合は同一名称のチェックボックスにならないように工夫する方が一般的。
32 :
28 :04/05/29 14:35 ID:eHv0ssyS
>>31 さすが、プロ詳しいですね。
今日は、眠れそうです。サンクスコ
>>32 標準(?)のCGI.pmならparamをリストコンテキストで呼べば
複数の値を受け取れたと思う。
@mail_to = $cgi->param('mail_to');
普通は同じ名前は避けるべきだろ
35 :
28 :04/05/29 17:17 ID:eHv0ssyS
>>33 検索したら、そおゆうのがありました。
サンクス
37 :
nobodyさん :04/05/29 19:01 ID:UPbtVCfi
open (IN, $file) or die "$!"; while (<IN>) { # 各行をカンマ区切りで分割 @body = split(/,/, $_); @data = split(/:/, @body); ファイルを開いて、カンマで区切った後、それをさらに:で区切ろうと思ったのですがうまくいきません。 どうしたらいいですか?
39 :
nobodyさん :04/05/29 19:37 ID:UPbtVCfi
>>38 ありがとうございます。
そんな技があったとですね
>>40 普通使うぞ。
きちんと配列に格納すれば値をいくつ渡しても配列でらくらく操作。
普通の基準を聞きたいな。 少なくとも俺は使わない。 今までは使っているソースを見たこともない。
配列を使わない方が普通と言わんとばかりの煽りだな(プ
まぁ、使う場合は使うよな。普段はそんなに使わないが
ifの文章でなら書けるのですがもっと簡単に書ける方法がないか教えてください。 if ($pass eq aa ) { $name = "ああ";} if ($pass eq bb ) { $name = "いい";} if ($pass eq cc ) { $name = "うう";} if ($pass eq dd ) { $name = "ええ";} ・ ・ みたいなのがずっと続くんですが。。
my $name_list = {'aa' => 'ああ' , 'bb' => 'いい' , 'cc' => 'うう' , 'dd' => 'ええ'}; $name = $name_list->{$pass};
>>42 CGI.pmが許しているというのは普通の基準にはならないかね。
>>42 みたいに経験が乏しかったり勉強不足の奴が見たことないとか言ってもなぁ・・・
そんなにいじめるなよ 初心者はこうして一つ一つ知識を蓄えていくんだから生暖かく見守ろうぜ
>>42 を翻訳機に通してみた。
普通の基準は俺。
少なくとも俺は使い方が分からないから使えない。
今まで他人のソースを見たこともない。
checkboxのnameにせっせと異なる名前を付けているのはある意味滑稽だな。
53 :
nobodyさん :04/05/29 23:13 ID:7xFl3dBX
>>54-55 _| ̄|● お恥ずかしい
if ($in{'url'} eq "
http:// ")
で解決しました。
ありがとうございました!
>>57 無知を指摘されたからってそんなむきにならなくてもいいんジャマイカ。
使わないって言ってる人は理由があるの? 必要ないからっていうのは無しね。 使うことによって、楽になる場面はいっぱいあるんだし。
checkboxにまで無理して噛み付く奴の知識ってどの程度なのだろう。 htmlもろくに出来ないのにプログラミングですか。 それはそれで凄いですね。
あれでしょ、今ごろHTMLの仕様とか読んで自分の誤りに 気づいて顔真っ赤にしてるんでしょ。
62 :
nobodyさん :04/05/30 00:54 ID:gNGGvGZX
ちょっとみなさんバカなボクに知恵をかしてください カウンタのような役目をしている変数$winというのがあるんですが この$winが100の倍数ごとにある処理をしています。 そこで$win_nextという変数で次の100までの回数を表示したいのです。 例えば$weが48だと$we_nextが52となったり、281だったら19になったり、といった風な感じです。 いろいろやってみましたが何回やってもできません。 ↓例えばこういう風なのとか・・・ $win_next=($win+100-($win-($win/100*100)))-$win;
>64 少なくともその一つだけ俺だから違う。
二人も居たのか? それはそれで兵共が集うスレですね。
>>62 $win % 100 は100で割った余りに相当する。
>>65 そうか、どいつなのかはわからんが。
個人的趣味で異なる名前を付けるならそういうコーディングスタイルなのだろう。
でも避けるべきとか普通は使わないとか見たことないとかは明らかに
無知あるいは応用が利かないとしか言えないな。
もうちょっといろいろ勉強したほうがいいね。
>>59 きっと、KENTやレスキューが使ってないからだよ。
レス番間違えたの? それとも粘着の意味を取り違えてるの?
うわ。。。 痛すぎる 自分が粘着してることに気づいてない粘着は一番嫌われるよ。 まぁ、リアルでそうなんだろうが
>>71 これを機に、日本語学んでみてはいかがでしょうか?
まぁ餅付け
75 名前: nobodyさん [sage必死に当り散らしてるなカナリイタイ] 投稿日:04/05/30 02:12 ID:??? まぁ餅付け いや、お前が一番痛いよ・・・ メル欄引っ掛けとかキモ杉
>>76 >>75 は誰か引っかかると思って書いてるんだよ
メル欄晒しはもう少し待ってやるべきだった。
今
>>75 ないてるぞ・・・
俺知らない
877 :nobodyさん :04/05/30 02:02 ID:???
perlを勉強中です。
CGI呼出し時にurlの引数に配列を直接入れる事は可能でしょうか?
PHPでは出来ると聞いて、perlでやってみてるのですが上手くいきません。
具体的には、以下の様にしました。
hoge.cgi?huga%5B%5D=1&huga%5B%5D=2&huga%5B%5D=3
また、この方法が無理な場合は、$huga=1,2,3で代入して送って
受け取ったCGIで@huga=(1,2,3)で代入したいのですが、urlの
; / ? : @ & = + $ ,
以上は特別な意味を持つようなのですが、
, を %2Cにエンコードして送信すれば問題有りませんでしょうか?
おまえらにタイムリーな話題ですよ
http://pc5.2ch.net/test/read.cgi/php/1078568723/l50
納得させられる説明ができなくて粘着どうこうしか言えないのはかなりイタイな。
checkboxの変数名ごときでここまで荒れる
>>80 が素敵☆
付き合おうよ★
今度は顔真っ赤にしてオウム返しか 典型的な厨房だな。 宿題して寝ろよ
とりあえず言えること checkboxを学べ それは板違いだ お前ら板違いの話題で良くここまで盛り上がれるな。
>>86 だな
>お前ら板違いの話題で良くここまで盛り上がれるな。
コレは仕掛けた本人が必ずといって良いほど言う
と説明できないやつが必死に叩こうとしてるw
もういいよ w=必死
>>89 やっと自分の間違いを認めたか。
わかったよ。
>>90 レス番間違えたの?
それとも日本語を理解できてないの?
>>91 これを機に、日本語学んでみてはいかがでしょうか?
93 :
62 :04/05/30 03:14 ID:???
%を忘れてました_| ̄|〇 愚問スマソ
perlでスクリプト組んでいて、Flashのサイズを取得するためにPHP+GDを使いたいんですが perlからサイズ取得スクリプト(PHP)を実行して帰って来た結果をperl側で取得することは不可能でしょうか? 教えて下さい。お願いします。
可能 はい、終わり。 後はグーぐるでね
/\⌒ヽペタン / /⌒)ノ ペタン ∧_∧ \ (( ∧_∧ (; ´Д`))' ))(・∀・ ;) < 餅つけ / ⌒ノ ( ⌒ヽ⊂⌒ヽ .(O ノ ) ̄ ̄ ̄()__ ) )_)_) (;;;;;;;;;;;;;;;;;;;)(_(
98 :
94 :04/05/30 17:43 ID:???
>>97 ``;でコマンドラインからPHPを実行してサイズ取得できました。
そのモジュールも検討してみます。
ありがとうございました。
思い通りにいきません。エラーが出ます。。 どのように書き直せばいいのでしょう? $i1,$i2 = split("_",$name); $name = $i1$i2;
>>99 検索で調べることもできないような人の来るところではありません。
>>99 スレの趣旨には合っているがあまりに酷すぎる。
>>100 の言うとおりに教科書買え。
($i1,$i2) = split("_",$name);
103 :
99 :04/05/30 21:48 ID:???
>>100-102 すいません。一応教科書など持ってます。
()は完全にわすれてました・・。
が、()をつけてもエラーが出ます。。
じゃあ、別の場所でエラーが出てるんだろ。 エラーログをよく見ろ。
105 :
99 :04/05/30 22:07 ID:???
Scalar found where operator expected at ../bbs/bbs.cgi line 651, near "$i1$i2" (Missing operator before $i2?) syntax error at ../bbs/bbs.cgi line 651, near "$i1$i2" ../bbs/bbs.cgi had compilation errors. なんですが。
>>103 学校でせんせーに聞いてこい。
$name = $i1 . $i2;
107 :
nobodyさん :04/05/30 22:47 ID:Mg+ccEmx
はずかしいな
2行にバグ2個も書くな。
まあスレタイに相応しい質問だけどな(w
ここは初心者が自信を持てるインターネットですね。
たまに日本語すら危うい質問があるから、それに比べたら…
112 :
nobodyさん :04/05/31 22:39 ID:1T44mYBt
質問 list.txtの、一番上の行にテキストを追加したいのですが open(OUT, ">> list.txt"); @list = <OUT>; unshift (@list,"追加の行<br>\n"); print(OUT "@list"); close(OUT); このようにやると、一番下の行に追加されます。 どこが間違ってるのでしょうか?
ここ>>open(OUT, ">> list.txt")
openの使い方を学べ
2、3のレスで解決する質問ばかりでのどかだな〜
116 :
112 :04/05/31 23:05 ID:???
おかげさまで! open(IN, "list.txt"); @list = <IN>; unshift (@list,"追加の行<br>\n"); close(IN); open(OUT, "> list.txt"); print(OUT "@list"); close(OUT); できましたぁー! 読み込みと書き出しは同時にできないってことでしょうか?
119 :
112 :04/05/31 23:12 ID:???
今、CGI本片手に掲示板を作っているのですが、 特定の状況?(原因が不明)で下記のエラーが出てしまいます。 Illegal division by zero at C:\www\home\bbs.cgi line 2020. エラーが出ない場合は普通に書き込めるのですが・・・。 自分なりに原因を探ってはみたのですがお手上げです。 何卒ご教授下さい。宜しくお願いします。
>>120 スレ違い。
つーか、どこで聞いても同じ。
なぜエラーメッセージを読まない?
いつも通り 英 語 が 読 め な い ん で す とかじゃねーの どちらにせよ典型的な真性厨ですな
>>120 は、割り算ってケーキを人の数で割ることだから
ケーキを0人で割ると誰にも分けなくていいから全部わたしのもの、とか考えてるツルペタ。
>>23-24 できました!ありがとうございます。
レス遅くなってすみません。
125 :
112 :04/06/01 00:46 ID:g7eZEVaT
すいませーん追加で質問です。
>>116 のようにして書き足していったlist.txtを覗くと、データが
追加の行<br>
追加の行<br>
追加の行<br>
追加の行<br>
のようにヘンなインデントがついてるんです
なぜでしょうか?
なんでprintするときリストを""で囲むかね。 たぶんスカラー変数を""で囲むのを普段から何の疑いも無くやっていて、その延長で リストを囲んだらおかしくなったってパターンなんだと思うけど。 そうやれ!とか書いてある参考書でもあるの?
答えろよ
print "@data"と print @data はPerlだと挙動が違うんだよねぇ 勉強しろよ
130 :
112 :04/06/01 11:58 ID:???
>>127-129 ありがとうございました。勉強になりました。
ソースは他人のソースを参考に書きました。
イメージ検索エンジンを作ろうとしているんですが、 画像に埋め込まれているメタデータとキーワードが一致しているかどうかで、 検索をしているイメージ検索エンジンってありますか? <img src="map.jpg" alt="地図" title="日本地図"> ↑のaltやtitleの部分や画像周りのテキスト、ファイル名などを 検索するのがGoogleだと思うんですけど、 画像に組み込まれている日付だとか著者とかをキーワードと一致するか、 検索するシステムが無ければ作ろうと思うのですが、 どなたか上記のような検索システムがあれば、教えてください。 無ければトライしてみようと思います。
varatermを使ってるんですが、シェル(bash)の標準入力ではbackspaceで 後の1文字を消せるんですが、スクリプトで<STDIN>で入力する時に、 backspaceを使うと、^Hが表示されて文字を消すことができません。 どうすれば文字を消せるようになるのでしょうか。 Perl 5.6.1、Debian 3.0を使っています。
>>133 ^H返すのってわりと普通の動作じゃないんですか?よく聞くんですけど
俺のスクリプト使う奴は全員backspaceコードに^H使うな!
とは言えないので…。
>>136 あー、なるほどそうだったんですか…。
どうもありがとうございました。
138 :
nobodyさん :04/06/05 07:36 ID:HWhcKEoW
今170行ほどのプログラムを書いたのですが、可視性が悪いので処理ごとにサブルーチンかしようかと思うのですが それだと処理の重さ軽さなどは変わりますか?
ベンチマークとってみれ
140 :
nobodyさん :04/06/05 09:45 ID:HWhcKEoW
use benchmark;
142 :
nobodyさん :04/06/05 13:37 ID:tmR5KH99
ひらがなをカタカナに変換したいのですが、以下のようにするとなぜか"アゥ"と出力されます。何故なんでしょうか? (UNIX, perl v5.8.0) #!/usr/bin/perl $str = "あい"; $str =~ tr/あいうえお/アイウエオ/; print $str;
ひらがなやカタカナがマルチバイトだから。
144 :
nobodyさん :04/06/05 14:41 ID:6aQba7Dj
>>142 解決策1: Jcodeモジュールのtrを使う
use Jcode;
$str = "あい";
print Jcode->new($str)->tr('あいうえお','アイウエオ');
解決策2: unicode機能を使う
use utf8;
use encoding 'euc-jp', Filter=>1;
$str = "あい";
$str =~ tr/あいうえお/アイウエオ/;
print $str;
use encodingのとこのeuc-jpは適当に自分が使っている
コードにあわせてくれ。
145 :
未承諾広告※ ◆TWARamEjuA :04/06/05 15:05 ID:CuLBZ8wK
>>144 5.8.0 環境とのことですので後者の方ですね。
フォームを使わずに、POSTでデータを送る事は出来ませんか?
プロ固定金土日こと星山成寿(李明煕/イ・ミョンヒ) の2ちゃんねるワンポイントアドバイスの時間です。 長年プロ固定してますので、削除とか他人のIP抜き取り個人情報調べ、 2ちゃんねるのアングラの仕事など西村博之の右腕として広範囲な仕事を 任されております。一般に2ちゃんねるは、収益を上げてない個人管理の掲示板 かのように思われていますが、各トピックごとに様々な人間がアクセスしてくる ため、それらのIPで個人情報を調べた名簿を企業に売買しすることにより、 裏側では巨大な収益をあげております。DHCの裁判でいきなり5億円もの損害賠償 を請求されているのも、彼らの独自の調査によって2ちゃんが裏側で稼いでいる 情報がばれているからにほかなりません。2ちゃんねるでも、ほんの一部の幹部 しかしらない情報としましては、「薬・違法掲示板」の名簿を、覚醒剤の売買 組織に、売り捌いていることです。これに関しては、アングラマネーなので当然 税金もかからず、実は一番の巨大な利益は「薬・違法掲示板」で集まった シャブ中連中の個人情報を組織に転売することにより得ています。 最近それらの情報に警察や公安が気づき始めたため、西村博之の実家には何度も ガサ入れ(家宅捜査)に入られており、逮捕への証拠固めとして、国家権力が 動き始めて、かなり立場的には危険になったことは確かです。ですので、 以前ほど堂々と、そのような行為もできなくなってきているので、私も住居を 転々としている次第です。あっ、このことについては、本当に危ない話 なので、他言しないでくださいね。もしばれた場合は、ネタ情報として 逆にでたらめな似通った情報をたくさんネット上に流すことにより、煙に まいてください。大抵の場合、ガセの情報をたくさん流せば、またネタが 始まったと、冗談で終わります。以前オウム真理教が毒ガスサリンを 自分たちが作っているのに、毒ガスで命を狙われたなどと自作自演した 作戦と同じ手口ですね。よろしくお願いします。
149 :
146 :04/06/05 15:39 ID:???
>>148 良かったらやり方を教えていただけませんでしょうか。
そんな質問をしているぐらいなら教えてもわからんだろ。 何をしたいか詳しく書け。
151 :
146 :04/06/05 16:11 ID:???
パスワードを使ってログインしてファイルを編集する というCGIなのですが、編集時にもう一回パスワード照合したいんです。 もう一回パスワード入力するのも面倒なのでログイン時に入力したパスワードを 編集用のCGIに渡したいんですが、どうすれば良いでしょうか。 分かりにくくてすみません。
>>151 それならフツーは hidden で渡すんじゃないの?
別にCookieを食わせてもよいけどさ。
>>151 フォームを使わずにっていうから何かと思ったらそんなことかよ・・・
そんな単にページ変移毎にパスワードを必要とするありふれた仕組みぐらい
工夫して書けよ。
ほとんどどんなスクリプトでもやってることだろ。
そんなことならスレ違いだし他のスクリプトでも見て勉強してちょうだい。
154 :
nobodyさん :04/06/05 20:33 ID:jT/a/NFi
すみません質問です。 Perlにてファイル内の特定文字を検索するにはどういうコードを書けばいいでしょうか? ファイルの中身を全部配列に入れてjoinして強引に検索出来そうな気もしますが もっとスマートな方法あったら教えてもらえますでしょうか?
>>154 ここはコーディングスレなんだからまずは自分で書いてみろ。
>>154 whileで一行ずつ読み込んではパターンマッチかけるとか
つか、どういうのを「スマート」と想像してるかの方に興味がある
157 :
nobodyさん :04/06/06 00:41 ID:timkGFaS
>>144 有り難うございます。
そういう方法しかないのですね。それでやってみます。
158 :
nobodyさん :04/06/06 17:31 ID:RQ9IWgny
Perl5.6.1で変数がスカラーかどうかを判断するにはどうすればいいですか?
>>158 $名前ってのがそうです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
160 :
158 :04/06/06 17:49 ID:RQ9IWgny
説明不足ですみません。 変数に代入されている値がスカラーかハッシュへのリファレンスかで 処理する内容を変えたいのですが,プログラム内部でそれを判断する 方法はないでしょうか?
下記のようなごく初歩のプログラムがあるんですけど $noって=$filenameですよね? なぜ$filenameを$noで再度置き換える必要があるのでしょうか? 後、print "$no";で一度記述してるのに 後にif文で再度同じ事をしてるのはなぜですか? #! /usr/local/bin/perl # ログファイル名 $filename = "count.txt"; # ファイルを開く if (!open(FP,"$filename")) { # 失敗 $no = 0; } else { # 成功 $no = <FP>; close(FP); } # 1つ増やす $no++; print "$no"; if (!open(FP,">$filename")) { # 失敗 print "ファイル $filename がオープンできませんでした ($!)\n"; }else{ print FP $no; close(FP); }
>>161 > $noって=$filenameですよね?
既にこの時点で(略
>>160 ref <変数> でリファレンスかそうでないかがわかるよ。
リファレンスじゃないなら偽。
リファレンスなら、種類によってARRAYとかHASHとかが返される。
164 :
nobodyさん :04/06/06 18:56 ID:kS2UjgnM
フォームのテキストボックスに「にほんご」と入力し送信したところ、 「\x{0082}ノ\x{0082}ル\x{0082}\x{00f1}\x{0082}イ」 と、表示されてしまいました。 「use encoding 'shift_jis';」を指定しており、 もし「use encoding 'shift_jis';」の一行を取り除くと、 ちゃんと「にほんご」と表示されます。 「use encoding 'shift_jis';」を指定した場合も、、 「にほんご」と表示されるようにするには、どうしたらよいでしょうか。 環境 ActivePerl 5.8.3 Build 809 Windows XP Pro SP2, IIS
165 :
164 :04/06/06 18:57 ID:kS2UjgnM
受信のソースです --- ここから --- use CGI; use encoding 'shift_jis'; $cgi = CGI::new(); $text1 = $cgi->param('text1'); print <<EOM; Content-type: text/html <HTML> <BODY> $text1<br> </BODY> </HTML> EOM --- ここまで ---
166 :
160 :04/06/06 19:09 ID:???
167 :
161 :04/06/06 20:05 ID:ZCQZgjkY
この部分イフの前にプリントしてる のに後にイフで再度書き込もうとしてるのはなぜですか? print "$no"; if (!open(FP,">$filename")) { # 失敗 print "ファイル $filename がオープンできませんでした ($!)\n"; }else{ print FP $no; close(FP); }
なぜですかと聞かれても、必要があるからじゃないですか?としか答えられないの。私。 print "$no"; if (!open(FP,">$filename")) { # 失敗 print "ファイル $filename がオープンできませんでした ($!)\n"; }else{ print FP $no; close(FP); } print "$no"; したらどうよ。
>167 後ろの方には FP が入ってるわけですが、そこんとこどうよ?
170 :
nobodyさん :04/06/06 20:35 ID:ZCQZgjkY
print "$no"; がhtmlへの書き込みを示してて、 print FP $no; がcount.txtへの書き込みという事ですか?
おっ、上達してきたぞ。
ちょっと違うな。 とりあえずファイルハンドルを知れ。
ファイルハンドルとはファイルにつける 固有名詞で通常大文字で記述する。 print FP $no; のような形式はファイル自身に書き込むこと。 ですよね? あれ?なんでファイルハンドルつける必要あるのですか?
174 :
nobodyさん :04/06/06 21:04 ID:qBVB6Avx
すみません。 benchmark.pmを使った際の出力結果 例えば 0 wallclock secs ( 0.02 usr 0.00 sys + 0.02 cusr 0.01 csys = 0.05 CPU) というのは何を表すのでしょうか(処理時間であるということぐらいはわかりますが) wallclock secs,usr,sys,cuser,csys,cpuってそれぞれなんなんですか? usrはユーザ側の処理時間?? あと同じCPUでも 0 wallclock secs ( 0.02 usr 0.00 sys + 0.02 cusr 0.01 csys = 0.05 CPU) 2 wallclock secs ( 0.02 usr 0.00 sys + 0.03 cusr 0.00 csys = 0.05 CPU) のようにwallclock secsに大きな違いが出るのは何故なんでしょうか?
wallclock secs: 実時間(起動してから終わるまでの時間) usr: (そのプログラム自身が)ユーザモードで消費したCPU時間 sys: (そのプログラム自身が)カーネルモードで消費したCPU時間 cusrとcsysはそのプログラムから起動された子プロセスが消費した分 最後のx.xx CPUはそれらの合計。 実時間は他のプログラムが動いていたり、IOの待ちがあったりすると かなり変動する。
糞の
>>160 のはいなくなったか。
二度と来るなよ。 ( ゚д゚)、ペッ
178 :
nobodyさん :04/06/06 23:24 ID:ZCQZgjkY
ほっ、俺じゃなかった。
>>164 S-JISで書いていないんじゃないのか?
>>179 もう一回参考書読んできます。
いまいちファイルハンドルの意味自体わかってない気がするので。
>>181 ファイルハンドルはどうでもいいんだけど、最初の「if文で再度同じ事をしてる」は
書き方がヘタなだけだろう。
>>182 あのスクリプト自身があまりうまく出来てないと言うことですかね、
と言うことは私の疑問もあってるんでしょうか。
一応参考書の例文なのですが。
参考書じゃああいう書き方で説明することはあるのかもな。 疑問とは? >$noって=$filenameですよね? これか?違う >print "$no"; がhtmlへの書き込みを示してて、 これか?違う >print FP $no; がcount.txtへの書き込みという事ですか? これか?そう
185 :
nobodyさん :04/06/07 00:49 ID:T5+evT2p
3万個ほどファイルがあるディレクトリを開いて、readdirでリストを取得すると、 数十〜数百個ほど取りこぼしがあるのですが、これって既出ですか? もしそうならすいません。確実に取得できる方法はありますか? ファイル名でソートしてちゃんと時系列で処理をしたいのですが、この問題のために 作れなくて困っています。
>>184 1個目、2個目なのですがまず1個目は
$filenameから読み込んだ数値を$noとするということでしょうか?
2個目だけはどうしても必要とは思えないのですが。
その後、ifで再度書き込まれるわけですし。
>>187 >$filenameから読み込んだ数値を$noとする
そう。ファイルハンドルをスカラ変数に代入は1行読み込み。
>2個目
print "$no"; は標準出力へ$noの値を出力。
print FP $no; はファイルへ$noの値を出力(書き込み)。
必要あるなしなんて書いたやつがそうしたかったのだろうよ。
>>187 名前に元質問のレス番を入れろ。
コーディングスレなんだから「私の疑問も・・・」とか「1個目、2個目」なんて
書かずにどのコードについてなんなのかもうちょっと文章を考えて書け。
ものすごく基礎的な事なんですけど……。 どこがおかしい、もしくは基本的に間違いと言う所をご指摘願います。 #行数・項目数(, 区切り)とも不確定のCSVファイルを読み込み、 #@page2 に $page[n行目][n項目] と言った感じの2次元配列で格納したい open (IN, "./link.csv"); my @page = (<IN>); close (IN); my (@line, $i, @page2); $i = 0; foreach (@page){ @{$line[$i]} = split(/,/); push(@page2, @line); } print $page2[3]; #@page2 の中の3行目を表示したいけど、結果は ARRAY(0x155c7c8) と出る #$page[3][3] とすると、最後の行の目標項目が表示される
>>164 しっかりファイル頭でuse宣言してる?
194 :
191 :04/06/07 06:53 ID:???
>>193 ありがとうございます。
まさに知りたかった事が載ってました。
ここ読んで、やり直してみます。
195 :
nobodyさん :04/06/07 08:45 ID:mlYstQXa
>>175 さん
ありがとうございました。
>>176 有効桁は・・・昔BASICをやってたときに#をつけると倍精度とか・・・
(よくわかってないんで自分で調べてみます)
196 :
164 :04/06/07 12:47 ID:c3dnKsSQ
>>180 >>192 ようやく解決できました。
>>165 のように書いてしまっていたので、指摘の通り、
「use encoding 'shift_jis';」をまずはじめに書くように直しました。
なおかつ、それでも化けていたのですが、
「use encoding 'shift_jis';」に「Filter=>1」を加えたところ、
ようやくきちんと「にほんご」と表示できました。
どうもです。
質問です。 サブルーチンの呼び方に関してなのですが、例えばjcodeですと jcode'convert (*value, "sjis"); ← Perl4 jcode::convert (\$value, "sjis"); ← Perl5 などの書き方ができますよね。 Perl5ならどちらの記述でも動きますが、 Perl4にも対応させるなどの汎用性という面では、 常にPerl4の記述で書いたほうがいいのでしょうか?
使わなきゃいいじゃん。
↑
>>197 がいいこと言った!
CGIとして配布するならともかく、 わざわざ古い書式を使うこともあるまい。
赤ラクダのヨブの話は好きだったんだが あれを Perl5.8 対応にしてヨブが粘土板を UTF-8 で刻むようなチュートリアルが読みたい
202 :
nobodyさん :04/06/07 17:08 ID:SF6UmQvx
This is perl, v5.8.0 built for i386-linux-thread-multi です。 あるデレクトリのテキストファイルのみを取得したいのですが、 opendir DIR, '/home/foo/bar' or die; @files = grep { -f }readdir DIR; print join("\n", @files); とすると空でなにも表示されません。2行目を @files = grep { !-d }readdir DIR; # デレクトリではないもの とするとデレクトリ以外のファイルが取得できます。 ファイルテスト演算子「-f」では取得できないのですか?
>>202 readdir で得られるファイル名はフルパスでないからぢゃよ
204 :
202 :04/06/07 17:51 ID:SF6UmQvx
>>203 返事、ありがとうございます。
そうかとも思ったんですが、ならば !-d で判定できているのは…んん?
えーとあれですかね、この場合判定できているのではなくて、
存在しない->よって「!-d」も真値が返ってきてる、って事ですか?
つまり判定できているわけではないってこと?
205 :
202 :04/06/07 17:54 ID:SF6UmQvx
>>204 すいません、フルパスで -f で大丈夫でした。
お騒がせしました。
206 :
nobodyさん :04/06/07 20:46 ID:UI3v3779
スレ違ったので移動 掲示板CGIにアクセス解析CGIを組み込みたいと思ってます。 Bodyの中にタグとして書き出すのでなく、CGIの中で完結させたい (ソースを見てもわからないようにしたい)のですが、 具体的にどのようにすればいいのでしょうか。 サブルーチンで解析CGIを呼び出す、というヒントは読んだのですが 呼び出しの記述の仕方がわかりません。 なんとなくこんなふう書くのではないかと思うのですが↓ sub access { ??? = './acc/acc.cgi?a=b&&c=d'; } どなたかアドヴァイスおねがいできませんか!
検索したほうがいいよ
209 :
nobodyさん :04/06/07 21:02 ID:SF6UmQvx
あるcommand があり、 system("/home/hoge/bin/command arg > file"); とするとcommand の出力はfileに書き出されます。 @array = system("/home/hoge/bin/command arg"); としても@arrayには何も格納されません。 シェルから $ /home/hoge/bin/command arg とすると出力が画面に表示されます。 command の仕様には「標準出力に表示します」とあるだけです。 訳あってこれ以上の情報が取得できない状況です。 command の出力を変数に取り込むにはどうすればいいんでしょうか。
一つ言えるのは掲示板なんぞに解析し込む馬鹿はキモイ。 ついでにプログラミングは100年は早い。
211 :
206 :04/06/07 21:08 ID:???
>>208 アクセス解析 掲示板cgiに 埋め込む
などでは検索しましたが・・・
何かいい検索ワードあったら教えてください。
一つ言えるのは掲示板なんぞに解析し込む馬鹿はキモイ。 ついでにプログラミングは100年は早い。 おまけに日本語を喋れない。
215 :
209 :04/06/07 21:32 ID:???
>>214 @array = `/home/hoge/bin/command arg`;
なんですね。
ありがとうございました。
ちょっとお聞きしたいのですが、 例えば @data = 1 2 3 4 5 〜 100 があり その中のある数にもっとも近いモノからソートすると言う事は出来るでしょうか? 例えば↑の配列 5 に一番近い数字からソートすると 4 6 が先頭の並び順になる…というような感じなんですが…。 ちょっと無理っぽいような気もするのですが可能ならば何卒お教え下さいませ。
absでワンクッション挟め
>>216 > 5 に一番近い数字からソートすると 4 6 が先頭
どっちなんだよ?
@new = sort(grep($_ >= 5, @data));
5を好きなように変えれば?
>>216 @data = sort{ abs($a-5) <=> abs($b-5) } @data;
perlのcrypt関数でパスワードをcryptし、 user(add|mod) -p 暗号化パスワード -s /bin/true -d /home/www/アカウント アカウント でユーザの追加、変更を行っているのですが、例えば、「test」というパスワードを設定 すると、「test」でも「test999」でも「test48278467276484」でもFTPで認証できてしまい ます。つまり、「test*」で認証できてしまいます。 「test」をusermodで「test876」にしても、上記同様関係なく「test*」で認証できて しまいます。 デフォルトで用意されている「admin」というアカウントではこのような症状にはなら ないので、どうもuseradd|mod側で使っている「-p」の暗号化したパスワードが怪しいの ですが、解決に結びつかず、1日が経過してしまいました。 もしも何か解決策がありましたら、どうかご教授ください。
>>220 OSはなによ?
デフォのcrypt関数ならそれで正常。
>>220 8文字以降無視ってのはよくきくしそういう仕様だけど、
4文字でだめってのは初耳だ。
ほっとけよ。 perlに関係ないことだ。
ディレクトリを無理やり削除するには system ("|rm -r $dir"); で桶ですか?
-rf
227 :
220 :04/06/08 18:48 ID:???
皆様、ご返答有難うございます。
現在も模索中でございます。
>>221 Redhat9です。
>>222 「testtest」と設定しても、testtest*になって
しまうようです、、、
数字と英文字混ぜてテストしてみたか?
>「testtest」と設定しても、testtest*になって >しまうようです、、、 とりあえずそれは正常だ。
230 :
220 :04/06/09 02:55 ID:???
>>228 「test123test」とやってみましたが、同じように「test123test*」
で認証できてしまいました。
>>229 正常なのですか?
はじめから用意されていた「admin」というアカウントでは、
このパスワード入力方法では通用しませんでした。
232 :
206 :04/06/09 06:49 ID:siBsh0Gf
>>206 です
改造スレできいてみましたが、あちらでもスレ違いなのだそうです。
やはりここしかないのかと思います。
あちこち行ってますが、重複投稿でなく誘導ということでご容赦ください。
>>206 のようにcgiでcgiを呼び出して使ってる方はいないでしょうか?
requireでもopen(<IN>, "**.cgi")でも駄目でした。
検索をしても、cgiのBody内に解析のタグを仕込む方法ばかり出てきてしまいます。
ヒントだけでもよいのでおねがいいたします。
233 :
206 :04/06/09 06:59 ID:???
ひょっとしてこんな簡単な話ではないのでしょうか・・?
だから無理だって言ってんだろうが。
236 :
206 :04/06/09 07:51 ID:???
>>234 配布先のFAQには
>アクセスログの取得がばれるとまずいと言う場合は、なんとかPerlを勉強して、
>CGIの中からサブルーチンとしてアクセス解析を呼ぶなどの方法で対処して
>いただければと思います(ここまでくると手法としてはけっこう厄介ですが)。
と書いてあったんです・・・。
勉強して対処しろ、と書いてる人に具体的方法は聞けないと思い
私なりに調べたり試したりしましたが答えが出ませんでした。
>>236 どの方法を取るにしても、スクリプトを書き換えないと無理。
一番簡単な方法は、クエリ部分を引数(ARGV)で取るようにして、
``かqx//かsystemあたりで呼び出す。
分からなければ、Perlの入門書をどうぞ。
239 :
236 :04/06/09 10:36 ID:???
お前ら優しすぎ
優しくして得するのは優しくした方
親切は人の為ならずってか。 今回の対応が親切だろうか? よーく考えてご覧。 むしろ自分の首をしめてるのが良く分かるだろう。
244 :
220 :04/06/09 15:33 ID:???
>>231 Linux板で板違いだと思ったのでこちらで質問させて
いただいたのですが、また板違いでしたか。
すみませんでした
245 :
nobodyさん :04/06/09 16:06 ID:jOx/oerj
2ちゃんねるは優しさの塊ですから。
バファリンより凄いじゃないですか!?
>>246 違う違う落ち着いてよく考えろって。
バファリンは2ちゃんねるを内包してるんだよ?
リファレンスをうまく使えるようになるたくて色々試してるんですが、クエリを標準入力から もらって、一つの連想配列にキーと値にわけて収納するというのを、リファレンスでやりたい んですが @test = qw/sda-1we pj-odfao of-134t/; foreach $a(@test){ ($x,$y)=split('-',$a); $form={$x,$y}; } print %$form; >of134t 当たり前の結果ですが上書きされて行って最後の代入結果だけ残ります。上書きさせずに 一度に$formの中に標準入力からのデータのリファレンスを作るのはどうやればいいでしょうか。 少し言葉が変かもしれないですがごめんなさい。
249 :
248 :04/06/09 23:23 ID:???
言い忘れてました。 $form{$x}=$y; $ref=\%form; 以外でやりたいんです。なんかリファレンスを普通の変数のように作成したいと思いまして。
250 :
248 :04/06/09 23:32 ID:???
2回目まであげてしまってごめんなさい。 ところで、javascriptでは関数内でグローバル変数を使うなって言われますけど、 perlでもメソッド内であまりグローバル変数を使わないほうが良いんでしょうか? リファレンスもローカル変数化するべきでしょうか?
251 :
nobodyさん :04/06/09 23:32 ID:iD3wLltH
$form = { map{ split /-/ } @test };
254 :
248 :04/06/09 23:55 ID:???
>>252-253 ありがとうございます。あとから
@test2 = qw/q 1 w 2 e 3 r 4 t 5/;
をさっきの$formのりファレンスに追加したい場合もあるなと思って試してたら返事が遅くなりました。
まだできてませんけど;
メソッド内でのグローバル変数はやはり禁止にしたほうが何かといいですよね。
メソッド1での代入結果をメソッド2で使うんですが、リファレンスにしてそれだけ
呼び出し元にreturnで返そうと思います。(まだテストしてないので可能かはわかりませんんが・・・)
とにかくありがとうございました!
255 :
251 :04/06/09 23:58 ID:iD3wLltH
>>253 入力した値が、文字化けせずに日本語のまま、正常に送られるようにしたいのです。
わかりにくい日本語ですいません・・・
>>254 うん?よく意図が読み取れないけど、メソッドっていうなら、普通にメンバ変数?(間違った言葉使ってるかも)に代入すればいいだけじゃ?
sub method1{
〜〜〜
$self->{hogehoge} = "unko-";
$self->method2();
}
sub method2{
〜〜
print $self->{hogehoge};
}
みたいに。
>>255 向こうがJISだったら、JISで送るしかないんじゃ?
<form>タグのencなんたらってのでこちらの送信するときの円コードは変えることができると思う。 ブラウザの挙動は知らないけど。
259 :
nobodyさん :04/06/10 00:10 ID:Zv7Yb66M
>>251 微妙にスレ違い。<form ... ACCEPTCHARSET="shift_jis">
260 :
248 :04/06/10 00:10 ID:???
sub method{
my @test1 = qw/q 1 w 2 e 3 r 4 t 5/;
my @test2 = qw/y 6 u 7 i 8 o 9 p 0/; #この行はまだ実験中なので無視してください。
my $form;
$form={map {split /-/}@test1};
return $form;
}
$form=&method;
print $form->{q};
一応動作はしますがなんか変な感じですね。
>>256 $selfは
my $self=shift;
とかをメソッドの初めにしてるということですよね?
今まで、うまくオブジェクト指向ちっくな部分が理解できてませんでしたけど、
なんかもの凄いヒントもらった気がします。ちょっと考えてみます。
>>260 うぬ? 微妙にわかってないかな。 my @test1 = qw/q 1 w 2 e 3 r 4 t 5/; なら、別に'-'でsplitする必要はないので、$form = { @test1 }でいいんじゃないかな。
あと、@array = qw/a A b B c C/; %hash = @array;と、
%hash = qw/a A b B c C/;で、%hashの中身は、同じね。
{}んで、囲んだたら中のリストの内容がぎじぇりgへおりgはえおじぇいrひあえhrがれがえrげhてぇt
ごめん、なにいってるわからなく。
>
262 :
248 :04/06/10 00:27 ID:???
>>261 splitの部分は途中で@test1の中身を変えてしまったままを忘れてました。
>あと、@array = qw/a A b B c C/; %hash = @array;と、
>%hash = qw/a A b B c C/;で、%hashの中身は、同じね。
なんとなくで思ってましたが
>>261 さんのおかげで、確信がもてました。
$self->{hogehoge}="文字列";
はリファレンスのアドレス?メモリ番号といいますか、それが決まる前に値を入れる・・・
というか、値を入れるのと同時にアドレスも持つみたいな感じを以前に読んだ気がします。
かなり良い感じになってきたので、解説サイト行って勉強しなおしてきます。今なら前より
理解できそう。
263 :
251 :04/06/10 00:37 ID:outd/ELT
>>259 ありがとうございます。しかし、その内容では駄目なようでした・・・
板違いスイマセンでした。この内容だとHTMLなのかな・・・?
264 :
248 :04/06/10 09:53 ID:???
sub method{ my $self = shift; my @test1 = qw/a-9 b-67 c-876 d-765/; my @test2 = qw/e-rt f-asdd g-fgf/; $self->{form}={map {split /-/}@test1,map {split /-/}@test2}; } sub method2{ my $self=shift; my @test=qw/a b c d e f g/; print map{$self->{form}{$_}@test; } $self->{form}をデリファレンスするのに今はこんなやり方しか思いつかないんですが、 method2でわざわざ@testに$self->{form}の各キーを代入しないでもいい方法はないでしょうか。 $$self{form}でもアドレスが出てくるので、$$$self{form}でいけるかなと思いましたがやはり 駄目でした。
>>264 keys %{$self->{form}}
266 :
248 :04/06/10 10:09 ID:???
>>265 !?ありがとうございました。%{$self->{form}}カーリーブレスつけると全部表示されるんですね。
267 :
248 :04/06/10 11:41 ID:???
メソッド内でのグローバル変数をなくそうと色々試してるんですが、基本的な考え方としては (モジュールの場合) コンストラクタ sub new{ my $self = shift; bless { data1 => {qw/a 1 b 2 c 3/}, data2 => {qw/d 4 e 5 f 6/} },$self; } で初期化しておいてmethodに$a={qw/a 2 b 4 c 6/}を投げたら sub method{ my $self = shift; my $a = shift; $self->{data1}={%{$a}}; } のように$self->の中身に処理結果を反映させて行く。みたいな感じでいいでしょうか? これなら一応グローバル変数は排除できるっぽいです。
268 :
nobodyさん :04/06/10 12:02 ID:Niohn4Xp
ひと月分の予定表で質問です。 以下の様にして予定表のリストから名前と年月が一致した予定を配列に入れて foreach $yotei(@yotei) { chomp $yotei; ($yo_name,$yo_year,$yo_mon,$yo_day,$yo_kaisi,$yo_end,$yo_naiyou) = split(/<>/,$yotei); if ($name eq $yo_name) { if ($yo_year eq $year) { if ($yo_mon eq $month) { $h_yotei[$yo_day] = $yo_naiyou; } } } } 後で、次の様にして表示しているのですが、これだと1日に1件の内容しか表示できません。 for(my $i=1;$i<=$lastday;$i++){ print "<td>$h_yotei[$i]</td>\n"; } 1日に複数の内容を表示させるにはどのように変更すればいいでしょうか?
>>268 push @{$h_yotei[$yo_day]}, $yo_naiyo;
に変えて、
for(my $i=1;$i<=$lastday;$i++){
print "<td>$_</td>\n" foreach @{$h_yotei[$i]};
}
とかか?
なんかしっくりせんけど。
>>268 月の日数文のファイルをつくって、ファイル名はもちろん年月日とかで。
そんでifにかけて真ならファイルオープンして中身を表示とかは?
これなら新しく予定を書きこむのも、新しい日付分のファイルを作るのもperlで可能。
素人も使えるようにUIもperlで整えればいいのでは?
271 :
270 :04/06/10 13:58 ID:???
CSVにでもして、名前の検索は年月日該当のファイルを開けてからやるみたいな。
>>271 会社で使うならそれでもいいね。社員のその日の予定が社長は一覧できるし。
>>267 $self->{data1}={%{$a}};
これは、$aをデリファレンスして、んで、リファレンスを取ってるから、±0なことをしてると思うよ。
$aにハッシュのリファレンスが入ってるんだから、$self->{data1} = $a;でok
あと、この辺の話題になると、ム板のPerlスレにいったほうがいい。
>>273 ハッシュのコピーをしてるんじゃないの?
こうじゃなくて
$self->{data1} = \%{$a};
ならたしかにお前のいうとおりだが。
275 :
267 :04/06/10 17:50 ID:???
>>273 $self->{data1}={%{$a}};
ありがとうございます。アドレスごと書きかえるだけでいいんですね。でも、アドレスごと
書き換えた場合は( {%{$a}} でも同じですけど )初めにコンストラクタで作られた
$self->{data1}のメモリ使用領域はどうなるんですか?
$self->{data1}はアドレスを格納しているだけなので、後でアドレスを書き換えたとしても
書き換え前のアドレス先には値が保存されているままなのでしょうか?
それとすみませんが、ム板っていうのはどこでしょうか。webpg板とweb制作板くらいしか使った事ないのですみません。
>>274 あ、あぁ、そういうことか
>>275 $self->{data1} = $a;とした場合は、$self->{data}->{hogehoge}を変更したら、$a->{hogehoge}も変更されると思う。
ム板->プログラム板
質問いいでしょうか。文字列と数値の扱いです。 例ですが、data.txtに 1<TAB>2<TAB>3 と入っているとします。 $file="data.txt"; open(DATA,"<$file"); @line=<DATA>; 以下略 配列にデータを格納します。 QUERY_STRINGにxxx.cgi?num=3などとあって、この数値と配列の中身を評価する時ですが、 num=3の3は数値としてとらえてもいいと思うのですが、 $fileから読み出した文字列が数値である場合、それは文字列として評価するべきなのでしょうか、それとも数値として扱っていいのでしょうか。 ex.1 if ($num == $line[0]) { ex.2 if ($num eq $line[0]) { こういう扱いの違いについてです。
278 :
未承諾広告※ ◆TWARamEjuA :04/06/11 13:52 ID:9CQ7zNJb
>>277 都合の悪いときのことをいろいろと想像してみると楽しめるんじゃないかなぁ。
数値比較の場合、num=xxxとやると0と一致するね。 文字列比較の場合、num=03とやると3と一致しないね。
perlを始めて数ヶ月の超初心者です。split関数についての質問です。 文字列を分割して配列に格納するまでは良かったのですが 配列の最後の文字列だけを取得する方法がわかりません。 $0で取得した/var/tmp/hoge.plのファイル名だけが欲しくて $filename = (split(/\//,$0))[2]; としてみました。ディレクトリ変更する場合も考えて頭から数えないで 最後の文字列を取得できればと思います。 どなたか、ご教授よろしくお願いします。
($filename)= $0=~ m!([^/]+)$!
配列じゃなくちゃだめなの? use File::Basename; my $filename = basename $0; とかは?
284 :
280 :04/06/11 21:32 ID:???
>>282 ありがとうございます。無事、ファイル名を取得する事ができました。
これで半日悩んでた自分がバカでした。修行を積んできます。
>>281 申し訳ありません。自分のレベルじゃまだまだ理解不能です。
今後の課題のひとつにしたいと思います。
ありがとうございました。
285 :
280 :04/06/11 21:36 ID:???
>>283 数分違いでレス遅れました。
自分のレベルじゃ配列ぐらいしか思いつきませんでした。
basenameは、今後の参考にさせていただきたく思います。
ありがとうございました。
PERLのコメントって my $a = "aiueo" ; #コメント の時に今まで半角スペースでやってたけどもしかしてTabでも問題ないの? プラットフォーム全て共通でTabでもokかな?
意味分かんないよ ごめんね このスレの住人では力になれないようだ まずは日本語からだ!
288 :
286 :04/06/12 00:55 ID:???
>>287 俺へのレス?
コメント開始までの見やすさのための空白にTabを使っていいのかなっていう質問。
Tabキーを押すと入力されるやつね。
なんかTabってソフトウェアによってコードが違うとか聞いた事あるから、もしかして
UNIXとWINDOWSでは違うのかなと思ったり、そもそもperlのコメント前にそんなの使って
いいのかなと・・・・
やっぱり日本語変かな・・・ごめん
ここで聞くより自分で試した方が早い気が・・・ そんなに手間のかかることじゃないし。
291 :
286 :04/06/12 01:15 ID:???
>>289 2行もレス付けてくれるならyes|noも言って欲しい・・・・・
>>290 かなりのプログラミング言語ではホワイトスペースはどれだけ会っても半角スペース1分として認識される。
みたいなことが見つかった。使っていいんだろうけど、不安。だから誰かに大丈夫と言って欲しい。
大丈夫
ていうか、タブは\tだろ 入れ子をわざわざスペース4個でやれと? アフォの子ですか?
294 :
nobodyさん :04/06/12 02:15 ID:K+1+iYDq
質問です。 1. aタグでcgiにリンクします。 2. まずそのcgiは、aタグをクリックした人のIPアドレスを取得します。 3. その取得したIPアドレスを(毎日0:00にリセットされる)IPリストと照合します。 4. IPリストに同じIPアドレスがあれば、リンク先に飛ばしません。 5. IPリストに同じIPアドレスがなければ、IPリストにそのIPアドレスを書き込み、リンク先に飛ばします。 一日に二回以上、同一IPアドレスからの訪問を拒否するCGIです。 ここで質問ですが、そのリンク先に残るリファラはCGIになるのでしょうか? このリファラをaタグの貼ってあるHTMLのままにすることは可能でしょうか?
296 :
286 :04/06/12 02:35 ID:???
>>292 ありがと!かなりすっきりした!
>>293 憎まれ口を叩きながらも教えてくれてありがと。
>>295 結構普通にありますよね。それで俺もなんかあるのかなと
297 :
286 :04/06/12 02:43 ID:???
>>293 の入れ子発言で思ったけどPERLにもHTMLの倫理マークアップのように正しい
関数の使いかたってあるのかな?
結構元もとの関数の意味を考えて使うと、何の処理なのかわかりやすいかもね。
例えばforeachとmapはmapの方が処理速度は速いけど、mapは返り血を出すから、
返り血が必要ない時には使わない。とかって・・・・意味ないか・・・
倫理マークアップの必要性をを軽く勘違いしちゃったね;
298 :
294 :04/06/12 10:23 ID:K+1+iYDq
>>295 レスありがとうございます。
どのような方法か簡単に教えていただけませんか?
簡単に教えると、ヘッダだ
巨大なファイルで、刻々と追加書き込みされるような場合、 ファイルを開いた時点のファイルサイズがEOFになるのでしょうか? それとも、追加書き込みされた分も読める?
>>300 読んだ時点でのEOFまで読める。
経験上、Linuxは糞で偶に嘘読まされる。信頼性が必要な時は他のプリミティブで同期取らないとだめぽ。
302 :
294 :04/06/12 12:01 ID:K+1+iYDq
>>299 ではもう少し詳しく教えていただきたいです。
>>294 調べもしない君には到底無理だ。作成を諦めろ。
304 :
nobodyさん :04/06/12 12:08 ID:K+1+iYDq
調べてるよ。 locationで飛ばしたらいいだけ?
嘘を掴まされるんだ
>>305 読んだ内容が、書かれているはずの物と異なる瞬間が存在して、その瞬間に読んだときに
ファイルが壊れているように見える。
再現性が非常に低いから解析できてないけど、どうしてもシステムのバグ以外には考えられない現象に遭遇したら、
そんなこと言ってた名無しがいた事を思い出せば、ちっとは得するかもな。
>>308 書き換え前の内容と書き換え後の内容が混ざってるぐらいは
あってもしょうがないかなと思うけれども、どちらでもない
ゴミが読めるってことでしょうか? そうだとするとかなり嫌
な感じだな...
310 :
nobodyさん :04/06/12 13:33 ID:FD8KxqwO
質問します 1. ショッピングサイトを立ち上げているのですが、”決済する” のボタンを押すと、カード会社のサイトにジャンプし 、そのサイトで情報入力を行い、その戻りを受けてユーザに完了画面を出力しようと思います。 2. こちらから、form post で、カード会社のCGIを呼び出し、カード情報入力画面をだします。 そのCGIは結果を success 又は ng でこちらに返してくるのですが、このままのつくりだと、 ユーザにカード情報入力後の画面に success , 又はngと ぽつんと表示され訳がわからない状態となります 3. そこで、 form post属性で他のcgiを呼び出し、その結果を受けて、”xxxx円 決済が完了しました ありがとうございます トップに戻る” と出したいのです。form post で呼び出したcgiの結果を判定する方法がわからないので、教えて下さい。
>>297 倫理マークアップじゃなくて論理マークアップな
>>310 少なくともスレ違い。ま,板違いだろうか。
>>310 良かったら、どこのサイトか教えてくれないか?
2chで質問しながら作るような奴が作ったサイトでは絶対に買物したくないからな。
カード会社ってCGIで決済してんの?
>>313 おまえみたいなのよくいるけど、実は居酒屋とかでカード使うほうがよっぽど危ないよ。
居酒屋でカード使う奴は居ないだろ。 そんな馬鹿な奴は挙手汁。
>倫理マークアップじゃなくて論理マークアップな ああ!! いやマジで何なんだろうと悩んでたよ。<good>とか<evil>とかいうタグがあるのかと。
<chinko>タグ
>>316 居酒屋でも飲み屋でも使わないのおまい?
例えにマジレス、しかも粘着 アイタタタ
流石に亀ではないでしょ
324 :
313 :04/06/13 15:17 ID:???
>>315 残念だな、俺はアルコールアレルギーで、居酒屋も飲み屋も行かない。
かわいそうだな。
1: Perlでパックマンを作りたい 2: それでラマ本を読んでみたが 3: 画面の作り方すら分からない よろしこ。
クライアントサイドで動かせる言語で作れよ マジレスしてよかったのかな
>>326 GUI でやりたいのなら Perl/Tk とか Win32::GUI とか WideStudio とか調べれ。
オス。調べてくる。 コマンドプロンプトでとかは無理かい
web製作板やWebProg板のスレタイを探したのですが どこで質問すればいいのかわからなかったのでここで質問をします スレ違いの場合は誘導お願いします 2chではread.cgiを使ってブラウザでも読めるようなcgiを作ってますが cgiで引数を指定するのは?のはずなのにcgiの次が/で引数にはならないと思います どうやったら?を入れなくても引数を指定することが出来るんでしょうか?
>>331 おまえ馬鹿?引数とか意味もわからず使うなよ。お前の言いたいのはformのmethodだろ。
form method で調べて来い
>>332 馬鹿?とか言ってるのにヒントをしっかりくれる優しい人がいてよかた。。。
なんか泣けてきた
ありがとう
+from methodでぐぐっても解りませんでした どちらか片方の用語だけでも調べようと思い perl +fromやperl method 用語などでもぐぐりましたが全然でてきません。。。 もう少しヒントをください
>>331 >>334 >2chではread.cgiを使ってブラウザでも読めるようなcgiを作ってますが
>cgiで引数を指定するのは?のはずなのにcgiの次が/で引数にはならないと思います
>どうやったら?を入れなくても引数を指定することが出来るんでしょうか?
つまり Perl で CGI の 引数 について知りたいわけだろ?
自分で書いておいて何故わからんのか
>>334 はいはい
PATH_INFOでぐぐりなさい
そしてもうここでは聞かないでください
>>335 perlは全然知りません
Cを少しかじってるぐらいですが
ブラウザで?を入れると引数が入るのを以前確認しただけという知識です
>>336 ありがとうございます
>>331 でも書きましたがスレ違いということならば
誘導先を教えてください
理解できました
>>336 さん
本当にありがとうございました
やっと馬鹿が消えたか。それにしてもHTMLすら知らないとは・・・。
通販サイトをはじめて作ってるんだけど、注文はsendmailで流してもらって、その後 客に「この注文内容でいいですか?」みたいなメールを送りたいんだけど、毎回手打ちは面倒だから perlでテンプレでも作って、注文内容や送り先とかを自動で埋め込むみたいなのを作りたい。 でも具体的にどういう設計にすればいいか思いつかない・・・ とりあえず注文メールにここから客へのメールが贈れます、みたいなURLを渡して そこにアクセスするとその時の注文内容とかが書かれたメールの本文が既にできあがって いて、ワンタッチで送信。 みたいなのがいいと思うんだけど、やっぱ注文受けたときに新規のファイルでも作って、その URLをメールで渡すくらいしかないかな?なんかイケてないんだよね。
ここはコーディングのスレです。
↓次の人どうぞ〜
344 :
341 :04/06/14 20:13 ID:???
>>344 流れ的には問題ありありかもしれないけれど一つの方法として、
自分宛に送られてくる発注メール自体を「この注文内容でよろしいですか?」にして、
うけとったらそのまま発注者へ流せば手打ちの手間が減るですね(w
die "テスト:エラー"; とやってもエラー画面の表示が変わらないんだけど何がおかしいの? 環境はwin98/ie6/httpd142k/activeperl5.6/
activeperlとやらのマニュアル嫁。結構良く出来てるぞ。
349 :
341 :04/06/14 20:42 ID:???
>>346 おお!レスありがと!
「この注文内容でよろしいですか?」のメールを実際に贈るのは
コンピュータ全く知らない素人だからインターフェースをある程度のものにしなきゃ
と思ってる。
>>346 のやり方で思ったけど、普通に注文を知らせるメール本文の下の方、というかある程度
感覚を空けて、客に出すメールの本文をくっつけておけば、後はそれをコピペ。みたいでもいいかも。
ただ、実際にやる人間がコピペができるかどうか・・・・;
350 :
347 :04/06/14 20:44 ID:???
>>348 じゃあここは何の為にあるの?・・・・・・って浮かんできたけど、読んでみる。ありがと。
質問するのはマニュアル読んだ後な、それでも分からなかったらって事。
>>346 お前は運用の板でネチョネチョやってろよ。
色んな板で糞コテの売名したいか?
>>349 だからスレ違いだって言われてるだろ。
ウザイからもう来るな。
UIのスレはここではない!
>>346 コテはうんざりだから必要もないのにいちいち名乗るな。
それこそ売名ならやめられんのかもしれんが。
本7とカポコンの悪臭だけでゲロゲロだから。
356 :
:04/06/15 13:21 ID:???
WWW:Mechanizeを使おうとすると Can't locate object method "requests_redirectable" via package "WWW::Mechanize" (perhaps you forgot to load "WWW::Mechanize"?) at C:/Perl/site/lib/WWW/Mechanize .pm line 156. というエラーが出されるのですが、ソースでは use WWW::Mechanize; と宣言しています。原因はなんでしょうか?
>>356 だからここはコーディング質問スレだっていってんだろ!!!!!!
モジュールの使い方は専用のスレに行け!!!!!!!!!!!
if($res =~ m/!!!!!/) $flag = "厨房";
360 :
nobodyさん :04/06/15 16:21 ID:dQxW4G/W
以下のような、1行に1件分の情報が記述されているタブ区切りテキストがあります。 このデータをブラウザから編集させたいと思うのですが、なにか参考になるモジュールなどは ありませんでしょうか? Perl5以上で動作するものがいいです。 ----- # 会員番号 名前 電話番号 0001山田 太郎090-1234-5678 0002山田 次郎090-1111-2222 -----
CGIとして使うならモジュールも糞もあるか?
ログを読み込んで<INPUT type="text">内に吐かせればいいんじゃないか? もしかして俺は釣らr(
質問いいでしょうか。 メールアドレスを入力するフォーム部で、[0-9A-Za-z]と[@.-]以外の文字列が含まれていた場合、エラーを返す処理を行いたいと思います。 使用可能な文字列を配列@availableに入れるとして、$mailに配列@available内の文字以外のものがあれば○○する、という記述をしたいのです。 foreach (0 .. $#available) { if (index ($mail, $available[$_]) >= 0) { こう書くと、@available内の文字があった場合に処理を行うということになりますが、 @available内の文字以外のものがあれば、という判定はどのように書けばいいのでしょうか。
>>363 > メールアドレスを入力するフォーム部で、[0-9A-Za-z]と[@.-]以外の
> 文字列が含まれていた場合、エラーを返す処理を行いたいと思います。
$mail =~ /[^\-.0-9\@A-Za-z]/ and error();
言われて見れば全くその通りで・・・
>>364 氏感謝。何で正規表現の否定が思いつかなかったんだ orz
366 :
360 :04/06/15 18:24 ID:dQxW4G/W
>361 >CGIとして使うならモジュールも糞もあるか? すいません、意味が分かりません。
意味が分かるようになるまで最低限御勉強しようね。 言葉が通じないのでは御話にならない。
数行にわたって ID:passという書式でかかれているdatファイルから 特定のIDとパスワードを検索してその文字列だけを書き換えたいのですがどうすればいいでしょうか? 教えて下さい。お願いします。
やることわかってるじゃん open でファイル開くことから教えてくんかい?
371 :
369 :04/06/15 23:25 ID:???
ファイル読み書きはできます。 特定のIDとパスワードを検索してその文字列だけを書き換えたい という処理の仕方をどうすればいいかわからないんです。よろしくお願いします。
ちょっとは自分で考えないのかね。
頭が無いんです
> 特定のIDとパスワードを検索してその文字列だけを書き換えたい 正規表現を15分でいいから勉強するよろし。
378 :
369 :04/06/16 17:05 ID:???
質問いいでしょうか。 BBSでの投稿フォームの記入内容にNGワードが存在する場合にエラーを返す処理をしたいのです。 フォームはname,mail,textの3つのフィールドがあります。 @ng_word = ("逝ってよし"); # テキスト内を検索して、NGワードが存在した場合 foreach (0 .. $#ng_word) { if (index ($name, $ng_word[$_]) >= 0 || index ($mail, $ng_word[$_]) >= 0 || index ($text, $ng_word[$_]) >= 0) { 以下略 上記の4行目の判定部分なのですが、フィールドが増えるたびに index ($mail, $ng_word[$_]) >= 0 || のような書き方を追加して書かなければならないのでしょうか。 $nameや$mailなどをあらかじめ配列に追加しておいて、配列内のそれらの変数を判定させると言う書き方はできませんか?
>>379 です。
解決しました。レスありがとうございます。
すみません。正規表現について教えてください 文字列内に以下の条件を含む部分があるかどうかを チェックするために正規表現を使ってみたいのですが いかようにすればよいでしょうか? ?nnnn (nnnnは4桁の数字)
スレタイ嫁 でも俺すげー優しいからヒントをやろう。 0-9 あとは自分で考え。 スレタイ嫁
できました。 "?[0-9]{4}"
スレタイ嫁ってなんですか?
それじゃダメだと思うが どうダメかは正規表現道場スレで聞け
>>387 マジですか?
お願いします。教えてください。なにとぞなにとぞ
>どうダメかは正規表現道場スレで聞け
さてはわからないんですね?
まあ煽っても何も出ないんで該当スレに行くか諦めて下さい。
ワロタ お前等面白い
perlと言うかjavaスクリプトも絡んでくるかと思いますが フォームからPOSTで送信してcgiから帰って来る結果を小さいウインドウを別にポップアップして そこに表示したいのですが、どうすればいいでしょうか? 教えて下さい。お願い致します。
396 :
nobodyさん :04/06/19 04:43 ID:Bryn3NL2
質問です ブラウザからあるperlのプログラムを起動して、データベースの更新をしているのですが、 これをバッチとして自動起動したいと思っています。 で、 perl xxxx.cgi とすると、エラーになります。 どこでエラーになるかを調べたところ require xxxxx.cgi でrequireが正しくされていないようです。 perl はバッチ処理としては動かないのでしょうか?
requireをドライブ名からの絶対パスで指定すればいいんでないの?
398 :
nobodyさん :04/06/19 07:28 ID:Bryn3NL2
>>397 レスサンクスですが
絶対パスでもだめでした
1.プロ野球の順位を「変動勝ち点制」(と私が名づけたシステム)で 順位付けをしたいです。「変動勝ち点制」とは、1位のチームは6点、 2位のチームは5点、という具合に各チームがランキングポイントを 持っています。試合の勝者が相手チームのランキングポイントを獲得し、 トータルポイントに加算していきます。その日の順位によってランキング ポイントは変化します。 2.以下にソースを貼り付けます。データを保存しているresult.datは 1行がこんな風になっています。「d,l,w:k,n,w:l,o,q」。":"で区切った 一番目の要素が勝者で、2番目が敗者です。3番目に"w"となって いるのは試合が決着した場合、"q"は引き分けです。 3.エラーは出ないのですが、何も答えてはくれません。CPUが100%になって いるので何かやってはいるみたいなのですが……。
400 :
399 :04/06/19 09:50 ID:???
#$?[0]はチームの頭文字。$?[1]はトータルポイント。 #$?[2]は昨年の順位=ランキングポイント。 @d=("H","0","6");@s=("L","0","5");@k=("Bu","0","4"); @n=("F","0","3");@l=("M","0","2");@o=("Bw","0","1"); #result.datからその日の試合結果を入力する open (RESULT,"result.dat"); while ($result = <RESULT>){ chop($result); while($x = split (/:/,$result)){ while(@y = split(/,/,$x)){ if($y[2] eq "w"){ $$y[0][1]=$$y[0][1]+$$y[1][2]; }else{ $$y[0][1]=$$y[0][1]+($$y[1][2] / 2); $$y[1][1]=$$y[1][1]+($$y[0][2] / 2); } } #その日のランキングポイントを決める #鷹 $rp=6; if($d[1]<$s[1]){$rp=$rp-1;}elsif($d[1]<$k[1]){$rp=$rp-1;} elsif($d[1]<$n[1]){$rp=$rp-1;}elsif($d[1]<$l[1]){$rp=$rp-1;} elsif($d[1]<$o[1]){$rp=$rp-1;} $d[2]=$rp; #あとは同じなので省略。猫、牛……と去年の順位にしたがって続きます }} close (RESULT); #結果を出力 print ("H\t$d[1]\n");print ("L\t$s[1]\n");print ("Bu\t$k[1]\n"); print ("F\t$n[1]\n");print ("M\t$l[1]\n");print ("BW\t$0[1]\n")
>>396 perl -IC:/WINNT/system32 foo.cgi
-Iオプションでrequireするディレクトリを追加してみるとか
>>400 whileって何するのか勉強してこい
わいろ
403 :
nobodyさん :04/06/19 14:47 ID:Bryn3NL2
配列に格納されたハッシュの、特定のキーの値で配列をソートすることは出来るのでしょうか? @array( {'a'=>'value1','b'=>'1234'}, {'a'=>'value2','b'=>'4518'}, {'a'=>'value6','b'=>'4879'}, ); とあったとして、bの値でarrayをソートしたいのですが。
406 :
nobodyさん :04/06/20 06:51 ID:F4x9/MNB
どなたか教えてください 元々 Perl(CGI) で動いてたものを PHP へ移植したんですが、クライアントからの呼び出しが a.cgi 固定で PHP を cgi として動かせないサーバで困っています そこで a.cgi(Perl) は a.php を呼び出すだけの機能にしたいのですが Perl(CGI) から PHP は どのように呼び出せばいいのでしょうか? よろしくお願いします
>>406 <Files a.cgi>
AddType application/x-httpd-php .cgi
</Files>
(w
ログファイルを保存するのに open(IN,"$logfile") || &error("ファイルがオープン出来ませんでした。"); @nakami=<IN>; close(IN); $log = "$title<>$time<>message\n"; unshift(@nakami,"$log"); open(OUT,">$logfile") || &error("ファイルに書き込み出来ませんでした。"); print (OUT "@nakami"); close(OUT); と書いたのですがログファイルの先頭にスペースがついていってしまいます。 $title<>$time<>message $title<>$time<>message $title<>$time<>message とこういう風に上書きしていくとどんどん増えていってしまいます。 どこがわるいのでしょうか?教えて下さい。お願いします。
つい最近も見たような質問だな。 ところで @nakami=<IN>; って、 昔俺が赤ラクダ本を読んだときには「そんなことするな」と書いてあったような記憶が あるんだが、最近はみんなやってることなの? ファイルを全部いっぺんに読み込むからメモリが膨れ上がって、 共用サーバだと結構世の中の迷惑なんじゃないかという気がするんだが。 一行毎に処理していたフィルタ全盛時代の美徳はもはや失われてしまったのか。
410 :
408 :04/06/20 14:44 ID:???
>>409 私は自宅鯖なのでその処理はメモリ使うって書いていましたが気にせず使っています。
411 :
406 :04/06/20 15:10 ID:???
>>407 ありがとうございます
これって apache の設定ですか?
であればレンタル鯖なのでいじれないんです
他になにかいいアイディアはないでしょうか
よろしくお願いします
open(IN,"$logfile") || &error("ファイルがオープン出来ませんでした。"); @nakami=<IN>; close(IN); $log = "$title<>$time<>message"; unshift(@nakami,"$log"); open(OUT,">$logfile") || &error("ファイルに書き込み出来ませんでした。"); $" = "\n"; print (OUT "@nakami"); close(OUT);
413 :
406 :04/06/20 16:18 ID:???
>>412 うまくいきました。
ありがとうございます。
414 :
406 :04/06/20 16:19 ID:???
と思ったらうまくいきませんでした・・・
>>404 my @new = sort{ $a->{b} <=> $b->{b} } @array;
>>406 print (OUT @nakami);
@list = (name<>pass<>3, name<>pass<>7, name<>pass<>5); このような配列があるときに、配列の一部に存在する 3, 7, 5の数字を使ってソートしたいです。 こう並べ替えたい↓ @list = (name<>pass<>7, name<>pass<>5, name<>pass<>3); のですが、うまく処理する方法が思いつきません。 よろしくお願いします。
>>418 @list =(
"name3<>pass3<>3",
"name7<>pass7<>7",
"name5<>pass5<>5");
@array = sort{(split(/<>/,$b))[2] <=> (split(/<>/,$a))[2]}@list;
こんな感じか?
もうちょい綺麗な書き方ありそうだが…
>>417 このケースで効率的なシューウォーツ変換ってなによ?
シューウォーツ変換が効率的なのは
>>418 のようなケースだろう。
>>418 @list = map{ $_->[1] } sort { $a->[0] <=> $b->[0] } map{ [(split /<>/)[1], $_] } (...list...);
421 :
420 :04/06/20 22:39 ID:???
おっと、微妙にソートの前処理が間違ってたな。 適当に脳内補完してくれ。
>>419 理解できてないですが、
テストした結果うまく動いてるようです。
ありがとうございました。
423 :
415 :04/06/20 23:45 ID:???
>>417 私にはさっぱり想像がつかないので、
>>404 のケースでの使い方を教えてください。
>>418 数値が一桁固定なら、こんなのも。
my @new = map{ substr($_, 1) }
sort map { pack('A1A*', (split(/<>/))[2], $_) } @list;
424 :
406 :04/06/21 04:08 ID:???
うぅ Perl から PHP を呼ぶ方法は無いのでしょうか クライアント側の変更をお願いするしかないのかな...お金が飛んで行く〜
配列hogeにテキストがいくつか入っていて、 それを以下のような形で全て表示させたい場合、 合理的というか、無駄のない書き方が思い浮かば困ってます。 ┌テキスト1 ├テキスト2 ├テキスト3 └テキスト4 今↓のように書いているのですが、おそらく効率がわるいような気がします。 foreach (0 .. $#hoge) { my $prefix; if ($_ == 0) { $prefix = '┌'; } elsif ($_ == $#hoge) { $prefix = '└'; } else { $prefix = '├'; } print "$prefix$hoge[$_]<br>\n"; } こういうのを書くことって結構あると思うんですが、 ご教示いただけませんでしょうか。
426 :
nobodyさん :04/06/21 07:29 ID:pRQNX02o
$a='124'; $a=~tr/0-9/0-9/; print $a これは「124」となる筈ですよね? 何故か「020305」となります。 もしかしてバグでしょうか? 環境は XP + ActivePerl 5.8.3 です。
>>426 あれだよ。あれ。全角使うならもう少し考慮すべきことがある。
すいません jcode.pl使います
>>425 foreach (0 .. $#hoge) {
printf qq|%s%s<br>\n|, $_ ? $_ == $#hoge ? '└' : '├' : '┌', $hoge[$_];
}
ややブサイコ
>>428 おーい 5.8 だろ?(w
die if $#hoge < 1; print "┌$hoge[ 0 ]\n"; for(1..($#hoge-1)){ print "├$hoge[ $_ ]\n" } print "└$hoge[$#hoge]\n";
die if $#hoge < 1; $first = shift @hoge;#効率悪いかも $last = pop @hoge; print "┌$first\n"; print "├$_\n" for(@hoge); print "└$last\n";
どいつもこいつも die だの 死ぬだの、、、もっと命を大事にしてくれよ!
かと言って本7みたいに逃げてばかりなのもイカガ谷^hなものかと。
>>426 jcodeを使っても、sjisの場合とかは第二引数に範囲指定が効かない場合がある。
&jcode::tr (\$value, "0123456789", "0-9");
>>434 ていうか、jcode.plに範囲指定はJISとEUCでしか使えないって書いてあるよ。
;# Range operator like `A-Z' for 2 byte code is partially
;# supported. Code must be JIS or EUC, and first byte
;# have to be same on first and last character.
PerlでForm動かすのが激しく苦手なので得意な方教えてください。 FormでボタンAとボタンBを作って、web上でボタンA、Bを押すとそれぞれ $Xの数値を変える(たとえばボタンAを押したら$x = 1、Bを押したら$x = 2) というのを作りたいんですが、どうすればいいでしょうか。 教えてください。お願いします。
↑とりあえず黙ってくれる?そしてスレタイ嫁
きっと説明も激しく苦手なんだろうよ
<form method="POST" action="hoge.cgi> <input type="radio" name="x" value=1>Aボタン <input type="radio" name="x" value=2>Bボタン </form> −−−hoge.cgi #! /path/to/perl use CGI; $cgi = CGI->new(); $x = $cgi->param('x'); print $cgi->header(); print $cgi->start_html(); print $x; print $cgi->end_html();
PERLでフォームからのデータをSTDINから受け取ってそれを使って色々処理をする場合 受け取った一番初めに中身に変な文字列が入っていないかを検査したほうがいいのですか? 変な文字列というのはPERLの命令文とかです。受けたデータをそのまま使うの大丈夫なのかなと 疑問に思ったので質問しました。どなたかお願いします。
>>440 渡すのもあなた、受け取るのもあなた。
変なものを渡さないようにするのもあなたでしょ?
誰か知らない人から受け取るんなら、どんなもの渡したのかその人に聞くか、
中身みて期待値かどうか自分で見て下さい。
どなたか知りませんがお願いします。
442 :
440 :04/06/22 20:24 ID:???
>>441 質問の仕方がわるかったのでしょうか?
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
print $buffer;
とかした場合にJSとかHTMLのタグじゃなくperlの関数とか命令文が入っていた場合に
その命令文が実行されてしまうのですか?という質問です。
お願いします。
されるわけがない。
445 :
440 :04/06/22 22:27 ID:???
>>443 ですよね。簡潔で最高な答えありがとうございました。
>>444 鯖はまだなのでhttpdとactiveperlでやってます。どっちにしろレンサバでperlのテストなんか
馬鹿なことしませんけどね。
ところで何故にperlの命令文は無効になるんですか?evalしたら実行されますよね?
#自治厨
スレ違い
>>自治厨
森へお帰り
#444
やってみろよ
>>444 お前の話はつまらん
またh(ry
バカが(ry
>>440 は馬鹿なのかお調子者なのか。
どっちにしてももう答えてくれる人はいないだろうけど。
今さらjcode.plもないだろ。奥付見て、3年以上前のPerlCGI入門書は買わないよーに。
perlスクリプトで、標準入力へ入力させる方法がわかりません。 具体的には、passwdコマンドをperlから実行し、2回促される 入力をプログラムから自動的に入力させたいといったもの です。 もしも何か方法があれば教えていただきたい次第です。 宜しくお願い致します。
perlじゃなくて、expectを使おう。
452 :
440 :04/06/23 01:16 ID:???
わかんないですか?
↑古典的且つ模範的な教えて君登場↑
スクリプトを書きながら気になったのですが、 各サブルーチンをスクリプト内に全部記述するのと、 それぞれにライブラリファイルを作成して必要なときのみrequireで読み込むのとどっちがいいんでしょうかね? いまいち意味不明っぽいですが、つまりは if ($bar) { require "hogehoge.pl"; &hogehoge::foo(\$bar); } と if ($bar) { &foo(\$bar); } のどっちがいいのでしょうか?
時と場合によるよ。たくさんプログラムを書いてる内にうまく使い分けができるようになる。
>456 レスありがとうございます。 使い分け、頭の片隅に置いておきます。 まだまだ常時考えながらはコード書けませんです、はい。 もう少し色んなこと考えながらコード書かないとだめだなぁ…
1<>い<>12:50<> 4<>あ<>20:02<> 2<>き<>08:41<> このように並んでいるテキストを、入力された数値によってソートしたいのですが 今は if($num==1){ }; if($num==2){ }; if($num==3){ }; みたいに書いてるのですが、もっとスマートなやり方は無いでしょうか?
やかましいわいヴォケ ちゃんと説明しろ
$data{$num} = $line; 見たいにハッシュにぶち込んで、 foreach my $num (sort( keys %data)){ #$data{$num} の処理 } にする
463 :
440 :04/06/23 12:42 ID:???
うん。わかんないよ。 さあ帰った帰った。
>>463 すんげー難しいからわかるやつはどこにもいないよ。
じゃあバイバイ。
cookieを読みこんで配列にしたいんだけど、 $a = $ENV{'HTTP_COOKIE'}; @a = split /\;/,$a; foreach(@a){ (my $a , my $b) = split /=/; $form{$a} = $b ; } クッキーの中にNAME=VALUEが一つだけでも複数あっても大丈夫のようにしたいんだけど、↑ので 合ってる?一つの場合は@aの中には$aがそのまま入るから一応大丈夫だと思うけど、 ここのお墨付きをもらいにきた。
468 :
466 :04/06/23 21:37 ID:???
うん。わかんないよ。 さあ帰った帰った。
>>468 すんげー難しいからわかるやつはどこにもいないよ。
じゃあバイバイ。
471 :
466 :04/06/23 21:41 ID:???
>>469-470 ここには回答者は一人しかいないのか?
とりあえず一人二役とか恥ずかしいから止めとけって。
472 :
440 :04/06/23 21:44 ID:???
なんかキモイですねここ。 >さあ帰った帰った。 ってまるで、ここがあなたの居場所みたいな言い方ですけど、 ここがあなたの居場所なんですか?
(´-`).。oO(恥ずかしい質問をしてる奴がよく言うよ・・・)
475 :
466 :04/06/23 21:46 ID:???
誰かまともな人いたら
>>466 お願いね。
まともな人のお墨付きが欲しいんだ。
ここは香ばしいインターネッツですね
478 :
440 :04/06/23 21:48 ID:???
>>473 私に言ってるのですか?
ところでこのスレがあなたの居場所なんですか?
お前ら幼稚な争いはやめれ。 ここは質問スレなんだから、喧嘩はよそでやってくれ。
482 :
466 :04/06/23 21:54 ID:???
>>479 おまいは
>>469-470 だろ?でもまあ俺は単純だから、俺より詳しそうなおまいに
okを出してもらえば、それで安心だよ。ありがとね。
>>467 でくれたサイトもいいとこみたいだから見に行くよ。それじゃ。ごめんね。
483 :
480 :04/06/23 21:56 ID:???
>>481 俺にはここに俺ともう二人しかいないようにしか思えないんだが・・・・
そして俺以外の二人に向けて言ったんだけど、まあとりあえず早く正常に戻そうよ。
それでは次の質問どぞ↓
484 :
440 :04/06/23 21:57 ID:???
ところでこのスレがあなたの居場所なんですか? いつになったら答えてくれるんですか?恥ずかしくて答えられませんか?
----- 終了 -----
一連の流れを読んでみて思った。 質問者も悪いが、すぐムキになる回答者もどうかと。 っていうかこのスレの回答者は特有だね。 母親に向かってすぐ「くそババァ!」って連呼するタイプの人間だな。内弁慶っていうかな。
>>487 >>1 良い回答は良い質問から。
^^^^^^^^^^^^^^^^^^^^^^
>>488 そうやっていつでも相手のせいにする辺りもどうかと。どちらかが大人になるしかないでしょ。
ロクでもない質問はいっさいレスをせずに無視しとくか
>>486 俺がくらったじゃねえかよ!マジで鬱・・・・何のウイルス?
色々探したが見つからなかった・・・・ウイルス対策なしの俺がここのURLを見に行くなんて
しくじった。
perl_tipsっていかにも正当な名前なのに。マジで直し方教えてくれ。
494 :
491 :04/06/24 00:04 ID:???
>>492 ありがとう・・・・スキャンかけたいけど、っていうか対策ソフトいれたいけど、c:\が残り
50MBしかないから・・・・
とりあえず、ブラクラ系みたいなのでほっとしてる。変な症状もないし、スタートアップにも
新しい奴なかったからほっとく。
それにしても何故にこのスレでトロイの木馬が貼られてるんだよ・・・・・そんなに憎悪を抱いたのか?
495 :
491 :04/06/24 00:05 ID:???
>>493 そんなこと言うなよ・・・・・既に鬱なんだから、追い撃ちかけるのは止めて・・・・
>491
ソース見てみたが、ウィルスではないと思うぞ。
<meta http-equiv="Refresh" content="0">と、
コンコンクラッシャーとメールストーム。
ただし、
<img src="
http:// www. raus. de/ crashme/">
の部分が完全一致でをウィルスとして認定するらしい。
(全角スペースを空けて反応しないようにしてある)
497 :
491 :04/06/24 02:23 ID:???
>>496 ありがと。その優しさに軽く感動;;
俺実は2回踏んだのね。一度目はセキュリティ中のままで行ったらいきなり画面が真っ青になって
例外なんとかってやつが出て再起動して、レジストリ修復してセーフであげてscandiskとかした後、
普通に立ち上げたらとくには問題ないみたいだった。
2回目はそのソースをブラクラチェッカにかけてみたけど、そのチェッカの使い方がわからずに、セキュリティを
最高に挙げて愚直にトライ。結果同じ症状で再起動した後、同じ事やって今の状況・・・・・・
俺の場合ウイルスのとこに行く前に、例外発生画面になった気がする。クリック1秒未満で画面が何も変化
ないまま次の画面は青い例外発生画面だったから。
ほんと優しくしてくれてありがと。癒されたぽ
498 :
491 :04/06/24 03:13 ID:???
おまいらスレ違いすぎ。 - - - - - Perl コーディング初心者質問コーナー Part35 - - - - -
ブラウザの「進む」とか「戻る」でcgiのページに移動すると、 警告:ページの有効期限切れ というメッセージが出るのですが、それが出ないサイトもあるみたいですが、 それはどういう方法を使ってるのですか?PERLでのやりかたが知りたいので教えて下さい。
htmlのノーキャッシュじゃねーの?
厳密にはhtmlとは限らない罠
>>500 formのmethodをgetにする。
504 :
500 :04/06/24 20:31 ID:???
>>501 キャッシュの制御を<meta>で変えればいいのですか?
>>502 HTTPのヘッダーの辺りということでしょうか?
>>503 getだとできるんですね!getの時はブラウザの戻る、進むでクエリ付きURLだから
そのまま処理をしてくれるということみたいですね。
postの場合は標準入力から読みこむ。それで、postで送ったフォームデータは
セキュリティ上の都合でブラウザ?のデフォルト設定が自動再送信しないようになって
いるんですよね?HTTPのヘッダに何かを追加すると、その設定が変えられるというわけでしょうか?
Expires:
俺も昔気になったときにメソッドによるのかな?と思ったが、 結局違うくて、ノーキャッシュだったと思うんだがなぁ 兎に角何でもかんでも1から10まで全部他人に頼ろうと思わず、 与えられた情報を自分で試す努力しろっての
それ以前にスレ違い
>>504 一応header関連だった気がするが、cgiの出力をキャッシュさせるかどうかは
pragma
expires
cache-control
他にもなんかあった気がするけど、HTTPサーバによっては-nphで自分で一からheader
を設定しないと、勝手にno-cacheを吐き出すよ。たしかね。
どうだったっけかな。思い出せない。
509 :
500 :04/06/24 21:56 ID:???
ありがとうございます!今ローカル環境で試してますがなかなかできません。 print "Content-type:text/html\n"; print "Expires:Sun, 06 Nov 2005 08:49:37 GMT"."\n\n"; このようにしてみましたが、効果なしでした。かなり高度なテクニックなんですかね?
この手のはブラウザ依存すると思うので、セッションを持たせて、セッションデータから毎回ページを作リ直す、って方向でやった方がいいと思う。
>>509 おまいには悪いが、誰もわからない悪寒・・・・・・・
ついでに
>>507 のいうようにスレ違いぽ
まあ一応
PERLでどうコーディングしたら出力がUAにキャッシュされるか
という質問みたいだからあながち的ハズレなスレ選びではないが。
どっちにしろ様子をみてる限りではわかる人は今のとこ、まだ来てないんじゃないか?
結局自力で調べるしかない。ガンガレ
512 :
500 :04/06/24 22:19 ID:???
>>510 シェア90%を誇るIEだけクリアできれば満足なんですが、やはり難しいんですね。
cgiの使い勝手のよさを上げようと思っただけなので、無理でも一応機能的には影響はないです。
>>511 応援ありがとうございます。頑張ります!
>>513 またウイルスだったりして・・・・とりあえず関係ない俺は踏まないでおこう。
ActivePerlをwin98に入れてPERLのテストしてるんだけど、-cを使った文法チェックが うまくいかない。 コマンドプロンプトで d:\perl\bin>perl -c ファイルへの絶対パス でやってるけど、useがないものならうまくいくけどuseがあると何故かuseしてる行数に エラーがあるって出力される。 実際にhttpdで表示させると問題なくできるやつだから、何が悪いのかわかんない・・・・ もしかしてActivePerlの文法チェク機能ってuseでモジュール読みこんでるとしくじるの? ちなみにモジュールは自前のPERLだけで書いた簡単なやつ。 誰か何か知ってたら教えて下さい。
>>516 >>1 より抜粋
3: こんなエラーが出て上手く行かなかった。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最低でも1と3が無いと誰も答えられないよ。
syntax error at
>>519 line 1, near "use
>>516 の頭" Execution of
>>519 aborted due to compilation errors.
範囲演算子って、小さい値〜大きい値の範囲じゃないと動かないんだね… @Time = gmtime( time + 60 * 60 * 9 ); $Time[5] += 1900; $Time[4] += 1; ってしたときに、 sprintf( "%04d/%02d/%02d", @Time[5..3] ); がやりたかったんだけど。。 こういう場合って羅列するしかないんですかね?
522 :
516 :04/06/25 14:04 ID:???
どうゆこと? useしてるものは自作のモジュールって書いたし。 エラーはuseが書いてある行数のとこで出てるって書いたけど、エラーの内容も出力されてるはずだから それを出せってことかな? ごめん。今からエラー文そのままあげます。
>>522 俺は今日初カキコだが、
>>517 と同じことを思ったよ。
>useしてるものは自作のモジュールって書いたし。
ってあるけど、最後におまけのように書いてあるだけじゃん。普通に見落とすよ。
要するに質問の仕方がド下手糞ってことだ。
あるスクリプトを-cオプションでチェックするとエラーがでます。
環境は、Win98 + ActivePerl version○○です。
↓のようなスクリプトで、
---hoge.pl---
1: #!/usr/bin/perl
2: use mymodule; # 自作モジュール(簡単なPurePerlライブラリ)
------------
C:\>perl -c hoge.pl
とすると、
○○○ at hoge.pl line 2.
と出ます。
でも、CGIとしてhttpdに実行させると問題なく動きます。
もしかしてActivePerlの-cオプションはuseでモジュール読みこんでると失敗するのですか?
まず何を調べるべきでしょうか?
>>521 sprintf( "%04d/%02d/%02d", reverse(@Time[3..5]) );
@INC
526 :
516 :04/06/25 14:57 ID:???
>>523 ごめん。
D:\Perl\bin>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI
これをやったら↓のエラーがでた。
Can't locate Test1.pm in @INC (@INC contains: D:/Perl/lib D:/Perl/site/lib .) at
C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B
.CGI line 3.
b.cgiの中身は↓
#!/usr/local/bin/perl
push( @INC, 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\Test1.pm' );
use Test1;
print "Content-type:text/html\n\n";
print "aiueoi";
useしているTest1.pmの中身は↓
package Test1;
#京
sub new{
my $self = shift;
my $obj = {a => 1 , b => 2};
bless $obj,$self;
}
1;
モジュールだけ-cに書けるとエラーはでないのでモジュール側には問題なしかと。
527 :
516 :04/06/25 15:51 ID:???
#!/usr/local/bin/perl b.cgiを書き換えてみたけど、 package main; BEGIN { push( @INC, '/Test1.pm' ); } use Test1; print "Content-type:text/html\n\n"; print "aiueoi"; まだエラーだった。 Can't locate Test1.pm in @INC (@INC contains: D:/Perl/lib D:/Perl/site/lib . /Te st1.pm) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI line 9. BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B .CGI line 9. @INCへの追加が失敗していて、読みこむファイルのパスが見つからないってことだよね?
>>527 ああなるほど、こりゃ確かに
>>516 の質問の仕方が悪い。
どうすればいいかを教えるのは簡単だが、その前に一つ質問に答えてくれ。
なんでまた、
「@INC に push しさえすればサーチパスを追加できる」
なんてことを考えたんだ?
use libしろ。または、ちゃんとプログラムが置いてある所まで移動してやれ。 か、Perl/libに入れるとか
530 :
516 :04/06/25 17:25 ID:???
>>528 http://www.rfs.jp/sitebuilder/perl/ ここの@INCの説明にpushすればいいて書いてあったんだけど、意味を勘違いして受け取ったのかも;
それで
http://nonki.net/technical/perl/library/ ここの
>@INCに手動で追加する
っていうところ読んで、BEGINしてみたけどそれも間違ってたのかも;
>>529 use lib;
の一行を足してみたけど、駄目だった。それでプログラムが置いてあるフォルダに移動して
C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\
CGI-BIN\TEST\B.CGI
をやったら
C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI syntax OK
成功した!感激!
Perl/libに入れるというのはプログラムをそのフォルダに入れとくって事?やってみたら
同じエラーがでた。
本当は@INCにどうやって追加すればいいんでしょうか?beginもうまくいかないし;
後、文法チェックでは
>>526 で書いたプログラムはエラーだけど、httpdで
http://localhost/cgi-bin/test/b.cgi でやると問題なく動作するけど、サーバではエラーになるんですか?
まだサーバと契約してないから、試せない。
おお!すごいなぁ。
最高ですね!
初心者は perl をインタプリタ言語だと捉えがちで、確かに見た目はそう見えるが、 内部的にはコンパイル言語であり、そう認識しないと往々にして罠にはまる。 その罠の一つが use によるライブラリの読み込み。 use で指定したライブラリは、実行時ではなく、コンパイル時に読み込まれる。 たまに if($a==1){ use Foo::Bar;} なんてことをやる人がいるが、 この Foo::Bar はif条件に関係なく必ず読み込まれる。 同様に、初心者は push(@INC,'/hoge/fuga'); use Foo::Bar; と書くことで @INC にパスを追加してから Foo::Bar を読み込んでくれる、と考えがちだが、 実際には コンパイル→Foo::Bar読み込み→実行→push の順で処理されるので、 Foo::Bar 読み込み時にはまだ @INC にパスが追加されておらず、エラーになる。 このような場合には、push ではなく、use lib を使う。 use lib '/hoge/fuga' と書いておくと、これがコンパイル時に処理されるので、 この時点で @INC に /hoge/fuga が追加され、そこから Foo::Bar を読んでくれる。
534 :
516 :04/06/25 17:49 ID:???
>>533 ありがとうございます!今
use lib "C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test";
を初めに追加してエラーだったので、
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
にしたら成功しました!シングルクォーテーションじゃないといけないんですね。
lib.pmがBEGINもやってくれてるんですね。
ところで、文法チェックの時以外でもlibを使って自作のモジュールを読みこむ必要が
あるんでしょうか?
モジュールを読みこむとそれだけ処理にかかる時間が増えますよね。なるべく軽くしたいのですが、
やはり自作モジュールをuseするプログラムには初めにlibでやっておいたほうがいいですか?
535 :
516 :04/06/25 17:52 ID:???
今シングルクォートならうまく行くことをしって、 BEGIN { push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test'; } をlibの変わりに書いたら、エラーがでないで文法チェックokでした! どちらでも好きな方でやればいいってことですよね。
536 :
500 :04/06/25 18:45 ID:???
>>513 レス遅くなりました。
英語のサイトなんですね;nifty翻訳にでも書けてみます。
>>534 ダブルクォーテーションは \ を特別に扱う話を聞いたことはないか?
print "\n"で何が出力される?
print '\n'で何が出力される?
538 :
516 :04/06/25 20:14 ID:???
>>537 初歩的なことを忘れてました;すいません。
ありがとうございました!
539 :
nobodyさん :04/06/25 21:02 ID:QWdt1cCh
掲示板の文字色を選ぶラジオボックスをクッキー対応にしたいのですがどのようにやればよろしいでしょうか。 ラジオボタンは <INPUT name="color" type="radio" value="#758CEA"> <FONT color="#758cea">■</FONT> のようになっておりcheckedを入れることができればOKなわけですよね。 関係演算子を使ってもcheckedを入れるような方法が思いつきません。 どなたかアドバイスお願いします。
>>539 そんな一部分だけ出されても答えようがない。
541 :
nobodyさん :04/06/25 21:14 ID:QWdt1cCh
>>540 ココ以外には思いつかないのですが、どの辺を出せばよろしいでしょうか?
複数のラジオボタンからクッキーにあった一個を選ぶと言うものですが。
クッキーから前回使った色の読み込みはできます。
>>541 お前、ここはPerlスレだぞ。
お前が貼り付けたのはどう見たって、HTMLにしか見えない。
543 :
516 :04/06/25 21:53 ID:???
>>541 俺ならそのラジオボタンの部分を全部PERLで動的に作成するかな。
$ENV{'HTTP_COOKIE'}の中身を条件文にかけて、$taguの中に何を入れるか決める。
それでできるよ。
例)
$cook = \$ENV{'HTTP_COOKIE'};
if ($cook eq "758cea" ) {
$tagu = qq|<INPUT name="color" type="radio" value="#758CEA" checked>|.
qq|<INPUT name="color" type="radio" value="#000000">|;
}elsif($cook eq "000000"){
〜
}else{〜}
とか。ちょっとブサイクなコーディングだけど、後は自分でもう少し処理を軽くするといいよ。
544 :
516 :04/06/25 21:54 ID:???
ごめん。$cookをifの条件文で使うときは$$cookとかでデリファレンスしてね。
545 :
516 :04/06/25 22:03 ID:???
なんかクッキーの読みこみ後に=以前を切るの忘れてた。 修正も兼ねてもっと簡単に。 if ( $ENV{'HTTP_COOKIE'} eq "hogehoge" ) {$c1 = "checked";} elsif(〜){$c2 = "checked";}else{〜} それで <INPUT name="color" type="radio" value="#758CEA" $c1> <INPUT name="color" type="radio" value="#758CEA" $c2> でいいね。
>>545 もし$c1にcheckedが入った場合$2には何が入るの?
0とかでもタグに不都合はないのかな…
my @Color_key = qw/ 758CEA 000000 : : : /; # 必要数並べる。 my %Color; # $Color{'758CEA'} = ' checked'; # $Color{'000000'} = ''; のように成るように久喜をパージングしる。 foreach (@Color_key){ printf qq|<INPUT name="color" type="radio" value="#%s"%s>|, $_, $Color{$_}; printf qq|<span style="background: transparent; color:#%s">■</span>|, $_; }
>>546 まあほとんどの場合は undef が空文字列として展開されると期待されるだろう
漏れなら Template Kit 使うけど
549 :
516 :04/06/25 22:30 ID:???
>>546 初めに
$c1 = "";
$c2 = "";
をしておく。
if文とかの制御構文はある程度勉強しておくといいよ。ちなみに
>>545 の場合
真がでてそのブロック処理をした時点でそれ以降の処理はおこなわれない。
こんなんとかってダメなん? %COLOR_NUM = (1 => "#000000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000FF", 5 => "#C100C1", 6 => "#FF80C0", 7 => "#FF8040"); print <<"EOF"; <TD>Color:</TD><TD><SELECT name="color" style="width : 40px;"> EOF foreach (sort keys %COLOR_NUM) { if ($COOKIE{"color"} eq $COLOR_NUM{$_}) { $selected = " selected"; } else { $selected = ""; } print "<OPTION value=\"$COLOR_NUM{\"$_\"}\" style=\"color : $COLOR_NUM{\"$_\"};\"$selected>■</OPTION>\n"; } print <<"EOF"; </SELECT></TD> EOF
しばらくして気付いたけど、ラジオボタンだったんか・・・ まぁ似てるからいいか。
すごく初歩的な質問ですみませんが、連想配列のkeyの名前は通常何文字くらいが理想ですか? $hash{abcde} 今はこのように長くても5文字位に抑えてますが、できるだけわかりやすい名前をつけたいので 多少長く10文字くらいになってしまいそうになるのですが、重くなったりしそうで不安です。 みなさんはハッシュのキーを何文字くらいに収めようとしていますか?
>>552 わかりやすい名前をつけるのを優先させればよい。
重くなるかどうかはベンチマークをとってみればわかる。
>>552 おまい朝早ええな!
俺は16文字位まで。多分他のやつより長めだと思う。
っていうか誰かマジで作ったプログラムで、20文字超えたやついるのかな?
長さなんて気にしたことないな。 どうせ内部では数値に変換されるんでしょ、と思ってるから。(されてないかも)
>>555 されてる。
俺はだいたい7文字ぐらいかな。
複数の単語が入ってるときは、多分何かがおかしい。
例:
$hash{HOGE_NUMBER}
$hash{HOGE_NAME}
$hash{HOGE_EMAIL}
おれなら↓こうする
$hash{HOGE}{NUMBER}
$hash{HOGE}{NAME}
$hash{HOGE}{EMAIL}
>>559 You must encode URL.
>>559 You must read thread title.
>>559 I suggest you use Net::TrackBack.
This is a English-Speaking thread here.
パンチ5分の2のバカはどこいった?絶対一生続けるって豪語してたくせに(プゲラ
煽るなよヴォケが
まぁ、なんだ、Perlのパンチ5分の2とPHPの本7は一生治らんな
スカラー変数のリファレンスってどれくらいのデータを格納できるの?2.71KBってやりすぎ? $self->{data} = "ここで代入できる文字列の長さが知りたい"; リファレンスは元々格納場所へのアドレスを持ってるだけで、スカラに格納するわけでは ないから大丈夫だよね。ってリファレンスじゃなくても別に大丈夫だよね?重くなるだけで。 HTML本文をそのままスカラに入れてそれを好きな文字コードに変換したいなあと思ってるんだけど スカラに入れて一括変換なんてやるべきではないかな? 変換はjcode.pl使う。
2KBなんてハエのうんこみたいなもんだ。
>>569 そうなの?ならモジュールのファイルサイズが20KBでも大したことないよね?
何KBくらいからやりすぎになるの?例えば外部から30KB位のファイル読みこんで
open(FH,"uwa30kb.txt");
$a = join '',<FH>;
とかでもゴギブリの卵くらい?
>>570 > 何KBくらいからやりすぎになるの?
仮想メモリーを使うくらい。
apache の RLimitMEM 制限に引っかからないくらい。
>>462 1<>い<>12:50<>
4<>あ<>20:02<>
2<>き<>08:41<>
…
$buf = $ENV{'QUERY_STRING'};
$buf =~s/[^0-9]//g;
@txt = sort{(split(/<>/,$b))[0] cmp (split(/<>/,$a))[0]}@txt if($buf==1);
@txt = sort{(split(/<>/,$b))[1] cmp (split(/<>/,$a))[1]}@txt if($buf==2);
@txt = sort{(split(/<>/,$b))[2] cmp (split(/<>/,$a))[2]}@txt if($buf==3);
観覧者が見たい順にソートしたいんで、今はこのようにしてるんですが、
ハッシュの使い方がいまいち分かりません。
もう少しヒントを頂けないでしょうか?
まぁ、正直寂しい
PERLのレスポンスヘッダで文字コードを指定するときって print "Content-type:text/html;charset=Shift_JIS\n\n"; print "Content-type:text/html;charset=euc-jp\n\n"; JISの場合はなんて書くんだっけ?
検索エンジンって便利なものがあるらしいよ
cgiからSSI使ってincludeしたいんだけど cgiからのSSI許可をしてしまうとセキュリティー的にもあぶなさそう(掲示板などで自由に実行されてしまう等)なので他にSSIと同等のことができる方法はないでしょうか? 教えて下さい。お願いします。
意味がわかりません。
>PERLのレスポンスヘッダ ハ? 共通だろ
580 :
577 :04/06/27 22:59 ID:???
perlスクリプトAとperlスクリプトBがあるとします。 やりたいことは perlスクリプトAからPerlスクリプトBが出力する結果を取得してPerlスクリプトAで表示したいのです。 呼び出し元がただのhtmlならSSIを使えば簡単に実現できますがCGIからの呼び出しでは実行できません。 何かいい方法がありませんか?
582 :
577 :04/06/27 23:20 ID:???
>>581 できるのは分かっていますが許可した場合第三者が掲示板の本文などにSSIでシステムコマンドなどを実行できてしまうので許可していないんです。
>>582 AからBに処理を渡してその戻り値をAで使いたい。
別に普通にできるし、なんでSSIとか掲示板とか許可とかの話になるん?
すいませんが、何を悩んでるのかわかりません。
>>583 その方法を577は教えろと言ってんじゃないの?
以前こちらで質問した>216なんですが、また少しお聞きしたい事があります。 @data = ('A,7,緑', 'C,6,青', 'B,4,赤', 'A,9,紫', 'A,2,黄緑', 'B,10,黄', 'C,3,青紫'); 上記のような配列があり、これを一項と二項目でソートしたいのですが、 ここでもう一つの条件、 二項目の比較にある数字にもっとも近い数字からソートする、 という条件を加えたいのです。 例えば 二項目が 8 にもっとも近い数字からソートした場合 @data = ('A,9,紫', 'A,7,緑', 'A,2,黄緑', 'B,10,黄', 'B,4,赤', 'C,6,青', 'C,3,青紫'); といった感じにしたいのです。 前にお聞きした方法で作業を進めていたのですが、 どうしてもこの問題で詰まってしまい困っています。 何か良いお知恵があれば何卒ご教授下さい。
方法ったって、標準出入力介してもいいだろうし、 AからBをrequireするなり、モジュールにしてuseしてもいいだろうしさ。 evalとかdoとかの話もするの? あ、ただCGIスクリプト内で別のCGIスクリプトの出力をそんまま 取り込みたい、って話なら、それは「CGIのお作法」の話なので、 別をあたってください。 でもそれならperlスクリプトAとBでって聞き方はおかしいよ。
>>585 前言われたやり方+シュウォルツでうまいことやりなさい。
$base= 8; for (map{$_->[0]} sort {($a->[1] < 0 ? -$a->[1] : $a->[1]) <=> ($b->[1] < 0 ? -$b->[1] : $b->[1])} map{[$_,$base-(split',')[1]]}@data){ print $_,"\n"; }
変数名に使えるのってアンダーバーと英数字だよね? <input type=image src="hoge.jpg" name=test> でも↑をsubmitとして使って、PERLで受けとると test.x= test.y= が付いてきて、 foreach ( split /&/,$ENV{'QUERY_STRING'} ) { (my $a , my $b ) = split /=/; $form{$a} = $b; } とかやると、%formのキーにtest.xっていうのができちゃう。 一応動作に支障はないけど、ハッシュのキーにピリオド使っていいの?
>>585 my $base = 8;
my @sorted =
map $_->[3],
sort { $a->[0] cmp $b->[0] || $a->[1] <=> $b->[1] || $b->[2] <=> $a->[2] }
map { /^([^,]+),([^,]+)/; [ $1, abs($2 - $base), $2, $_ ] }
@data
;
print map "$_\n", @sorted;
条件式?:の条件演算子って条件式で真なら左辺を偽なら右辺を返すから普通は $a = $b == 0 ? 1:2; みたいに使うんだろうけど、 map{ /a/ ? $a += $a : $b += $a } @array; みたいに真と偽の時の処理に↑みたくやるのも正しい使いかた? これ使うと今の長いソースが短くできるからやりたいんだけど、HTMLでStrict厨な俺は PERLでもなるべく正しい関数の使い方をしたいとか思ってる; ?:をifみたく処理の分岐で使うのはどうなの?
>>591 sort関数ってどうなってるんですか?
@old=(1,a,4,f,5);
@new = sort{$a <=> $b}@old;
こうゆうのよく見ますけど、どうゆう流れで処理が行われているのかわかりません。
mapみたいに@oldからはひとつづつ要素が渡されてるんですよね?
その渡された要素は$_に入っているわけではなさそうですが、$aと$bには何が入ってるんでしょうか?
>>593 リスト中のどれか2つの要素。
どれがどの順で何回渡されるかは決まってなかったような。
(sortで使ってるアルゴリズムにもよるだろうし)
>>592 Perlの存在自体を否定しているのですね。
>>592 なるべくなら $a $b は使わない方がいい。
あとは、perl 添付のドキュメントを読む。描き方に関しては perlstyle あたりを中心に。
597 :
nobodyさん :04/06/28 14:51 ID:cJ2UZAf9
次のようなリストを読み込んでレコードを追加したいのです データ区切りは<>を使い文字列にカンマが入っても対応できる ようにしてあります。 一番先頭のデータを重複の無いキー番号としたいのです そこでレコード追加時に先頭のデータをチェックして 最大値の次の値と先頭にアルファベットを追加してキー番号を 生成したいのですが、どの様にプログラムを組めばよさそうでしょうか? A000001<>xxxx<>XXXXX A000003<>xxxx<>XXXXX A000010<>xxxx<>XXXXX A000004<>xxxx<>XXXXX A000008<>xxxx<>XXXXX
>>597 既出レコードIDの最大値に+1=追加レコードのID、てわかってるならそうすればいいじゃん。
途中まででもいいから自分でやってみるべし。
599 :
nobodyさん :04/06/28 15:23 ID:whqvquC3
<form method="post">で送られてきたデータを read(STDIN,$in,$ENV{'CONTENT_LENGTH'}); な形で取得しようとしているのですが長い文章の場合に途中までしか取得 できません。 $inを以下のような感じで出力させると、 print $ENV{'CONTENT_LENGTH'}; print length($in); $ENV{'CONTENT_LENGTH'} が 8205 のときはlength($in)は 8000 と出力され、 $ENV{'CONTENT_LENGTH'} が 9252 のときもlength($in)は 8000 と出力されます。 $ENV{'CONTENT_LENGTH'} が 8000を下回った場合にはlength($in)は同じ数値が出力されます。 どっちにしても8000しかreadが出来ていないようなのですがどうしてなんでしょうか? 環境はIE6 + redhat9 + perl v5.8 です。
600 :
nobodyさん :04/06/28 15:30 ID:vj4wrqzo
教えてください。 cgiを直接呼ばれたのとpostで来たのとを区別するにはどうしたらいいのでしょうか?
readって必ず指定した長さまで一気に読めるわけではないので、 ループしないとだめじゃない? とくに入力元がpipeやsocketのときは 適当にどこかのバッファ長まで読まれた状態でひとまず戻ってくる ことはよくある。
>>599 勉強のためとかじゃなけりゃCGIモジュール使った方がいいような気がする。
604 :
593 :04/06/28 16:26 ID:???
>>594 >リスト中のどれか2つの要素。
>どれがどの順で何回渡されるかは決まってなかったような。
>(sortで使ってるアルゴリズムにもよるだろうし)
ランダムに選ばれた?二つの要素が$aと$bに入れられて、$aの方が大きければ1を等価なら0を
左の方が大きければ-1を返す?$aの方が大きければ$aに入っている要素を左に返す?
$aの中身を左辺に返した場合は元のリストの中からは消えるのですか?
なんかイマイチ流れがわかりません。sort関数については色々見に行きましたが、内部の具体的な
流れが解説されてるサイトが見つかりませんでした;
>>602 perldocは英語ですよね;翻訳かけると関数名まで翻訳されちゃってイマイチ理解できないんですよね;
したのサイトは見たことあります。
>>604 QuickSortのアルゴリズムを調べてみれ。多分分かる。
607 :
526 :04/06/29 04:35 ID:???
>>526 で質問したものですが、自分で作ったモジュールを@INCに追加したい場合は
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
か
BEGIN{
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
でやるのはわかったのですが、'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test'
は絶対パスでないといけないのですか?
サバにアップしたときの事を考えて相対パスでいいならそうしておきたいのですが、
use lib '../c';
use lib '..\c';
などをやってみたところ文法チェックでエラーがでました。ローカル環境ではライブラリを@INCに
追加する時のパスをドライブ名からの絶対指定でないと無理でしょうか?
環境は
win98/ie6/httpd/activeperl5.6/
です。
>>607 >文法チェックでエラーがでました。
そのエラーメッセージを書こう。
ちなみに相対パスの指定は可能。存在しないパスを指定する事も可能。
e.g. use lib qw(../ /home/you/lib/perl E:/lib/perl);
>>608 use CGI ':cgi';
print server_name();
610 :
607 :04/06/29 06:07 ID:???
>>608 それいいですね。でも相対指定ができるならそのほうが楽ですが。
>>609 エラー文は以下の通りです。続いてファイルの中身を挙げます。
C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.
611 :
607 :04/06/29 06:09 ID:???
a.cgiの中身 #!/usr/local/bin/perl use lib '../c'; use Test1; #京 print "Content-type:text/html;charset=euc-jp\n\n"; print "aiueo"; Test1.pmの中身 package Test1; #京 sub new{ my $self = shift; my $obj = {a => 1 , b => 2}; bless $obj,$self; } 1; a.cgiのlibの一行を use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\c'; にするとオーケーがでます。\を/に変えてもオーケーはでます。 相対パスにすることは可能でしょうか?
質問! 演算子って同じような意味のものがあったりするけどどうしてでしょうか? >や<の比較系は 数値用として<,>,==,<=,>= 文字列用としてgt,lt,eq,ge,le それで、 and,or と ||,&& も用途別なんでしょうか?優先順位は||,&&の方が高いみたいですが。 これも 数値用||,&& 文字列用or,and なのですか?でも $a == 1 || $a == 2 ならいいですが、 $a == 1 || $a eq "ふたつ" の場合は||とorのどちらを使えばいいでしょうか?
CGIで単純にtextを出力してブラウザに表示させたいのですが ブラウザで開くとダウンロードのダイアログが開いてしまいます。 ダウンロードではなくそのままブラウザに表示したいので アドバイスをください。 以下のようにして出力しています。 #!/usr/bin/perl print qq(Content-type: text/plain\n\n); print "minapon"; exit; 宜しくお願いします。
$fooの「何文字目まで」を抜き出す、というやり方はありますか? ありましたらお教え下さいますようお願いいたします。
615 :
607 :04/06/29 06:29 ID:???
>>614 $newfoo = substr $foo,hoge1,hoge2,"hoge3";
hoge1=オフセット。取り出しの起点。
hoge2=取り出す長さ。
hoge3=取り出した後にそこに何か入れる場合は。取り出したものを削除するなら""とする。
詳しくは
perl substrでググれば見つかるかと。
616 :
607 :04/06/29 06:32 ID:???
>>613 #!/usr/local/bin/perl
print qq(Content-type:text/plain\n\n);
print "qwertyui";
exit();
をローカル環境でやったけど何も問題はなく表示されたよ?
>>613 激しく板違い。Web鯖の設定。
Options ExecCGI
AddHandler cgi-script .cgi
AddType application/x-httpd-cgi .cgi
各行の意味を確認したうえで好きなようにどうぞ。
>>616 ありがとう御座います
私の環境で
>>616 のコードでローカルでテストしてみましたが
やはりDLのダイアログが開きます
サーバにアップロードしても同じでした。
ブラウザ側の問題かも知れませんが
ちゃんとtextをブラウザで開ける場合もあるし・・・
DLダイアログ上のファイル名はなに? DL後のファイルの中身はなに? HTTPサーバーは?ブラウザは? まぁ、どっちにしろサーバー設定かブラウザの問題だね。
どういう環境でやってるか知らんが、MIMEタイプ周辺の問題じゃないか?
>615 有難う御座います。 Perlのリファレンス見てたんですが、語句が思い当たらなかったのでたどり着けなかったんです。 ホントに助かりました。
MD5暗号化、照合ライブラリってないものでしょうか。 cryptがサーバ対応してなくてMD5使えないもので、 教えていただけたら幸いです。
- - - - - Perl コーディング初心者質問コーナー Part35 - - - - -
>>622 MD5.pm
>>612 おそらく優先度の違いだけかと。 好みの問題だけど、括弧を減らしたいときなどに、and, orを使うといいと思う。
らくだ本ではand, orのほうが自然だからこっちのほうがいい、見たいなことがかかれていた気がしないでもない。
626 :
607 :04/06/29 21:39 ID:???
>>625 ありがとうございます。早速
use lib 'C:/c';
にかえてやってみました。
C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: C:/c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.
というエラーでした。
C:/c D:/Perl/lib D:/Perl/site/lib
少しエラー内容が変わりましたがやはり駄目なようです。
>>626 おいアホかC:/cの中にTest1.pmがあんのかよ!?
>>626 >>625 の
>C:/WINDOWS からの相対パス ../c は C:/c で
ってのは
C:/WINDOWS からの相対パス ../c は C:/c のことだ
の意味だ(と思われる
>>626 > use lib 'C:/c';
> にかえてやってみました。
>>625 がコケてそう。
use lib '../../../cgi-bin/test/c';
C:\WINDOWS>cd デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
C:\略>perl -c a.cgi
630 :
607 :04/06/29 22:46 ID:???
>>627-629 すみません。
>>629 C:\WINDOWS>cd デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
これをやって移動した場合はlibはなくてもエラーはでないです。
質問としましては、どのフォルダからでも文法チェックができるように自作モジュールを
コンパイルの初めに@INCに追加してやりたいんですが、そのモジュールのある場所を相対指定できませんか?
ということです。
それで一応
use lib '../../../cgi-bin/test/c';
use lib 'C:../../../cgi-bin/test/c';
に変えて試しましたが、やはり下のエラーでした。(1行目の場合のエラー内容です。)
C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../../../cgi-bin/test/c D:/Perl/li
b D:/Perl/site/lib .) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line
4.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 4.
>>628 ここまで書いて今気づきました。
>C:/WINDOWS からの相対パス ../c は C:/c で
../cはC:/cと書いてるのと同じことになるってわけですね;すみません勘違いしました。
それでやはり相対指定はムリなのでしょうか?
631 :
607 :04/06/29 22:50 ID:???
今やっと気づきましたが、この場合の相対指定っていうのは、コマンドプロンプトの現在位置 からによる相対していなのですね?合ってます? そうなるとコマンドプロンプト自体がフォルダ移動すると、パスが変わってくる。だからムリ? でもなんかまだ勘違いしてるかもしれません。a.cgiに書くパスを相対パスにすると 何に対しての相対になるんでしょうか?a.cgiではないですよね?
>>631 > use lib '../../../cgi-bin/test/c';
スマソ、↑寝ぼけてますた。
吊ってきます。
カレントディレクトリ。
633 :
607 :04/06/29 23:30 ID:???
>>632 カレントディレクトリということはやはり、プロンプト画面の現在作業場所からということになり、
結局libは相対指定が効かないということでよろしいでしょうか?
634 :
nobodyさん :04/06/29 23:43 ID:d2XzHbrj
変数に入っている特定の文字の長さを調べるにはどのようにすればよいでしょうか? $test = abc123; と入っている場合、数字の数だけ調べたいのです。 どなたか、ご教授お願いします。
>>633 気づいてなかったんか。 DOSの作業ディレクトリだべ
636 :
607 :04/06/29 23:59 ID:???
>>635 ですよね。でもそうなると、libに渡すパスは相対指定が不可能ですよね?
でも
>>609 さんが相対パスは可能と言っていたのでよくわかりません。
ちなみにサーバにあげた場合もlibのパスを相対で書くと、DOS(UNIX系なので違うぽ)作業ディレクトリ
が基準になりますよね?
その場合はDOSは自動で、a.cgiがある場所まで移動してからコンパイルを行うのでしょうか?
そうだとするとサバ上ではa.cgiがあるフォルダからの相対パスで行けますよね。
でもわざわざ作業ディレクトリを移動してからコンパイルなんてしませんよね。
結局相対パスはあまり使い物にならないんですかね。サバのカレントディレクトリから書けば
サバでは相対にできそうですがやはり絶対指定しておくのが無難ぽいですね。
長くお付き合いいただきありがとうどざいました。失礼します。
637 :
607 :04/06/30 00:00 ID:???
>>634 まずは正規表現で数字だけ抜き出して、その長さを測ってみてはどうでしょうか?
>>632 >>636 スクリプト中に書かれた相対パスは全てカレントディレクトリからの
相対パスであって、スクリプトが置かれているディレクトリからの
相対パスではない。@INC に相対パスを指定する事は可能だが、
君が常にスクリプトの置かれているディレクトリをカレントディレクトリ
として起動しない限り、期待するディレクトリを指す事にならない。
故に、モジュールやライブラリは通常特定のディレクトリに置き、
絶対パスで指定する事でどこからでも利用可能にする。
どうしてもスクリプトが置かれているディレクトリからの相対パスを
使いたいのなら、スクリプトの最初に以下のような阿呆らしいコード
を追加する事で可能になる。
BEGIN {
__FILE__ =~ m|^(.*[/\\])[^/\\]+\z|;
require 'lib.pm';
lib->import($1 . '../log');
}
639 :
ウド :04/06/30 18:25 ID:???
サーバー:Turbo Linux、apache1.3.xx、Perl5 クライアント:WindowsXP Pro これまで同じスクリプト(簡単なメモCGI)をWindows2k、apache2.0.x、perl5にて動作させておりました。 サーバー変更に伴い、文字コードをshift-jisからeucに変更しました。 Windows2kサーバーにて動作させたところ正常に動作しました。 確認後にLinuxに移しました。 Linuxにて動作させたところ、Winクライアントから書き込んだらログファイルの 文字コードがshift-jisにて保存されてしまい、正常に動作しなくなりました。 考えられる原因はなんでしょうか? ログファイル、スクリプトファイルともにEUCにて保存、アップロード。 cgi-lib.pl使用、jcode.plは使用していません。 データの受け取りは&ReadParse(*form);として、form{'comment'}として うけとっています。 フォームはvalue=\"comment\"です。 スクリプトの先頭で文字コードをeuc-jisと設定しています。
640 :
ウド :04/06/30 18:54 ID:???
追記 ログファイルに少しでもデータがある場合(追記のような状態)、ログファイルに セットされた文字コードが適用されるようです。 print OUT,">log.dat";とかにすると、文字コードがshift-jisに再セットされてしまいます。 Linuxからの入力は問題ありません。
(スクリプトファイルではなく、)フォームのページの文字コードをEUCに変えてみよう。 もしくは、CGI側でEUCに変換してもいいと思う。 あと、cgi-lib.plはもういらないでしょ。jcode.pmかencode.pmを使おう。
>>639 CGIで使うのならわざわざEUCに変えなくても動くでしょ。
643 :
ウド :04/07/01 10:36 ID:???
>>641 フォームも同一スクリプトで生成しているので、ヘッダではeuc-jisで指定しています。
cgi-lib.plはフォームのハッシュを扱うのに楽だったので使用していました。
今、CPANからJcode.pmを取得しインストールしました。
これと組み合わせて使ってみます。
アドバイスありがとうございました。
>>642 動きますが、個人的にEUCが好きなものでして。
製作するスクリプトのコードもEUCにしている為なにかと都合がいいのです。
644 :
nobodyさん :04/07/01 12:52 ID:oq3ug3s3
>>598 EXCELにあるような最大値を求める関数がみあたらないのですが、どうしたらいいものでしょうか?
>>644 それぐらい自分でサブルーチンを作りましょう。
>>644 record.txt
--
A000001<>xxxx<>XXXXX
A000003<>xxxx<>XXXXX
A000010<>xxxx<>XXXXX
A000004<>xxxx<>XXXXX
A000008<>xxxx<>XXXXX
--
open IN, 'record.txt' or die "$!\n";
while(<IN>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
print (((sort keys %record))[-1]);
--
出力:A000010
昇順に並べれば一番後ろが最大値
降順に並べれば一番最初が最大値
gifやjpeg画像を表示するときに 画像の大きさが一定以上大きいときだけ 縮小して表示したいのですがどうやればいいか教えてください。 よろしくお願いします。
>>648 if(でっかい時){ 縮小処理や縮小表示 }
else{ そのまま表示 }
これのどの部分が分からんのだ?
そのことを
>>1 の書き方で表すとどうなるのだ?
黙れ。
651 :
648 :04/07/01 21:31 ID:???
画像の幅を知るにはどうすればいいですか? また、画像の縦と横の比率を崩さずに 横幅を100〜150にして表示したいときの うまい方法はありませんか?
タグぐらい勉強しろよ
>>651 フリーの画像掲示板とかのソースを参考にしたらいい。
PerlMagickとか使えばいいんじゃないのかね?
>>651 「gif perl 画像サイズ」でググる。jpgの場合も同様。
画像サイズ取得ライブラリって形で公開してる人が多いなぁ。
ゴリゴリ書くサンプルが多いだろうと思ってググってみたんだが....
> 画像の縦と横の比率を崩さずに横幅を100〜150
こりゃ、中学か下手すりゃ小学校で習う計算だな。
>>651 Image::Size
あと、htmlだけどwidthだけしてすればheightは自動で同率で表示する。
> こりゃ、中学か下手すりゃ小学校で習う計算だな。
だな
>>643 書きまちがいだと思うけど、euc-jpね。
あと、ブラウザが自動的に判断してくれるはずだから、
HTTPヘッダとかMETAタグとかは使わずに、何もせずにHTMLの出力をやってみたらどうだろうか。
658 :
648 :04/07/01 23:55 ID:???
そう言えば、GIFの特許切れに絡んで、GDのバージョンアップってあったんだろうか?
jcode.plでエラーが出てしまいます。 [Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe ) in pattern match (m//) at /home/admin/jcode.pl line 362. [Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe ) in pattern match (m//) at /home/admin/jcode.pl line 362. [Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe ) in pattern match (m//) at /home/admin/jcode.pl line 362. [Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe ) in pattern match (m//) at /home/admin/jcode.pl line 362. [Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe ) in pattern match (m//) at /home/admin/jcode.pl line 362. [Thu Jul 1 23:57:20 2004] test.pl: Malformed UTF-8 character (overflow at 0x302b374a, byte 0xa5, after start byte 0xbe ) in pattern match (m//) at /home/admin/jcode.pl line 362. 何かこのエラーに関して心当たりがおありの方いらっしゃい ましたらご教授ください。
>>648 さん
いいと思いますけど、1点、
<input type="hidden" name="file_name" value="question1.dat">
の部分はセキュリティ上、良くないです。
このhiddenのタグは使わないような仕様にしましょう。
何で良くないかここで説明してもいいんだけど、これで逮捕された人がいたからな…。
>>660 jcode.plがUTF8に対応してないんじゃないの?
>>660 >>662 も書いてるけど、
「jcode.pl Jcode.pm UTF-8」でググってみれ。
664 :
648 :04/07/02 00:13 ID:???
セキュリティ上良くないのはわかりますが うまく回避する方法が思い浮かびません。 今回の場合はたいして問題ないですよね?
667 :
質問 :04/07/02 00:58 ID:dBU8jv45
perl のスクリプト中でディレクトリを作成したら、パーミッションが変になり、削除できません。 ユーザーは www、グループも www、そしてパーミッションが301(-wx --- --t)になってます。 mvでリネームは出来ます。さらに cd で中に入ることは出来ますが、ls しても何も見えません。 そのサーバでは、CGI(Perl)、telnet、ftpが使用できますが、私はスーパーユーザーではありません。 rmdirをする簡単なPerlスクリプトを書いたり、rm -f -d directryとやってもダメでした。 分かる方が居たら、教えてください。・゚・(ノД`)・゚・。
stickyビットが立ったんだな。で、ログインユーザとWEBサーバの実行ユーザが違う、と。 CGIでchmod(0777)かな?ってやって、その後、telnetで入って削除すればいいよ。
>>662-663 ご返答有難うございます。
UTFで指定しているところはないのですが、何かの
文字がUTFと認識させてしまっているという解釈で
宜しいのでしょうか。
670 :
648 :04/07/02 01:12 ID:???
>>665 貴重な情報ありがとう。
openするときに..とかが含まれてたらエラーにしました。
>>666 とりあえずそこ直します。
671 :
667 :04/07/02 01:19 ID:dBU8jv45
>>668 削除できました。
rmやrmdirじゃなくて、一旦 chmod するのは盲点でした。
即答&的確な指示、ありがとうございました。本当に助かりました。・゚・(ノД`)・゚・。
673 :
648 :04/07/02 01:28 ID:???
>>672 ありがとう。
複数の問題ファイルをランダムに選んでるので
ファイル名を直でかくのは無理だと思っています。
とりあえず添削してもらってきます。
@questions = ("q1.dat","q2.dat","q3.dat"); って書いておいて、 <input type=hidden name=question value=0> ってやればいい。valueが添え字ね。
print <<"EOF";などでHTML表示する場合の質問です。 HTMLのインデントを揃えたいと思っているのですが、 print <<"EOF"; <HTML><HEAD></HEAD><BODY> EOF こう書くと、<BODY>とEOFの間に改行コードがあるために、続けてHTMLを出力すると、 <HTML><HEAD></HEAD><BODY> </BODY></HTML> のようになってしまいます。 print <<"EOF";を使っても、一番最後の改行コードを含めないようにする書き方はあるのでしょうか?
print "<HTML><HEAD></HEAD><BODY>"; これじゃダメなん? ""の中で改行できるし、"自身が存在するならqq使うかエスケープすりゃいい。
>>675 そもそもはじめから print "<HTML><HEAD></HEAD><BODY>"; とするか、
適当に変数に入れてお尻の1文字削るのが普通だと思われる。
どっちも嫌なら
print @{[<<"EOF" =~ /(.*).$/s]};
<HEML><HEAD></HEAD><BODY>
EOF
とかってのも可能だがオススメしません。
eval関数って使い方によっては危ないみたいですけど、こういう使い方でも危険ですか? (test.txtの中身) あいうえお %{$obj->{form}} (hoge.cgiの中身) use Hoge2; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}; my &obj = Hoge2->new($buffer); open(FH,"test.txt") while( <FH> ){ if( $_ !~ /\$/ ){ print; }else{ print eval $_; } } close(FH); (Hoge2.pmの中身) sub new{ my $self = shift; @a = split/&/,shift; foreach( @a ){ (my $a , my $b ) = split/=/; $form{$a} = $b; } bless,{form => {%form}},$self; } 1;
test.txt が常にあなたの管理下にあって、 他の人が変更不可能な状況ならば問題ナッシング
680 :
678 :04/07/02 13:33 ID:???
>>679 ありがとうございます!txtファイルの管理には気をつけます。
print eval $_;
の部分でもしも%formの中にPERLの命令文が入っていた場合とかに実行されちゃうのか
不安でしたが、↑では変数展開されるだけで終わるみたいですね。
展開された内容を再びevalにかけさえしなければ安全ってことですね。
ありがとうございました。
>>678 print eval(eval $_);
としなければセキュリティホールにはならないと思う。
>>678 見た感じCGIっぽいのでもしそうならXSSには注意しろよ。
683 :
678 :04/07/02 14:43 ID:???
>>681 ありがとうございます。
>>682 掲示板ではなく注文システムのCGIなので、実行者に跳ね返るだけのことなのであまり気にしてませんが、
一応
$a =~ s/[><";&\[\]\{\}]//g;
$b =~ s/[><";&\[\]\{\}]//g;
としてから%formに入れてます。
一応わかる範囲でタグとか入れて見ましたが、とりあえず問題ありませんでした。
もし、↑のでは不足していたら教えて頂けると幸いです。
>>683 サイニタイジング自体は開いてか受け取ったデータをどこで使うかによって変わってくる。
HTMLなら<,>,&を置換すれば良い。要は、今から処理を行う部分で入ってこられたら困る文字、
特殊文字を消すか、置換するか。
まあPerlは比較的セキュリティ面はしっかりしてるから、上で言ってたようにevalとか
その他一部の関数の使い方に気を付ければよい。
わかってると思うけど、掲示板系のオウム返しプログラムでXSSを軽視していると、
ウイルスが埋めこまれて、利用者が被害をうける事になるから気をつけてね。
>>684 >サイニタイジング自体は開いてか受け取ったデータをどこで使うかによって変わってくる。
サニタイジング自体は相手から受け取ったデータを
の間違い。ごめん。
686 :
678 :04/07/02 15:16 ID:???
>>684-685 今XSSについて再度記事をよんでますが、掲示板以外でもスクリプトになり得るタグは削除しなくちゃいけませんね。
うちのサイトでタグをちゃんと消していないと、第三者がうちを使っていたずらしちゃいますもんね。
とりあえず、セキュリティホールのなくせるよう頑張ります。ありがとうございました。
>>686 俺は必要のない記号は全て削除してる。
=~|\/;:+][{}()`'"<>&%#,
っていうか
*-@.
以外は全部削除しちゃいなよ。注文プログラムなら上の四つがあれば問題ないでしょ?
掲示板なら実態参照すればいいし。
配布されてるcgiではXSS対策してないのはあんまり見かけなくなったね。 あとはSQLインジェクションはヤバイ。まじでヤバイよ。 まずdeleteできちゃう。もう1レコードなんてもんじゃない。テーブルごと。 何しろ無制限。スゲェ!なんか制限とかないの。 しかも他のテーブルも消せちゃう。ヤバイよ、真っ白だよ。 だって普通は削除できないじゃん。だって削除されたら困るじゃん。 訴えられたら困るっしょ。 だからそのCGIはロールバックできる。話のわかるヤツだ。 けど普通のCGIはヤバイ。そんなの気にしない。消えるだけ。 とにかく貴様ら、SQLインジェクションのヤバさをもっと知るべきだと思います。 そんなヤバい仕事をしてる貴様らとか超偉い。もっとがんばれ、超がんばれ。
formでのhiddenが駄目って書いてる人がいるけどhtmlで同じタグ作ってPOSTとかされるからっていう解釈でいいですか? 私はCGI側でリファラーを一致してるかチェックしてるんですがこれでもまだセキュリティー的にあぶないんでしょうか?
>>690 hiddenそのものが駄目なわけではないので要は使い方の
問題だと思うのだが。hiddenだろうがなんだろうが、やろうと
思えばclientからは何でも送れるので過度に信用するなっ
てこった。
リファラーもclientの自己申告なんで騙され放題。そんなも
のでまともなチェックにはならない。足切りぐらいにはなる
けどな。
>>689 そうだね。データベース操作するcgiなんかではサニタイジングを念入りにやらなきゃね。
>>689 DBIならいきなり渡されたデータを埋め込んだSQL文作って実行じゃなくて
prepare-bind_param-executeにすればめったなことはないと思うんだが
オレの認識は甘いだろうか?
>>693 やっぱりそうですか。
私が作ってるスクリプトはhiddenの値を変えられるとかなり危険なので修正してみます。
どこかに参考になる方法とか載ってないでしょうか?
>>697 うむ、XSSにしろSQLインジェクションにしろhiddenパラメータにしろ、
Perl に限定されない CGIセキュリティの話は、
そちらで話すことが望ましい。
今はパスワードを入力してもそのチェックをしない サイバーノーガード戦法の時代ですよ。
板違いみたいだったのでこちらで質問させていただきます。 DBにパスワードを書ける方法がうまくいきません。 具体的には、perlスクリプトからuse Pgでconnectする際、 ユーザ名とパスワードで認証をかけたいのですが、 createdb -W で指定したパスワードがどうしてもきかない ようです。 認証をかけるところが間違っているのではないかと思って いるのですが、どうしてもやり方がわかりません。 ご教授いただけますと幸いです。
703 :
nobodyさん :04/07/03 17:22 ID:dEpm626a
>>704 お返事有難うございます。
connectでパスワードを入れても入れなくても
認証されちゃうので、DB(もしくはテーブル)作成
時の問題と踏んでいるのですが間違っております
でしょうか。
706 :
703 :04/07/03 19:08 ID:???
>>705 残念ながらエスパーではありませんので。
>>1 嫁。
ということでもっとお茶呑んでください。
708 :
nobodyさん :04/07/03 21:54 ID:MbMdEpi2
>>705 何にも情報が無いので、
とりあえず pg_hba.conf の設定でも見直してみろ、
と言ってみる
709 :
nobodyさん :04/07/03 22:29 ID:nSj0iEMY
$="123456"; のようにして、桁数を調べたいのですが、どのようにすれば良いのでしょうか?
Perlの質問以外は受け付けません
>>709 $="123456";
のようにして、桁数を調べれば良いと思います。
712 :
709 :04/07/03 22:45 ID:nSj0iEMY
$NO="123456"; でした。すいません・・・
sub 709{ $i=1; while(1){ if(@_%10<10) $i++) } return $i+1; }
sub 709{ $i=1; while(1){ $j=1; for($j=0; $j<$i; $j++){ $j*=10; } if(@_%$j<10) $i++) } return $i+1; }
ただ適当に書いただけ。 別に動かそうと思って書いたわけじゃないが
なんでさ 10のn乗で割っていくってようりょうだぞーってレスのつもりだが で、10で割り続けてたので単純にpow入れようやっておもい Perlってpowあったかなーとおもい、自分でn乗だすようにしてーー って適当にやったから括弧の場所とかほっときぱなしになったわけだが 良い訳とかキモイ
ループはダサイ。 int(log($NO)/log10)+1
721 :
719 :04/07/04 00:06 ID:???
ってついカーっとなってスマン・・・ たしかにそうとられても仕方ない罠。
722 :
719 :04/07/04 00:07 ID:???
>>720 スマンな。Perlは去年少しかじって止めたのでほとんど関数把握してないんよ
そんな奴が回答者かよ
724 :
719 :04/07/04 00:16 ID:???
j3勉強のついでということで
perlだけに下手に自分で10で割ったりしながらループするより length取ったほうが速そうだな。誰かベンチしてみない?
splitで1文字ずつに分解して配列数数える方法もありじゃないか?
おそらくそれが一番早いかと
728 :
709 :04/07/04 00:54 ID:Udr24Tj0
>>713 lengthで調べてみたら、出来ました。ありがとうございました。
もう一点、お聞きしたいのですが、
特定の文字列と一致した場合だけエラーになるようにしたいのです。
$NO="123456";
$NO2="23";
if ($NO eq /$NO2/g) {
print "エラーです";
}
こんなふうに書いたのですが、上手くいきません。
サイトをいくつか見ながら書いてみたのですが、原因がわかりません。
すいません、どなたか教えてください。
(°д ゚)ハァ? =~
なんか基本から解説してる本を1冊買うことをすすめるよ。
>>728 indexで十分だ。
やっぱ本買うよろし。
732 :
709 :04/07/04 01:47 ID:Udr24Tj0
本を買おうと思ったのですが、良い本が見つからなくて・・・ HTMLで言う、「とほほのWWW入門」みたいに、 Perl開設の良いサイトなど無いでしょうか? ここのスレに載っていたページはどうもわかりにくくて・・・
今更でスマソだが、漏れなら、 @no = qw(1 2 3 4 5 6); print $_ = @no."桁\n";
俺も持ってる、トホホ氏の。 何気に役に立つよ
739 :
nobodyさん :04/07/04 13:38 ID:bJ9Q5bUP
初めまして、さっそく質問で申し訳ないのですが、 パスワードの暗号か処理で暗号化を施した場合、 暗号化をログから解除して元パスワードを知ることはやはり不可能でしょうか? 例えば↓ sub encrypt { local($inpw) = $_[0]; local(@char, $salt, $encrypt); @char = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/'); srand; $salt = $char[int(rand(@char))] . $char[int(rand(@char))]; $encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt); return $encrypt; } のようなものからパスワードを探ることは・・・?
キーがわかるなら総当りしていけば? 単純に複合は無理でしょ。
暗号化前の平文をログって置けばよい。
簡単に複合できてしまう暗号なんてオhる
ハッシュの使い方が全然わかりません… $testに環境変数の一部をUserAgent,IPみたいにコンマ区切りで入れたいだけなんですが… 助けてください…
>743の質問の意味が全然わかりません… 助けてください…
$test= join(',',@ENV{keys %ENV});
>739 それが出来ないから暗号として成り立つわけで。。。
2つのファイルのファイル名を入れ替える時ってどうすればいいのかな? 今は $file1 = 'one.jpg'; $file2 = 'two.jpg'; $temp = 'temp.jpg'; rename $file1,$temp; rename $file2,$file1; rename $temp,$file2; ってやってるけど、いい方法ある? 教えてエロい人!
>>747 renameの戻り値は見といたほうがいいと思うよ。
あとはtemp.jpgが固定なのとrenameだと上書きされる
のがちと気になるかな。
私がやるなら多分こんな感じにすると思う。最初のrenameを
linkにしたのは一時ファイル名がすでに使われてるときに上書き
しないため。途中でエラーになった時の処理をどこまで凝るかは
その時によるけどor dieは一番手抜きのパターンね。
$file1 = 'one.jpg';
$file2 = 'two.jpg';
$temp = "temp.jpg.$$";
link $file1,$temp or die;
rename $file2,$file1 or die;
rename $temp,$file2 or die;
750 :
nobodyさん :04/07/04 22:07 ID:Sq5R/TGN
プログラム版で板違いといわれてこっちに来ました 全文検索でヒットした奴を 行の真ん中に表示されるようにしたいんですがどうすれば良いんですか? つまりglobalを検索したとすると、 global SchoolNet Director we have increased the US publics global awareness CanWest global Communications help address global warming issues California Wood Use Endangers global ↑こういう風に結果を出したいんです。 行全体を出力して、まんなかに検索した語を表示させたいんですが そもそもどういう方針でやればいいのかさえわかりません。 どうすれば良いんですか?
>>750 Webプログラミングか?そうじゃなかったらム板池
table タグで位置あわせするとかその手の話のように読めるが、 もしそうだとしたら、単にHTMLの話だから、 プログラミングでも、Webプログラミングでもなく、Web製作板に行くべきだな。
>>750 マルチするの早杉。向こうで解答貰ってるぞ。
>>751-753 バカは下手にでると際限なく威張りますね
わからないならレスしなくていいよ。
755 :
nobodyさん :04/07/05 00:30 ID:AbFm7153
質問させてください。 windowsで動かしているとき、 perlを動かすときにdos窓のウィンドウタイトルはc:\perl\bin\perl.exeや コマンドプロントから起動させた場合はc:\winnt\system32\cmd.exeのようになって いると思うのですがそれを任意の文字に設定したいのです。 色々検索してショートカットから起動すれば変えられるのはわかったのですが 当方、rocket mouseというtoolからウィンドウタイトルを任意の文字にした ものを起動させるのが目的でして、このtoolの場合、plファイルのショートカット を指定してもそのショートカットから起動させるのではなく、リンク先を参照して 起動するため、ウィンドウタイトルを変更して起動させることができません。 ここを調べろ、ここは確認したのかなどのご指摘ありましたらよろしくお願いします。
>>755 > ここを調べろ、ここは確認したのかなどのご指摘ありましたらよろしくお願いします。
>>1 は読んだか?
758 :
755 :04/07/05 03:14 ID:???
レスありがとうございます。
>>756 さんの言うとおりもう一度1を読み返してみます。
>>757 私はてっきりperlスレで質問する内容だと思ったのですが
ご指摘いただいたので違う方向からも再度考えさせてもらいます。
ありがとうございました。
プロセスを常駐させるにはどんな関数やモジュールを使えばいいでしょうか? fork関数を使えば良いですか?
皆さんは入力文字列をエスケープする際にどのような処理をしてますか? 自分はこんな感じです /&/&/ /\"/"/ /\'/?/ /</</ />/>/ /\s/ / /\r\n/<br>/ /\r/<br>/ /\n/<br>/ 他に こんな文字も危険、この文字はこれに置換がいい的なアドバイスもOK
↑ 消えたので&を&にして書き直しました /&/&amp;/ /\"/&quot;/ /\'/&#39/ /</&lt;/ />/&gt;/ /\s/&nbsp;/ /\r\n/<br>/ /\r/<br>/ /\n/<br>/
Perlのコーディングの話が少ないな。
この板の住人の大半は 1. コーディング以前の箇所で躓いている 2. 自分の抱える問題がコーディングの問題なのかどうかを切り分けできない 3. そもそもコーディングという言葉の意味を知らない のいずれかだから。 たぶんこのスレも「Perlを使ったCGIに関する質問ならなんでもOK」だと思われてる
なるほど、 スレタイ嫁 だけじゃ通じなくなってきたワケだな。
どーでもいいけど此処って初心者と中級者しかいないね
無意味なレスをつける
>>765 はスレタイも空気も読めない初心者
768 :
nobodyさん :04/07/05 16:48 ID:kgB0NkdW
除算の繰上げってどのようにします? ### 除算の繰上げ $a = 10; $b = 3; $c = $a % $b; $d = int($a / $b); if($c){$d++;} いつもこんな感じですが なんか、もっさりしてます。 スマートにコーディングしたものですが・・・。
$a = 10; $b = 3; $d = int(($a + $b - 1) / $b);
粘着ねぇ・・・
772 :
nobodyさん :04/07/06 00:04 ID:Xk4rbtY7
perlの ImageMagickを使って画像のexif情報を削除して ファイルサイズを小さくしたいのですが、できません。 ググってみたところ $image->Strip(); で削除できるという記述をみたのですが、同じようにやっても 画像が表示できなくなります。 どうやればexif情報だけすっぱり消せるかご存知の方は いらっしゃいませんでしょうか?
有効期限が1時間のcookieを焼きたい。 cookieのexpiresに使える形式の時間の取得って、 gmtime time だと全て数字だから微妙に違うよね。 cookie用に使える形式にするのに自分でルーチンを作ろうかなとか思ってるけど、 既存のモジュールで、こういうメソッドもってるやつないのかな?
>>772 I believe Strip() first showed up in ImageMagick 5.5.7.
10/3で出た答えが整数なら真、小数点が付くなら偽を返す条件式を書きたいんですが、 PERLでは引数が整数であるか、少数点つきの数字であるかを判定してくれる関数はないのでしょうか?
$answer = 10 / 3; print "ぎーーーーーーーーーーーーーーーーーーーーーーーっ" if not $answer - int $answer;
>>778-779 ありがと。
>>774 なんかムダなソースを読みこんで重くしたくないから、自分で作ってみた。
野暮ったいソースだから、見にくいけど、色々突っ込んでくれるとありがたい。
とりあえず2時間後のGMTを計算するサブルーチン。
ifのとこは上から
処理1.何も繰り上がらず2時間だけプラス
処理2.日、曜、時刻だけ繰り上がり
処理3.処理2+月も繰り上がり
処理4.処理3+年も繰り上がり
一応うるう年は4で割り切れるって部分だけは採用してる。100年とか400年とかは
どうせ生きてないから無視した。
sub ti{ ( my $sec , my $min , my $hour , my $mday , my $mon , my $year , my $wday , my $isdat , my $yday ) = gmtime time; $year += 1900; my @wday = qw/Sun Mon Tue Wen Thu Fri Sat Sun/; my @mon = qw/Jan Feb Mar Apr May Jun Jul Aus Sep Oct Nov Dec Jan/; my @a = qw/31 28 31 30 31 30 31 31 30 31 30 31/; if ( !($year % 4) ) { $a[1] += 1 ; } my @b = qw/00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60/; my $timer; if ( $hour < 22 ) { $hour += 2; $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|; } elsif ( $a[$mon] != $wday ) { $hour -= 22; $wday += 1; $mday += 1; $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|; } elsif ( $mon != 11 ) { $hour -= 22; $wday += 1; $mday -= $a[$mon]; $mon += 1; $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|; } else { $hour -= 22; $wday += 1; $mday -= $a[$mon]; $mon += 1; $year += 1; $timer = qq|$wday[$wday], $mday-$mon[$mon]-$year $b[$hour]:$b[$min]:$b[$sec] GMT|; }return $timer;}
お前ら今はサイバーノーガードの時代ですよ。 cookieの有効期限はリミットの2030付近にするのがナウイですよ。
>>782 いちいち繰り上がり計算しなくても、gmtime(time+7200)でいいような気が...
785 :
777 :04/07/06 10:53 ID:???
$mday -= $a[$mon]; のところは $mday -= $a[$mon] -1; だった。
786 :
777 :04/07/06 10:56 ID:???
>>784 うおーーーーーーーーーーーーーーーーーーーーーーー!?
重くしたくないと言って無駄なコードを書くやつは(ry
788 :
nobodyさん :04/07/06 13:40 ID:DU8HZvls
list.txt abc:123 aiu:456 1. open(IN, "list.txt"); while (<IN>) { print; } close(IN); 2. open(IN, "list.txt"); while (<IN>) { $tmp = <IN>; print "$tmp<br>\n"; } close(IN) 1.だと abc:123 aiu:456 と出力されるのに 2.だと abc:123 としか出力されないのはどうしてでしょうか、、?
>>788 aiu:456だけ表示されるというのならわかるんだけどなぁ。abc:123だけ表示される
のはかなり不思議だ。
791 :
nobodyさん :04/07/06 13:57 ID:DU8HZvls
>>789 すいません、aiu:456 としか出力されない の間違いでした・・・
792 :
nobodyさん :04/07/06 15:02 ID:DU8HZvls
色々調べたのですが、何が駄目なのか良くわからないのですが、、、 open(IN, "list.txt"); while (<IN>) { 処理 } データを1行単位で読み込み、データのある行が存在する間は while文で繰り返す という意味ではないのでしょうか、、、?
while (<IN>) { # ここで list.txt の一行目が読み込まれる $tmp = <IN>; # ここで list.txt の二行目が読み込まれる print "$tmp<br>\n" # 当然 $tmp の中には二行目しか入っていない
794 :
nobodyさん :04/07/06 15:37 ID:DU8HZvls
そうだったのですか!! <IN>で取得したものは$_ に代入されるのですね。 本当に助かりました。有難うございます。
>>794 # 何だか表現が微妙に気になる…。
1: abc:123
2: aiu:456
3: abc:123
4: aiu:456
5: abc:123
ファイルの中身をこの5行にして、実験してみるのもいいかも。
重ね重ね有難うございます。 早速100行くらいにして試しています。
$tmp .= $_; っでねが?
801 :
nobodyさん :04/07/07 03:43 ID:Dj0xztEm
非常に初歩的な質問なのですが、 受け取った変数を自動的に 別ファイルへ渡す処理はどうやってすればいいのでしょうか? (フォームを使えば変数を渡せるけど、 自動的には不可能ですよね?) ヒントでもいいので教えてくだせえ
>>801 あとはサーバー側のファイルに記録するくらいじゃないだろうか。
phpならその「自動的」ってのに近いと思う。
804 :
803 :04/07/07 11:20 ID:???
すみません。 自分で色々と勘違いをしていました。 自己解決しました。
805 :
nobodyさん :04/07/07 12:12 ID:lnfuZW7X
ある関数の中で require でファイルを取り込んでから その関数を抜けたときって require したファイルの内容は有効なんでしょうか?
>>807 797は明らかに間違ってるだろ?バカか?
list.txt 1: abc:123 2: aiu:456 3: abc:123 4: aiu:456 5: abc:123 open(IN, "list.txt"); while (<IN>) { $tmp .= $_; } print "$tmp\n";
>>809 open(IN, "list.txt");
while ($tmp = <IN>) {
print "$tmp<br>\n";
}
close(IN)
暗黙の$_使うか明示的に一時変数$tmpを使うか、だけの違いだろ。
>>808 間違ってるよね
>>811 馴れ合うな、キモイ
お前は解答さえしてればいんだよカス
なんか俺の質問のせいで荒れ気味ですか!?
そうです
815 :
801 :04/07/07 17:54 ID:Dj0xztEm
まじっすか!? この方法、他にないんでしょうか?
>>815 質問が意味不明だから回答が得られないんだよ
うん、意味不明
818 :
801 :04/07/07 18:17 ID:Dj0xztEm
要約すると、フォームでボタンをクリックして 変数を送る部分を、 クリックしなくても変数を送れるようにしたいんです。 意味分かりますかね?perlの超町長初心者なんで勘弁してください。 どうかよろしこです
>>818 perlの問題じゃないです。
要は【submit】ボタンを押さなくても、submitされるようにしたいって事?
JavaScriptとかで勝手にクエリ送るとかか?
やっぱ、perl関係ないです。
超町長初心者なら尚更、要約なんかしないで、 ちゃんと持ってるもの全部吐き出してください。
<form action="unko.cfm" name="send"> <input type="hidden" name="Name" value="Value"> </form> <script language="PerlScript"> $window->document->all->forms->send->submit(); </script> これで出来んじゃないか(テストしてない) てか板違い
>>818 ユーザ側の視点だと「自動的」「クリックしなくても」で済むんだろうけど、
プログラムにとっては「ある条件が満たされたとき」じゃない?
その「ある条件」は、あなたしか知らないわけですよ。
# で、JavaScriptで何かしらのイベント拾うんだろーけど。
>>818 フォームフィールドへの記入が終わる前に勝手に自動的に
CGIに送信してしまうトンデモscriptでも作るのか?
>>810 ・・・何故お前が皆に叩かれてるのか未だに分かってないのか???
下の二つを実行してみなさい。そして首吊ってください。
# 1
while (<IN>) {
$tmp = $_;
print "$tmp\n";
}
# 2
while (<IN>) {
$tmp .= $_;
print "$tmp\n";
}
文字列の配列を全部トリミングしたいんだけど @d = ( " abc ", " bcd ", " cde " ); for($i=0;$i<@d;$i++){ $d[$i] =~ s/^\s*(.*)\s*$/$1/; } これをもうちょっとスマートに書いてみたいですが どしたらいい? for文ははずせないのかな
grep(s/^\s*(.*)\s*$/$1/, @d);
>>826 (゚∀゚)サンクスコ!
grepって痴漢も使っていいんだ。勉強になりました。
>>824 何で俺にレスしてんの?
しかもみんなって・・・
日本語理解してるか?
ついでいっとくと俺は質問者でも解答者でもない。愉快な煽り厨
>>824 お前大丈夫か?
どこが叩かれてるんだ?
>>810 は・・・
レス一つもないじゃん。
まさか勝手に前の人と同じと認定してるとか?
>>824 >>810 氏は誰にも叩かれてないように思えるが・・・
俺のログがおかしいのかな?再取得してみるよ
Perlでセッション関数って使えないのでしょうか? ググっても使用例が見つからなくて困っています。
はぁ? もっとググれ
>>832 Perlはね、PHPみたいになんでも関数が揃ってはいないのですよ。
モジュールを使うか自分で書くのです。
まあ use CGI::Session かな
839 :
nobodyさん :04/07/08 03:04 ID:LQirb/WJ
今日始めてperl触った初心者なのですが windowsで他のサーバのディレクトリを ネットワークドライブに割り当て その中のファイルに対して -e を実行したらエラーしか返ってきません。 自分のサーバ内なら正常にファイルを検知できたのですが ネットワークドライブはファイルの検査ができないのでしょうか? $Path="d:/data/" $Data="test.dat" if(-e "$Path$Data")
840 :
nobodyさん :04/07/08 03:04 ID:o03xV6ak
読み込んだファイルの中で文字列<HOGE>と一致する(次の)行を検出したいのですが do $line = <FILE> until (($line eq "<HOGE>") || (eof FILE)); だと$line eq "<HOGE>"がいつまでも真になりません。 $line =~ /<HOGE>/だと真になってくれますが、「含まれる行」ではなく「一致する」行を検出したいのです。 上のやり方だとなぜ出来ないのでしょうか?
>>840 do { chomp($line = <FILE>) } until $line eq "<HOGE>" || eof FILE;
do { $line = <FILE> } until $line eq "<HOGE>\n" || eof FILE;
アンカー使えばいいじゃん。 $line =~ /^<HOGE>$/
843 :
840 :04/07/08 04:02 ID:???
>>841-842 回答ありがとうございます。しかしそれでも解決しませんでした・・・
がその後自己解決しました。
アップロード時の文字コード変換が原因で認識しなかったようです。
# 最近HDが吹っ飛んでOSアプリすべてを再インストールしたために、FFFTPの転送設定が正しくなされてませんでした
<FILE>をアスキーモード転送でアップしたところ正しい挙動になりました。
>>825 だれも指摘してないが、その置換では末尾の空白は
とれないよ。先に.*の方に食われちゃうので。838は
黙ってさりげなく直しちゃってるけどな(笑)
846 :
nobodyさん :04/07/08 11:32 ID:lii7HGr3
掲示板を作りました。 PCやドコモの携帯では普通に書き込めていましたが、auで試したら、 書き込んだ内容がURLエンコードされたまま書き込まれてしまいました。 なぜでしょうか。 書き込まれた内容 : %92x%82%ea%82%c4%83X%83%7d%83%93 デコード処理部分 sub getparam{ my($QUERY_DATA,@pairs,$pair,$key,$value,%FORM); if($ENV{ 'REQUEST_METHOD' } eq "POST"){ read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); } @pairs = split(/&/,$QUERY_DATA); foreach $pair (@pairs){ ($key,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/"/"/g; $value =~ s/&/&/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\r\n|\r|\n//g; $value =~ s/\,/、/g; $value =~ s/\t//g; $FORM{$key} = $value; } return(%FORM); }
>>846 君がURLエンコードされたものをデコードしてないから。
素直にCGIモジュール使った方がいいと思うよ。
848 :
847 :04/07/08 11:39 ID:???
ごめん見落としてた。吊ってくる。
>>846 自分のスクリプトから欠陥を見つけられないならauの方の糞さを疑ったらどうだ?
三菱から欠陥を見つけられないなら乗り手の方の糞さを疑ったらどうだ?
とりあえず加工する前の生の入力($QUERY_DATA)をファイルか何かに書き出して よく眺めてみるのがいいかもね。
GDでグラフを描こうと思ったけど 横軸が等間隔じゃないデータは 扱いにくそうだな ほかにグラフ描くいいライブラリないかな
855 :
nobodyさん :04/07/08 17:51 ID:fxJBz/QH
とりあえずカウントするだけのアクセスカウンタを作ろうと思ったのですが #!/usr/local/bin/perl -Tw use strict; my $data = './data.dat'; open COUNTER, "+<", $data or die "$data:$!"; my $count = <COUNTER>; $count += 1; seek COUNTER, 0, 0; print COUNTER $count, "\n"; close COUNTER; #html排出 print "$count"; exit; なんどやっても、おかしいと思うところやタイプミスを直しても動きません(Internal Server Error) どこが間違っているのでしょうか?勉強後初プログラミングなもんで… ご教授よろしくお願いしますm(_ _)m
すいません。書き忘れました。 cgiのパーミッションは755 datのパーミッションは777 です。よろしくお願いします
>>857 速レスありがとうございます。
-Twが間違っているのですか
あの、よろしかったらどのようにすればよいのか教えていただけないでしょうか?とりあえず抜いてみたのですが、事態は変わらず…
>>855 ていうかエラーログ読めよ。まずはそれからだろ。
>>855 ヘッダ書け。
#!/usr/local/bin/perl
use strict;
my $data = './data.dat';
open COUNTER, "+<", $data or die "$data:$!";
my $count = <COUNTER>;
$count += 1;
seek COUNTER, 0, 0;
print COUNTER $count, "\n";
close COUNTER;
#html排出
print "Content-type: text/html;";
print "$count";
良心で書いてやったぞ(藁
863 :
nobodyさん :04/07/08 20:21 ID:UcZ/C4OX
>>646 $testdat = 'c:/Program Files/Apache Group/Apache2/cgi-bin/test.dat
open IN, $testdat or die "$!\n";
while(<IN>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
print (((sort keys %record))[-1]);
でテストすると、syntax error at test1.cgi line 8, near "open "
Execution of test1.cgi aborted due to compilation errors.
が、出てしまいます、これはどこを縦・・・じゃなくて
どうやって原因をつきとめていったらいいのでしょうか?
864 :
名無しさん@Linuxザウルス :04/07/08 20:29 ID:3Hvq7uli
縦読みが出来るエラーメツセージをはく処理系が あったら最初は楽しいかもしれんが、ウダイだろ
865 :
863 :04/07/08 20:34 ID:7oRlGTHB
このエラーはWindows2000のコマンドプロンプトで perl -cw test1.cgi で出てきたものです。
866 :
名無しさん@Linuxザウルス :04/07/08 20:37 ID:3Hvq7uli
フオームに文をいれてやると、縦読みにして かえしてくれるやつを作るとしたら まず何をすればいいのでしょうか?
867 :
863 :04/07/08 20:44 ID:7oRlGTHB
いまもコードをにらんでいますが near "open " のところがわかりません。 近いっていったいなにが?って感じです。
open前の行が…(ry
openの近くが…(ry
>>868 >>869 openの前の行も、近くにも変な追記はしてないですし
さっぱりわかりません。
>>872 自分のソースを読み直してくれ。
$testdat = 'c:/Program Files/Apache Group/Apache2/cgi-bin/test.dat
これはどう見てもopenの前にあるよな?
$_=undef unless($_); なぜ、このような文法が許されるのですか? unless($_) { $_=undef; } と書かないのはなぜですか?
> なぜ、このような文法が許されるのですか? そのようにPerl上で定義されてるから。 > unless($_) { $_=undef; } と書かないのはなぜですか? ここではunless($_)より$_を解放する処理が有るということの方が重要だから。
(´-`).。oO( KヨNT の中の人かなぁ。。。)
878 :
874 :04/07/08 22:58 ID:???
>>876 強調のための倒置法みたいなもんすね。
「帰れ! やる気無いなら!」 みたいな。
>>870 sub Form_Input {
my($buffer,@pairs,$value,$name);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs =split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$input{$name}=$value;
}
}
を最後の行にぶち込み、%Form_Input(); を条件分岐(# メイン処理 つーところ)の前で呼びだし、$mode を $input{'mode'} に変更し、
サブルーチン、registを、
sub regist {
&header;
print "$buffer";
&footer;
exit;
}
とすればとりあえず動く。長くてスマソ。
(´-`).。oO(
>>863 はさすがにもうわかっただろうな・・・)
(´-`).。oO(だといいけどね…
おもしろいこと言う人だw
>>884 俺も
>>882 見た瞬間に
「なんでそうつなげるんだろ?面白い人だなぁ」
と思ったんだけどな。
俺も必死杉な質問者扱いされる仕様なのか…。
# このスレ、どうなっとるんだ?
>>866 % vi ~/tateyomi.pl
887 :
870 :04/07/09 08:45 ID:???
>>879 レスありがとうございます。
ご指摘があった箇所を書き換えたところ、一応動きました。
が、$bufferが書き出されません・・・。
sub Form_Input の処理というのは
Formデータを読み込んで$bufferにいれ
それを&で切り分けたものを@pairsにいれる。
@pairsに入れたものを=でさらに分けて、$nameと$valueにいれる。
$valueに対してデコード処理。
で合ってますか?
これならば、$bufferは生データが表示されるはずですよね・・・。
(´ヘ`;) う〜ん・・・
もうちょっと頑張ってみます。
>>879 %Form_Input();じゃなくて&Form_Input();だよな。キー隣だもんな。
>>870 ソース見れないので、間違ってたらスマソ。
print $input{'1'} ;
にするとどうなる?
889 :
863 :04/07/09 11:42 ID:???
>>873 朝起きて、もう一度みたら気が付いた・・・・。
>>880 以降の人たち
漏れには0時過ぎに起きて2ちゃんやれるほどの元気はないぞ・・・いいな若いって。
890 :
nobodyさん :04/07/09 11:44 ID:6LTGfdJz
データとフォームから得たデータの重複チェックがしたいのですが if ($aaa_tel eq $bbbtel){print "同じ電話番号が存在します。";} こうしたソースで、$aaatelが0123-45-6789の場合、$bbbtelの中が 0123456789や、01-2345-6789、012-345-6789、012-345-6789 0123-45-6789、01-2345-6789なども 同じ番号と判定して警告を出すためには、どのように書き直した方が いいのでしょうか?
>>890 比較する前に、比較できるようフォーマットを揃える
両方の文字列からハイフンを除去し、マルチバイト文字をASCIIに揃え、 とかやった上で比較するわけだな。 一般には「正規化」と呼ばれる。
893 :
890 :04/07/09 12:05 ID:6LTGfdJz
正規表現を使って判定するとしたら、どんな記述になりますかね?
俺と性器表現しようよ
>>890 1. 双方とも全角→半角する。Encode でも Jcode でも。
2. 双方とも tr/0-9//d; にする。
3. 双方を比較する。
4. おしまい。
ハッシュtableの中身をソーティングし、その値を出力するプログラムです。 %table = ('A' => '5', 'B' => '10', 'C' => '8', 'D' => '13'); sub number { if ( $table{$a} > $table{$b} ) { return 1; } elsif ( $table{$a} == $table{$b} ) { return 0; } elsif ( $table{$a} < $table{$b}) { return -1; } } foreach $KEY (sort number values %table){ print "It's $KEY \n"; } 上記のプログラムを実行したところ、tableの値がソーティングされておらず、しかもデバッグにより、サブルーチン内の$aと$bに値が入っていないことが解りました。時分でも減員を調べたのですが解らなかったので、教えて頂けませんでしょうか?
>>899 foreach( sort{$table{$a} <=> $table{$b}}keys %table){
print "It's $_ \n";
}
何してるんだか、どっから説明すればいいんだか、
なんで何の為にこねくり回してるんだか
| /ヾ.. | | | | __,-'ニニニヽ . | | .. | `、ヽ ヾニ二ン" / | | ヽ\ / | AA略 誤字は誤字であると見抜ける人でないと (Perlのコーディングは)難しい
ネット上のファイル(httpからはじまるようなもの)をopenで開くような感じにする方法ありますか? cgiを通してネット上のファイルを書き換えてレンダリング、というのをやりたいんですが、 同じサーバーのものしか扱えなくて困ってます。
そんなんできたら大変だろ・・・・
>>902 それができたら世の中どうなるか考えてみろ
>904 どういうものを想像してるのかわかんないんですが、 ファイルを書き換えて保存するわけじゃなくて、 ファイルを読み込んで、書き換えたものをレンダリング、です。 電波ニュースとかご存じないでしょうか。あんな感じなんですが。
>>905 普通にSocketを使ってよむんならかのう。 PHPならfopenで読めるそうな
>>905 相手がhttpならLWP使って読めばいいんじゃねーの?
変数なりなんなりに中身入っちまえば後は煮るなり
焼くなり好き勝手すりゃいいわけで。
phpはfopenでurl開けるから楽。関数もむちゃくちゃおおい でも、素人はperl使っててください、お願いだからPHP使わないでね^^
>>897 tr/0-9//d;ってのは、変換する文字が数字で
変換する文字のリストが無い訳ですよね。
すみません、どのような効果があるのかわからないのですが。
>>899 コード中の
= ('A' =
これがAAに見えてしかたがない漏れは
いってよしでつか?
>>909 ハイフンの有無が混在してると比較の邪魔。
それを比較しやすいデータにして返してくれる、という効果。
tr///d; ←この d の意味を調べると幸せになれる予定。
912 :
nobodyさん :04/07/09 22:37 ID:170SmloA
>>909 それ多分tr/0-9//cdの間違いで、意図は数字以外の文字を
全部削って数字だけ残す、だと思われ。
914 :
911 :04/07/09 22:42 ID:???
_| ̄|○…吊ってきまつ。
>>905 まあ
>>907 の言うとおりLWP使うのが常道だろうな。
LWPという名前が初耳だったら即ぐぐれ。
>907 >915 有難う御座います。ざっと具具って読んでみましたが、鯖にインストールしないと使えないみたいですね。 借り鯖なんで、試して無理なら無理、ってことでしょうか。
$file = 'system/index.html'; という感じで($fileは動的で、ファイル名が入ります)、 そのディレクトリ、を特定したいのですが、(つまりファイル名だけ省く)どうすればいいんでしょうか。 一番最後の . 〜その直前の / までの割り出し方があればなんとか出来そうなんですけど。
/.*\//
919 :
917 :04/07/10 02:05 ID:???
($dir,$trash) = split(/./,$file); で拡張子だけはずす事までは出来るんですけど。 $fileに入るファイルURLは / がいくつはいるか特定できないので / で区切るわけにもいかないし。 どうしたらいいんでしょうかね。
920 :
917 :04/07/10 02:05 ID:???
>>918 一足違いでした。
有難う御座います。それを調べてみます。
921 :
917 :04/07/10 02:22 ID:???
s/オプションをつけない状態の、「最初に見つかった○○」の逆みたいな、後ろから最初に見つかった、ってオプションはないんでしょうか?
最後のスラッシュを書き換えればその書き換えたもので区切って、前方を、ってできるような気がしたんですけど。
#完全におかしなことを言ってるような気がしてきた。
>>918 えっと調べてみたんですが、「一番最初に見つかった○○」〜「一番最初に見つかった××」ですかね。
$file = 'system/news/index.html';
だと「system/」しか拾ってくれないのではないでしょうか?
誤読してますかね。
>>917 $file =~ s/(.*\/).*/$1/;
とか
$dir = substr($file, 0, rindex($file, "/") + 1);
923 :
917 :04/07/10 03:18 ID:???
>>922 試行錯誤を繰り返しておりましたが答えに到達できませんでした。
それでうまくいきましたです。本当に有難う御座いました。
924 :
nobodyさん :04/07/10 07:39 ID:INTe94T2
あの、perlってコーディングの自由度が高いですよね。 そこでperlのソースコードで縦読みって作れるんでしょうか? 一見、ふつうのソースだが、縦とか斜めに読むと 面白い事が書かれているとか。 変数名だけじゃなくて、命令や関数が組み合わさって縦読みできたら、かなりすごいんじゃないでしょうか。
>>926 つーか、エバッてるから、ちーともびっくりしない。
ユーはパアルのなにが知りたいんだい? 答えてやるよ!
存在価値
そうかい。ユーは存在価値が知りたいのかい。 存在していて、害にならなければ存在価値はあると言っていいだろう。 でも大事なことを教えてやろう。パアルのコージングとは無関係な質問ね。
931 :
870 :04/07/11 06:02 ID:???
あがいて結局できなく、半べそかいてもどってきました870です。
>>888 一応&Form_Input();にはしてあります。
それで、アドバイスがあった
print $input{'1'} ;
を入れてみたのですが、表示されません。
一応ソースですが、再アップしてみたので、よかったらご覧になってください。
もう自分挫折しそうですorz
どなたか、愛の手を・・・
>>931 print "Content-type: text/html;\n\n";
それと、ソースのファイル名が100q.zipじゃなくて100.zipになってたぞ。
933 :
932 :04/07/11 06:50 ID:???
>>931 ヘッダの問題じゃなかったのかな?
print $input{'1'} ;
って何を表示するのかわかってる?
print $input{$_} for 1..100; こうした方が君にはいいかも
>>888 $input{'1'}
を
foreach (1..100){
print qq($_ : $input{$_} <BR>\n);
}
にしてみる。
>934 Perlスレッドでのレスありがd
こんなスクリプトを書きましたが、結局画像の形だけが表示されてしまいしまた。
画像を出して、Locationで飛ばしたかったんだけど。
#!/usr/local/bin/perl
$image = "./image.gif";
$SIG{ALRM} = \&timeout;
#GIF画像の出力
sub timeout{
print "Location:
http://******/success.html\n\n ";
alarm 0;
exit;
}
alarm 5;
print "Content-type: image/gif\n\n";
#画像の書込
open(IMG,"$image");
binmode(IMG);
print <IMG>;
936 :
935 :04/07/11 18:26 ID:???
あ、「GIF画像の出力」コメントは、なしです。
ttp://****/*.cgi?f=filename.jpgで filename.jpgへリンクしたhtmlを出力させたいと思ってます。
<a href="特定のURL指定/$f">●</a>とおいたときに$fがfilename.jpgじゃなく空白になります。
filename.jpgを出力するために何か処理が必要になるのでしょうか?
htmlの出力、URLの指定などは問題なしです。
アドバイスお願いします。
>>937 >>1 > 1: 自分はこう言う事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
2が抜けてる。
?f=filename.jpg を $f にどうやって代入してるの?
939 :
937 :04/07/11 22:16 ID:???
>>938 レスありがとうございます。
?f=filename.jpgが$f指定してると思ってたので特に記述してなかったです。
?f=のような指定について調べてみたのですが、参考になるページが見つかりませんでした。
情報ありましたらアドバイスいただけないでしょうか?
>939 QUERY_STRINGでぐぐれ。
941 :
nobodyさん :04/07/11 23:12 ID:YH96401L
PHPだと $array[] = "apple"; とすると配列の最後に"apple"を追加してくれるのですがこれをPerlでやる場合 簡単な方法ってどうやりますか?
どもです
944 :
937 :04/07/12 01:23 ID:???
GD::Graphでグラフを描こうとしてるんだけど $gd=$graph->plot(\@data); open(IMG, '>test.gif' ) or die $!; binmode IMG; print IMG $gd->gif; ★ close IMG; ★のところで Can't call method "gif" on an undefined value pngにしてもだめなので、ここで何をサポートしているのか知りたい。 サポートしているファイル形式を知るためのメソッドってありますか?
配列に小数点を入れるとき @a = qw( 0.1 0.2 0.3 ); だとちゃんと入るんだけど @a = { 0.1, 0.2, 0.3 }; だとなんかすっげー数字が入っている なんでだすか?
@a = ( 0.1, 0.2, 0.3 );
>>950 なんですっげー数字が入るのか聞いているんだすよ。
952 :
949 :04/07/12 11:48 ID:???
>>951 my @a = { 0.1, 0.2, 0.3 }; # ハッシュリファレンス 1 つを @a に代入
print @a, "\n"; # リファレンスを文字列として評価 → "HASH(0x10c1350)"
# 文字列 "HASH(0x10c1350)" を強制的に数値コンテキストで評価
# 0x10c1350 → 17568592
$_ += 0 for @a;
print @a, "\n"; # 17568592
>>953 正確には文字列→数値じゃないな。リファレンスを数値コンテキストで
評価するとアドレスの値が返る。
サブルーチンにファイルディスクリプタを渡したいんですが
perlスクリプトをHTMLに埋め込むことって出来ますでしょうか? 例えばpingを打ちたいと思ったら CGIだと クライアントから要求→サーバがping実行→クライアントに実行結果を返す ですが、 HTMLの中にスクリプトを埋め込むことによって、クライアントからpingを打つことは可能でしょうか? うまく意味が伝わらなかったらごめんなさい_no
960 :
957 :04/07/12 21:40 ID:???
>>958 回答ありがとうございます。
ゼミの教授が「タグで簡単に出来る」と言ってきて、
自分なりに色々調べたのですが、全くそのような情報がなかったので質問させて頂きました。
胸を張って「そんなこと出来ませんよ」って言いたいと思います!
いいじゃん 恥かくのは本人なんだから
>>960 ゼミの教授は嘘つきだ
Perlにタグなどない!
だいたいHTMLに埋め込むのってCGIじゃなくてSSIでしょー
確かにSSIをHTMLに埋め込むのはタグだけどなぁ
>>963 学生「先生!あのpingの話ですけど、できませんよ!」
教授「ほう、何か調べたのですか」
学生「はい。調査の結果、2chのnobodyさん(958)が『無理』と。句読点なしで」
教授「…帰れ」
…こんな感じのコじゃないかな。
「タグで出来る」ってのも、
>>960 さん用語に変換されてるだけかもしれない。
ヘッダをimage/gifとかにして、 「<img>タグ」でアクセスとかだったら、 ちょっと、いぢわるだなぁ、その教授。 >957とりあえずガンガレ。。
HTMLの中にperlを埋め込むだけなら PERL_SSI とかいう手もあるが、 「クライアントからpingを打つ」てのは難しそうに思えるなあ。 それができるとたぶん物凄いセキュリティホールになる。
だから 無理 って言ったんですけどね・・・
968 :
nobodyさん :04/07/13 13:17 ID:Q7wc8BxW
特定のフォルダにあるファイルを表示し、ファイルにリンクを張り、ファイルサイズとアップロードされた時間を表示しています。 print "<table>\n"; print "<tr><th>No.</th><th>FileName</th><th>FileSize</th><th>UploadTime</th></tr>\n"; opendir(DIR, "$dir" ) or die; while(my $filename=readdir(DIR)){ if($filename=~/^\.{1,2}$/){ next; } ++$no; @fileinfo = stat("$dir$filename"); $upldtime = &time($fileinfo[10]); $filesize = int ($fileinfo[7] / 1024); $filesize = ~ s/(\d)(\d\d\d)(?!\d)/$1,$2/g; print "<tr><td>$no</td><td><a href=\"$dir$filename\">$filename</a></td><td>$filesize KByte</td><td>$upldtime</td></tr>\n"; } print "</table>\n"; closedir(DIR); 左端からNo.、ファイル名、ファイルサイズ、アップロードされた時間・・・と4つ並びます。 ここで、「アップロードされた時間」を基準にして、時間の新しいものから順にリスト表示したいのですが 根本的にやり方がわかりません。 whileより上でソートしていないといけないような気もするのですが・・・ 誰か教えてください。。 &timeはここには出ていませんが、yyyy/mm/dd hh:mm:ss形式で表示させるためのサブルーチンです。
アップローダー作っておきながら、ソートもできんのか・・・
>>968 whileの中でhtml出力まで一気にやらなけりゃいいんじゃないの?
while内でhashなりにデータ格納して、
後で好きなようにソートなり何なりしてHTML出力すれば?
972 :
968 :04/07/13 13:57 ID:Q7wc8BxW
みなさまありがとうございます。
>>969 system "ls -lt" >hoge.txt
・・・みたいな感じですね。system禁止されてなきゃいいのですが。
>>970 そうか。
アップローダーCGIを参考にすればよかったのですね。
全然思いつきませんでした。
ファイルのアップはFTPです。アップローダーなんて高機能なもの、まだ作る腕がありません。。
>>971 perlのsortを調べてて、「先頭からn番目(今回の場合は4番目)のものをキーにして・・・」というのが、探し当てられませんでした。リャマ本にも「すぐわかるperl」にもなかったですし、いろいろ探し回ったのですが。。
・・・と書いてて今思いつきました。
タイムスタンプを先頭に格納すればいい?
がんばってみます。
973 :
970 :04/07/13 14:03 ID:???
>>972 >ファイルのアップはFTPです。
そうだったのか・・・スマンコ
print <<"EOS"; <table summary="アップロードされたファイルの一覧"> \t<tr><th abbr="番号">No.</th><th abbr="ファイル名(リンク)">FileName</th><th abbr="サイズ(Kilo bytes)">FileSize</th><th abbr="アップロード時刻">UploadTime</th></tr> EOS my $count = 0; local *DIR; if (opendir DIR, $dir) { foreach my $filestatus ( sort { $b->[3] <=> $a->[3] } # 最新更新時間を降順に並べ替え map { [ $_, qq|$dir/$_|, (stat qq|$dir/$_|)[7,9] ] } # [ファイル名、ファイル位置、ファイルサイズ、最終更新時間] grep { !/^\.+/ } # . .. を排除 readdir DIR # 読む ) { printf qq|\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n|, ++$count, # ファイル番号 sprintf (qq|<a href="%s">%s</a>|, $filestatus->[1,0]), # ファイル名とそのリンク sprintf (qq|%s KBytes|, int($filestatus->[2]/1024) =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/eg), # サイズ(KBytes) ×tamp($filestatus->[3]) # 最終更新時刻 } } print qq|<td colspan="4">ファイルがないかも (´・ω・`)</td>\n| unless $count; # $count が 0 ならば print <<"EOS; \t</tr> </table> EOS 脳内処理につきご勘弁m(_ _)m