Perlコーディング初心者質問スレ Part 42
1 :
nobodyさん :
2005/05/25(水) 06:36:28 ID:PVpWgcdf Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
nobodyさん :2005/05/25(水) 06:42:32 ID:PVpWgcdf
3 :
nobodyさん :2005/05/25(水) 06:44:34 ID:PVpWgcdf
4 :
nobodyさん :2005/05/25(水) 06:45:16 ID:PVpWgcdf
5 :
nobodyさん :2005/05/25(水) 06:45:59 ID:PVpWgcdf
6 :
nobodyさん :2005/05/25(水) 06:46:54 ID:PVpWgcdf
10 :
nobodyさん :2005/05/25(水) 13:52:45 ID:5tMlS9wk
バイト数ではなく文字数を得たいのですが、スマートな処理方法は ございますでしょうか。 例えば「12345あいうえお」の場合、「15バイト」として数えるのではなく、 「10文字」として数えるようにしたく思っております。 ご教示いただけますと幸いです。
>>10 use encoding 'Shift_JIS'; # ソースのエンコーディングを指定する
print length('12345あいうえお');
>>11 ご教示有難うございます。
しかしながら先方のサーバはバージョンが5.6みたいで、
使用できませんでした。
とにかく即レス有難うございました。
13 :
nobodyさん :2005/05/25(水) 18:39:06 ID:kwD9lRlX
初心者なので、無知ゆえの行動を取っているかもしれませんが、指導お願いします。 長文ですが、よろしくお願いします。 1つのページに560個程度の項目があります。これをCGIで管理したいと考えています。 項目はチェックボックスx2、テキストx1、テキストエリアx2が90行と日付等に利用している チェックボックスとテキストが数個です。 現在、自分で何とか改造できる更新記録系CGIを改造してどうにかしようとしています。 ただ、1つ問題があります。が… 560個もの項目(変数)を、表示ルーチンのsplit時の変数羅列や書き込み時のline(pushの時に利用してるもの) に並べても大丈夫なのでしょうか? さっき、変数を手打ちするのが大変だと思いエクセルののオートフィルを利用し変数をCSV出力し1行にしたら PerlEdtiorが途中でフリーズとなってしまいました。 ソフトの限界があるのかもしれませんが、これで限界があるようだと、CGI上でも動作しないのでは? と考えてしまします。あまり1行が長いとまずいということでしょうか? 1行でどうにかしたいのには訳があります。 >項目はチェックボックスx2、テキストx1、テキストエリアx2が90行 と先ほど書きましたが、この更新は1行ごとではなく、ランダムで何十行かまとめてする必要があるので、 1行ごとに「更新ボタン」とするのではなく、全部まとめて「更新」としたいからです。 もちろん、この考えに誤りがある場合、指摘してください。 そこで、1つ考えたのが、ログファイル・split時の変数羅列や書き込み時のlineを改行できないのか?と思いました。 これがOKなら問題解決しそうなのですが、ダメでしょうか? splitで読み込み時に改行があるとまずいとかあるのでしょうか? ログやsplit時の変数羅列が長すぎてはダメ、でも改行は出来ると言う場合は↑の問題まで教えていただけるとありがたいです。
14 :
13 :2005/05/25(水) 18:40:25 ID:kwD9lRlX
↑の続き。 もし、1行でダメで改行もダメな場合、質問の続きを書き込みます。 よろしくお願いします。
> 1行ごとに「更新ボタン」とするのではなく、全部まとめて「更新」としたいからです。 一行ごとに複数回更新処理したらいいんでは?そういうことじゃない? > PerlEdtiorが途中でフリーズとなってしまいました。 それはそのエディタがしょぼいだけ、とか。 そもそも、なんで560個もの変数が必要となるのかがさっぱりわからん。
16 :
nobodyさん :2005/05/25(水) 19:25:13 ID:VuzyXB/A
17 :
nobodyさん :2005/05/25(水) 19:34:15 ID:10kxLICF
以前一度質問した内容ですが、よろしくお願い致します。 全部で11個のCGIから1つのデータファイル(テキスト)を参照させている のですが、最近そのデータが消えることがあります。そのデータファイルは現在、 1500くらいのレコードがあり、追加書き込みができます。データが消えると いうのは、1〜20レコードがすっぽり消えていたり、レイアウトがずれたりも します。 以前の質問時には、ファイルロックを書き込みできるCGIのみ記述していた ので、読み込みのみのCGIにも記述すべきとのアドバイスを頂き、修正したの ですが、再発してしまいました。 ファイルロックの記述は以下のような感じですが間違っているでしょうか? if ( !open (ABC_OUT, ">$abc_file") ){ print "ファイル読み込みオープンエラー<BR>\n"; } else{ eval{ flock(ABC_OUT, 2); }; (省略) ファイルロックが機能しているか確かめる方法とかあるのでしょうか? また、ファイルを掴んでいる人のPCがフリーズしたりしてファイルが壊れる なんてこともあるのでしょうか?
普通のファイルロック
ロック処理
↓
書き込み/読み込み処理
↓
ロック解除処理
>>17 のファイルロック
読み込み処理
↓
ロック処理
↓
19 :
nobodyさん :2005/05/25(水) 20:36:39 ID:FbKjEBl3
my $hogehoge = new ABCD::Saitama; my $st = $hogehoge->db->wakame('wake wakame'); ↑ 上のような文章が出てきたんですけど、これは何をしてるんでしょうか? 解説できるかたがおりましたら、教えてください。 また詳しい説明が載ってるHPがあったら教えてください。
20 :
10 :2005/05/25(水) 20:37:07 ID:???
いろいろ調べ、 my $jp = $args =~ tr/\x8e\xa1-\xfe/\x8e\xa1-\xfe/; my $asc = $args =~ tr/\x20-\x7f/\x20-\x7f/; $jp / 2 + $asc; これでとりあえず文字数を数えられるところまではできたのですが、 この場合、記号だけがちゃんと数えられません。 例えば「"」ですと、4文字と数えられてしまいます。 頭悪いのでこれ以上解決まで至りませんでした。 ご教示いただけますと幸いです。
>>20 Jcode.pmでもできるぞ。それも入ってないのけ?
$length = $jcode->jlength();
returns character length properly, rather than byte length.
23 :
10 :2005/05/25(水) 20:49:01 ID:???
>>22 残念ながら入ってませんでした。
本当に困ったものです。
ご教示有難うございます。
>>23 とりあえずシフトJIS限定で、
$jstr = '"12345あいうえお"';
print "$jstr = " . length($jstr) . "\n";
# SHIFT_JIS 2バイト文字を1バイト文字(j)に置換
$jstr =~ s/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/j/g;
print "$jstr = " . length($jstr) . "\n";
実行結果>"12345あいうえお" = 17
実行結果>"12345jjjjj" = 12
こんなん出ましたけど
25 :
nobodyさん :2005/05/25(水) 22:09:41 ID:10kxLICF
>>18 ファイルオープンの前にファイルロックしろということですか?
27 :
10 :2005/05/25(水) 22:44:16 ID:???
皆様、ご教示有難うございました。 苦心の末、文字列計算ルーチンがなんとかできました。 sub char_count{ my $args = $_[0]; $args =~ s/\x0D\x0A|\x0D|\x0A//g; my $ascii = '[\x00-\x7F]'; my $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; my $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; my @chars = $args =~ /$ascii|$twoBytes|$threeBytes/og; return ($#chars + 1); } これでちゃんとカウントされます。 Perlの小技さんのサイトに救われました。 丸半日かかりましたが、明日の納期に何とか間に合いました。 皆様に感謝いたします。
>19 無理やり一言で言うなら、 ABCD::Saitamaのひとつである $hogehoge の要素 db への wakame('wake wakame')という関数の呼び出し。 チョー難しい。スレタイの通り「初心者」なら忘れるか丸暗記しろ。 いわゆる、オブジェクト指向的な書き方。 古いバージョンのPerlには存在しなかったものなので、載ってる書籍も少ない。 Perlが開発された当時にはオブジェクト指向という概念すら登場してなかったから無理も無いけど。 検索するときは「perl オブジェクト指向」あたりで検索するといい。 もし、Perlの他の部分はほとんど分かるがそれだけが分からないんだとしたら、巣立ちの時期。 そろそろ第二のプログラミング言語を学んでみる事をお勧めする。 文法上、それ以上難しい事はPerlには登場しないというのがひとつ。 加えて、Perl上でのオブジェクト指向の実装はかなり変なので、ただでさえ難しいオブジェクト指向の概念を初めて学ぶには結構キツい。
29 :
10 :2005/05/25(水) 22:50:18 ID:???
あ、Perlメモさんでした。 やはり神サイトです。
変数に格納してある文字列を、S-JISにして文字コードのまま扱いたいんですが、 何か方法はありますでしょうか。 検索してみても、文字コードを変換する方法ばかりHITするもので。 お願いします。
S-JISにして文字コードのまま扱いたい。って何? 具体例を示したほうがよろしいかと。
ファイルのアップロードについて質問させて下さい。 送信内容の確認ページを挟みたくて、下記の様な流れで 作成してみました。 (2)確認ページから、最後の(3)登録処理ページへデータを渡す為に (2)確認ページ側のformをenctype="multipart/form-data" としてやり、 <input type="file" name="temp" value="$FORM{'temp'} "> として、最初の(1)ファイル選択フォームからのファイルデータを 受け取れないかと思ったのですが、 セキュリティー上、type="file" にvalueは与えられないとの事。。。 確認ページを入れたい場合、どの様にしたら良いのでしょうか。 どうかご教授下さいませ。
#(1)ファイル選択フォーム(regist_form.cgi) <form method="post" action="./regist_form.cgi"> <input type="text" name="name" size="20"> <input type="file" name="temp" size="40"> <input type=submit name="regist" value="登録"> </form> ↓ #(2)確認ページ(regist_form.cgi) $FORM{$name} = $value; ・ ・ ・ <form method="post" action="./regist.cgi" enctype="multipart/form-data"> <p>$FORM{'name'} </p> <input type="hidden" name="name" value="$FORM{'name'} "> <input type="file" name="temp" value="$FORM{'temp'} "> <input type=submit name="regist" value="登録"> </form>
↓ #(3)登録処理ページ(regist.cgi) use lib './lib'; use CGI::Lite; require 'jcode.pl'; $cgi = new CGI::Lite; my $directory = './file'; mkdir $directory, 0777 or die $! unless (-d $directory); $cgi->set_directory ($p_dir) or die &error('ディレクトリが存在しません'); $cgi->add_timestamp(0); %data = $cgi->parse_form_data;
@array =(0,1,2,3); $index= rand @array; print $array[$index], "\n"; print "<BR>\n";print "<BR>\n"; 配列の要素をランダムに取り出した時、 その要素を固定して留めるにはどうしたらいいでしょうか。 当たり前なんですが、更新ボタンを押すと要素が変化してしまいます。 こんな風に無理矢理別の変数に突っ込んでみようとしましたが $array[$index]=$mem; $memには何も記録されませんでした。
>>19 my $hogehoge = new ABCD::Saitama;
my $st = $hogehoge->db->wakame('wake wakame');
を書き直すと
my $hogehoge = ABCD::Saitama->new();
my $tmp = $hogehoge->db();
my $st = $tmp->wakame('wake wakame');
と同等、意味は
1行目の左辺: ABCD::Saitamaパッケージで定義されているnew関数を呼出す。
1行目のnew関数: ABCD::Saitamaパッケージと関連付けされたリファレンスを返す。
1行目の右辺: new関数の戻り値であるリファレンスを$hogehogeに代入。
2行目の左辺: ABCD::Saitamaパッケージで定義されているdb関数を呼出す。
2行目のdb関数: 何かのパッケージと関連付けされたリファレンスを返す。
2行目の右辺: db関数の戻り値であるリファレンスを$tmpに代入。
3行目の左辺: 何かのパッケージで定義されているwakame関数に引数を渡して呼出す。
3行目のwakame関数: 引き数を受け取って何かの値を返す。
3行目の引き数: この場合の引き数とは'wake wakame'という文字列定数のこと。
3行目の右辺: wakame関数の戻り値である何かの値を$stに代入。
>>36 あっ、左辺と右辺を書きまちごうたけど、まっいっか。
>>32 fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
39 :
nobodyさん :2005/05/26(木) 11:23:28 ID:7fGLJWg9
すいません質問お願いします。 自分で作った掲示板で、書込み内容を修正しようとおもったのですが、 削除機能がついてないので、ftpでログをダウンロードして 書込み内容を修正してからアップロードしたら きちんと表示されなくなりました。 ログの保存方法は title<>name<>kakikominaiyou title<>name<>kakikominaiyou 見たいな感じ記録して 読み込みは open(LOG,"$logname"); @log = <LOG>; for($i=0;$i<@log;$i++){ } なのですが、 @log = <LOG>のところで一行づつ読み込めてないようなのですが どこに原因があるのでしょうか?お願いします。
>>17 まず open(ABC, ">") じゃなくて open(ABC, "+<") に変えるべき。
>>35 >>37 >>39 ヒント : $log = <LOG>; print $log; ってやったらどんな文字列が出る?
お願いします。
がらくたBOOKさんの「SiteHistory」を改造中です。
ttp://tinkle.cside.com/book/cgi/cgi.htm 項目をがらりと変えたのですが、どうもうまくいきません。修正しようとすると、一番上の行のカウンターだけ残して全ログが消えてしまいます。
とりあえず、修正サブルーチンは以下の通りです。
---------------------
sub edit3 {
if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }
# ログファイル読み込み
open (FILE, "$data") || &error("ファイルが開けません");
@data = <FILE>;
close(FILE);
# カウント退避
$count = shift (@data);
foreach $line (@data) {
($no,$coview,$name,$tel,$genre,$floor,$all,$fday_i,$sday_i) = split(/<>/,$line);
chomp;
if ($no eq $in{'edit_no'}){
$line = "$no<>$in{'coview'}<>$in{'name'}<>$in{'tel'}<>$in{'genre'}<>$in{'floor'}<>$in{'all'}<>$in{'fday_i'}<>$in{'sday_i'}<>\n";
}else {$line = "$no<>$coview<>$name<>$tel<>$genre<>$floor<>$all<>$fday_i<>$sday_i<>\n"; }
push(@new,$line);
}
# ログを更新
unshift(@renew,"$count");
open(OUT,">$data") || &error("削除処理を失敗しました");
print OUT @renew;
close(OUT);
&admin;}
-----------
どこが間違っているのでしょう?
それを丸投げって言うんだよ
思考を放棄したら人としておしまいですよ
44 :
39 :2005/05/26(木) 18:44:15 ID:7fGLJWg9
>>40 レスありがとうございます。
試してみたところ
書込み内容の改行のところで一行と扱われてしまっているようです。
なにかいい方法はないのでしょうか?
わかりやすく言うと
title<>name<>書込み内容の改行
書込み内容の途中
title<>name<>書込み内容
上記のように出力されてしまいます。
>>44 ログの改行コードの扱いを整理した方が良いと思う。
その掲示板の CGI やエディタや ftp クライアントなどが、
それぞれどんな改行コードを想定しているかとか改行コードを変換したりしてないかとか、
そういうあたりを。
>>44 つまり、ログに保存するとき、例えば、
my $str = "その書き込み内容の改行";
$str =~ s/\r?\n/<br>/g;
とかで改行タグを無くしなさい。
1行ごとにログ保存してる掲示板とかならみんなやってることだぞ。
47 :
nobodyさん :2005/05/26(木) 20:33:06 ID:3LXc6fmj
自サイト内アイテムを検索する場合の 検索システムのルーチンについて質問です。 1.検索結果と同じ数の変数を作り、 検索結果をその変数に格納する ↓ 2.1〜50件、または51〜100件までと表示する際、 1の変数から取り出して表示する という考え方で合ってますでしょうか。
48 :
35 :2005/05/26(木) 21:40:41 ID:4tEZgW2V
>40 すみません、どうして>37と書かれているのかわかりません >37に書いてある事の意味は何となく理解できますが 難しすぎて応用の域に達しませんでした…。
>>48 >>40 > こんな風に無理矢理別の変数に突っ込んでみようとしましたが
> $array[$index]=$mem;
> $memには何も記録されませんでした。
>>37 > 左辺と右辺を書きまちごうたけど
【ゴールデンレス】 ∩ ・∀・)∩∩ ´∀`)∩ このレスを見た人はコピペでもいいので 〉 _ノ 〉 _ノ10分以内に3つのスレへ貼り付けてください。 ノ ノ ノ ノ ノ ノそうすれば14日後好きな人から告白されるわ宝くじは当たるわ し´(_) し´(_) 出世しまくるわ体の悪い所全部治るわでえらい事です
52 :
35 :2005/05/26(木) 23:12:36 ID:Q34ppmGc
>49 >36を一生懸命よんでまっすたごめんなさい…できました ところで、>35に付け加える感じなんですが $tmp01 = "シュウマイ"; $tmp02 = "餃子"; $tmp03 = "食いてぇ〜"; @array = (01,02,03); $index = rand @array; my $mem = $array[$index]; これで、$tmp.$memのようにして print "$tmp.$mem"\n"; $tmp01〜$tmp03の中身(シュウマイとか)を表示させたいんですが やっぱりうまく行きません……どうしたらいいでしょうか?
>>52 $tmp01 = "シュウマイ";
$tmp02 = "餃子";
$tmp03 = "食いてぇ〜";
@array = ('01','02','03');
$index = rand @array;
my $mem = $array[$index];
print "${tmp.$mem}\n";
>>53 @array = qw"シュウマイ 餃子 食いてぇ〜";
print "$array[rand@array]\n";
55 :
53 :2005/05/27(金) 04:39:59 ID:OuNiDnY3
レスありがとうございます、いろいろなやりかたがあるのですね。 表示ができました。 それと、どうしても詰まってしまったんですが スクリプト上で、${tmp.$mem}を$tmp01〜$tmp03と認識させて、 以降の処理に使いたい場合はどうすれば良いのでしょうか? $tmp01 = "0"; $tmp02 = "0"; $tmp03 = "0"; @array = ('01','02','03'); $index = rand @array; my $mem = $array[$index]; ${tmp.$mem} = 1; #$tmp01〜$tmp03に1を代入したい printで表示させた時はうまくいったのですが、スクリプト上だと ${tmp.$mem}を$tmp01〜$tmp03そのものとは認識してくれなくて、ここで止まってます ${tmp.$mem}の結果を該当する$tmp01〜$tmp03にすり替えるには…?
56 :
53 :2005/05/27(金) 05:03:41 ID:???
勘違いしてました、できますよねちょっと寝てきます ぎゃぼー
$tmp01〜$tmp03 を @tmp に変えれば use strict 下でも動いていろいろ楽だろうに。 何事も考え方一つだ! ・・・対位法でも学んでおくかい?
こんな書き方も出来るけど、お勧めできない。 my $tmp01 = "シュウマイ"; my $tmp02 = "餃子"; my $tmp03 = "食いてぇ〜"; my @array = \($tmp01, $tmp02, $tmp03); my $index = rand @array; my $mem = ${$array[$index]}; print "$mem\n"; いつも思うのけど、なぜ配列を使うのを嫌うのだろう。
>>38 レスありがとうございます。
>fileを指定できると他人のパソコンのファイルが勝手に引き出せるので無理
なるほど、そういう事なのですか。。。そう言われればそうですよね。
>アップファイルをサーバにテンポラリとして保存しておき確認OKならそのファイルを使うようにする。
>ただ確認画面で処理をやめられた場合にテンポラリファイルがゴミとして残るのでガベージコレクションみたいな処理が必要。
やはり最初のsubmitで送信してしまわないといけないのですね。。。
ご指摘の通り、確認画面でやめられた時の「ゴミ」が気になっていたので
なんとか確認ページからのアップロード処理を出来ないものかと思っていました。
とりあえず、疑問はなくなりスッキリしました。
ありがとうございます!
use vars qw($A $B); ↑このvarsてのは何なのですか? 後qwとかqqとかもありますが、それについての詳細もお伺いしたいのですが
そうやってひとつひとつここで聞いていくつもりか?
>>63 最低限、
>>1 くらい読みなさい。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません
66 :
53 :2005/05/27(金) 15:55:26 ID:???
>57 $tmp01〜$tmp03を@tmp('$tmp01','$tmp02','$tmp03')とまとめるという事でしょうか? 実は$tmpの01〜03以外にも、別の変数$soc01〜03があって $tmp01の内容が$soc01に、$tmp02が$soc02に(以下略)… 対応している、という仕組みになってます なので、数字だけ出して割り振ろうと考えてました。 配列を使うのを嫌うというか、有効な使い方がまだよくわからんとです…。 見てると多分効率悪いんでしょうね、ネットで調べながらやってるんですが応用は難しいです、 あ、>60は自分じゃないです
>>66 こう使うって意味だと思う
@tmp = ("シュウマイ", "餃子", "ラーメン");
#$tmp[0] = "シュウマイ";
#$tmp[1] = "餃子";
#$tmp[2]= "食いてぇ〜";
@soc = (100, 200, 300);
$count = @tmp;
$index = int(rand $count);
print "$tmp[$index] $soc[$index]円";
>>66 > 数字だけ出して割り振ろうと〜
余計配列とかのが適してない?
ハッシュ(連想配列)でもいいかもしれない。
my $tmp01 = 'シュウマイ';
my $tmp02 = '餃子';
my $soc01 = 100:
my $soc02 = 200:
ってやるより、
my %menu = (
'シュウマイ', => 100,
'餃子' => 200,
);
とかやった芳がわかりやすいと思わないかい?。
ごめんちょっとtypoってるわ
個人的には my @db = ( {name=>'シュウマイ',price=>100}, {name=>'餃子',price=>200} ); ってやるのが好き Template Toolkit にもそのまま貼りつけられて楽だし
72 :
53 :2005/05/27(金) 18:10:05 ID:???
>68 この例でようやく直感的に理解できました、そうですよね変数をしまっておけるんですよね 正直な所、配列の本当の便利さがよくわかってませんでした、すごい便利なんですね、恥ずかしい 配列もちゃんと理解してなかったのにアレですが、>69のハッシュは使えそうだなと思ってました ただ、要素をランダムに選び取るというのがどうやったらいいのか全くわからなくて 今までここでお世話なった分で何とか$tmpを取り出す所まではできたんですが、 @array = ('01', '02','03',); $index= rand @array; my $sed=$array[$index]; %hash = ($tmp01=>$soc01, $tmp02=>$soc02, $tmp03=>$soc03,); %hash_value = reverse %hash; print $hash_value{${soc.$tmp}}; $socの中身を一緒に取り出すというのができませんでした。 (eachだと1つではなく、全部取り出してしまいますよね?) 下2行のvalueの所をkeyに、socをtmpに変えても何も出てこない… reverse関数で何故こういう結果が出るのかも実はよくわかりません……
73 :
53 :2005/05/27(金) 18:11:34 ID:???
>71のは…なんか…なんか……なんかすごいですね よくわかりませんがすげえー そんなやり方もあるのか!
>>72 それだとすごく
>>68 と
>>69 意味ないなw
どうしてもその 01, 02, 03, ってのは必要なの?
0, 1, 2, じゃだめなの?
どうしても 01, 02, 03 にしたいなら、こう書くのは?
my %hash = (
'01' => { tmp => $tmp1, soc => $soc1 },
'02' => { tmp => $tmp2, soc => $soc2 },
'03' => { tmp => $tmp3, soc => $soc3 },
);
my @key = keys %hash; # ex) 01, 02, 03
my $index = rand @key # ex) 1
my $sed = $key[$index]; # ex) 02
my $r = $hash{$sed}; # ex) { tmp => $tmp2, soc => $soc2 }
print $r->{tmp}; # $tmp2
print $r->{soc}; # $soc2
1行1行やるのはまわりくどいけどとりあえず。
75 :
53 :2005/05/27(金) 20:10:30 ID:???
>73 ですよね…生かせてないなと思いつつ、どうしたらいいもんか思いつきませんでした…。 >0, 1, 2, じゃだめなの? 全然だめじゃないです。ファイルの名前つける時のクセで0つけてました '01' => { tmp => $tmp1, soc => $soc1 }, あの、無知で恥ずかしいんですがこれってどうなってるんでしょうか? 01〜03がキーで{}の中身が値、{}の中で値が二種類ある、という状態でしょうか。 >71のも見て「?」ってなったんですが、ハッシュってキー1つに対して 値1つを格納しておく物だと思ってたんですが…1:1じゃない場合もあるという事 ?? まずは>73で教えてもらったので勉強してもちょっと頑張ってみます。
76 :
nobodyさん :2005/05/27(金) 20:49:21 ID:C4o5Scf8
>>40 >>17 ですが、遅レスですいません。
データ項目に点数という項目があり、データが追加される度に点数の降順に並べ替えて書き込みを
行っています。こういった場合でもopen(ABC, ">") を使わない方法はありますでしょうか?
パンチ5分の2は元気かな
78 :
nobodyさん :2005/05/27(金) 20:56:48 ID:C4o5Scf8
よろしくお願いします。 a.cgiからb.cgiを呼び出すときに、引数を渡したいのですが、 以下のような渡し方では根本的に間違っているのでしょうか? 【a.cgi側】 print "<FORM METHOD=\"POST\" ACTION=\"b.cgi?x=1>\n"; 【b.cgi側】 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; } としているのですが、$value にはなにも入っていませんでした。
>>75 @array = (
{tmp=>'シュウマイ',soc=>100},
{tmp=>'餃子',soc=>200},
{tmp=>'ラーメン',soc=>500},
{tmp=>'チャーハン',soc=>400},
{tmp=>'半熟卵',soc=>50},
);
%hash = %{$array[rand@array]};
print "$hash{tmp}\t$hash{soc}\n";
>>79 こんなプログラム作ってみた。
%menu = (
'シュウマイ' => {soc=>100},
'餃子' => {soc=>200},
'ラーメン', => {soc=>500},
'チャーハン' => {soc=>400},
'半熟卵' => {soc=>50},
'チャーシュー' => {soc=>100},
'ライス' => {soc=>150},
'チャーシューメン' => ['ラーメン','チャーシュー','半熟卵'],
'ラーメンセット'=> ['ラーメン','ライス','半熟卵'],
'チャーシューメンセット' => ['チャーシューメン','ライス'],
'チャーハンセット' => ['ラーメン','チャーハン','半熟卵'],
'シュウマイセット' => ['ラーメンセット','シュウマイ'],
'餃子セット' => ['ラーメンセット','餃子'],
);
@menu = keys %menu; %hash = sub{menu=>$_[1],$_[0]->(@_)}->(sub{ my $code = shift; my $key = shift; if(ref $menu{$key} eq 'HASH'){ return(tmp=>$key,soc=>$menu{$key}{soc}); }elsif(ref $menu{$key} eq 'ARRAY'){ my @tmp; my $soc; foreach my $key(@{$menu{$key}}){ my %hash = $code->($code,$key); push @tmp, $hash{tmp}; $soc += $hash{soc}; } return(tmp=>join(":",@tmp),soc=>$soc); }else{ return(tmp=>'',soc=>0); } },$menu[rand@menu]); print "$hash{menu}\t[$hash{tmp}]\t$hash{soc}\n";
>>78 ヒント : action="b.cgi?x=1" の x=1 は $ENV{'QUERY_STRING'} に記録される。
>>75 0, 1, 2 、どっちでもいいなら
>>71 および
>>79 の方法にしとくのが一番いいかと。
まあ、
>>79 はわざわざ %hash にしなくても、別に無名ハッシュのままでいいじゃん、とは思うけどな。
%hash = %{$array[rand@array]};
print "$hash{tmp}\t$hash{soc}\n";
↓
$hash = $array[ rand @array ];
print "$hash->{tmp} \t $hash->{soc} \n";
矢印演算子、覚えればいろいろベンリだぞ。
>>80-81 は・・・まあ好みで
>矢印演算子、覚えればいろいろベンリだぞ。 何か違くね?
・・・エ、何が?(:´д`) arrow operator ?
>>85 >>83 の一文だと、矢印演算子が万能みたいだって言いたいんじゃね?
そもそも
>>75 はリファレンスを知らなさそうだし
リファレンスをデリファレンスするのに
矢印演算子が使えるよってのが適切ではないかと
便利なのは「矢印演算子」じゃなくて「リファレンス」だろ。 矢印演算子を全く使わなくてもデリファレンスやメソッドコールはできるからな。
>>86-87 ああ、そうだね。 リファレンス。
それはわかるけど、でも
>>83 のは
>>79 に対して言ったんだけどなw
> %hash = %{$array[rand@array]};。
せっかくリファレンス使ってるのに、わざわざそんなくどい書きかたしなくても、って。
矢印知ってたら楽に書けるのになーと。
まあ誤解生ましたようで正直スマンかった。
ああ、全然関係無い話ね。紛らわしい。
90 :
75 :2005/05/28(土) 12:47:52 ID:???
矢印演算子とリファレンス、ググって調べてみました。 >75の疑問がすんなり解決しました… 多次元配列って訳がわからなくて今まで無視してました 何か色々とお世話になってしまって、すごく助かりました いただいたレスのスクリプトや内容を把握しきれてない部分が多いので、 名無しに戻ってまた勉強してきます。目が回りそうです。 もしまた詰まったら助けたって下さい〜このスレの人皆やさしい!幸あれ!ほんとありがとう!
91 :
nobodyさん :2005/05/28(土) 13:44:25 ID:mN70gA2+
92 :
nobodyさん :2005/05/28(土) 19:21:59 ID:/z95VPw7
クエリを使用してマルチバイト文字を入力する為、以下のコードを作成しました。 >> test.cgi #!/usr/bin/perl #cgiはEUCで記述 require './jcode.pl'; print <<'END_OF_HEADER'; Content-type: text/html; charset=EUC-JP <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=euc-jp"></HEAD><BODY> END_OF_HEADER $query = $ENV{'QUERY_STRING'}; #クエリ文字列を得る print &jcode'getcode(\$query); #入力されたクエリの文字コード &jcode'convert(*query, 'euc'); #EUCに変換 print ' to ', &jcode'getcode(\$query), '<BR>'; #変換されたことを確認 print '<A HREF="test.cgi?', $query, '">', $query, '</A>'; # 文字化け発生部分 print <<'END_OF_FOOTER'; </BODY></HTML> END_OF_FOOTER << 3: 半角文字及び、一部の全角文字(あいうえお、アイウエオ 等)では成功。しかし、一部の全角文字(まみむめも、マミムメモ 等)で、文字化けを起こします。 マルチバイト文字の2バイト目が悪さをすると思ってEUCにしたんですが、このコードでは処理が不完全なようです。問題部分の指摘をどうぞよろしくお願いいたします。
Jcode.pmとかEncode.pmは使えないの?
どこでURL unescapeしてんだ?
"文字化け"っつーか・・・ $query =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; とかしてないけど平気なのか?
かぶった orz
97 :
926 :2005/05/28(土) 21:08:01 ID:???
とりあえずIEに「
http:// 〜/test.cgi?マミムメモ」とダイレクトに入力しちゃってる段階なので、
URLデコードは考えてません・・・。
98 :
92 :2005/05/28(土) 21:13:29 ID:???
URLデコードを入れて、 test.cgi?%83%7d%83%7e%83%80%83%81%83%82 (マミムメモ)でやってみましたが、結果同様でした。 ちょっと舌足らずでした。最初に上記の様にアクセスした時はうまくいくのですが、 それで出てきたリンクを使って再帰的にアクセスした時に文字化けを起こします。
それは
http:// 〜/test.cgi?マミムメモ みたいなリンクを出力してるからなんじゃないの?
100 :
nobodyさん :2005/05/28(土) 22:59:52 ID:z135H4rk
if( @BUF==5 ){ … } if( scalar @BUF==5) { … } この二つの条件式の書き方で、下の方が良いとか上の方が良いと言うことはありますか?
好きな方を使え
103 :
nobodyさん :2005/05/29(日) 14:34:29 ID:I/a3Ab/R
初心者ですが、並び替えの基本を教えて下さい。 名前、点数、日付 A 80 20050529 B 100 20050523 C 70 20050525 D 80 20050524 というようなデータを点数の降順に並び替える場合はどうすれば良いのですか? リストにセットしてsortを使っても、点数での並び替えは出来ないですよね? 一度ハッシュというものに点数をkeyとしてセットし、keyで並び替えたりする のですか??でも同じ点数があった場合はまずいですよね? なんかアホな質問ですいません。標準的な並べ替え方法を教えて下さい。
104 :
nobodyさん :2005/05/29(日) 14:38:05 ID:I/a3Ab/R
>>103 です。
記述し忘れましたが、同点の場合は、できれば日付の降順にしたいです。
>>103 my @array = (
# 名前、点数、日付
['A',80, 20050529],
['B',100, 20050523],
['C',70, 20050525],
['D',80, 20050524],
);
my @sorted_array =
sort { $b->[2] <=> $a->[2] } # 日付で
sort { $b->[1] <=> $a->[1] } # 点数で
@array;
>>104 my @array = (
# 名前、点数、日付
['A',80, 20050529],
['B',100, 20050523],
['C',70, 20050525],
['D',80, 20050524],
['E',70, 20050526],
['F',80, 20050526],
['G',50, 20050526],
);
my @sorted_array = sort {
$b->[1] <=> $a->[1] || # 点数で
$b->[2] <=> $a->[2] # 日付で
}@array;
>>104 my @array = (
# 名前、点数、日付
{name=>'A',point=>80,date=>'2005/05/29'},
{name=>'B',point=>100,date=>'2005/05/23'},
{name=>'C',point=>70,date=>'2005/05/25'},
{name=>'D',point=>80,date=>'2005/05/24'},
{name=>'E',point=>70,date=>'2005/05/26'},
{name=>'F',point=>80,date=>'2005/05/26'},
{name=>'G',point=>50,date=>'2005/05/26'},
);
my @sorted_array = sort {
$b->{point} <=> $a->{point} || # 点数で
$b->{date} cmp $a->{date} # 日付で
} @array;
print map{"$_->{name}\t$_->{point}\t$_->{date}\n"}@sorted_array;
>>103 >>104 my %hash = (
# 名前、点数、日付
'A' => {point=>80,date=>'2005/05/29'},
'B' => {point=>100,date=>'2005/05/23'},
'C' => {point=>70,date=>'2005/05/25'},
'D' => {point=>80,date=>'2005/05/24'},
'E' => {point=>70,date=>'2005/05/26'},
'F' => {point=>80,date=>'2005/05/26'},
'G' => {point=>50,date=>'2005/05/26'},
);
my @sorted_keys = sort {
$hash{$b}{point} <=> $hash{$a}{point} || # 点数で
$hash{$b}{date} cmp $hash{$a}{date} # 日付で
} keys %hash;
print map{"$_\t$hash{$_}{point}\t$hash{$_}{date}\n"}@sorted_keys;
>>103 my @array = (
# 名前、点数、日付
[qw( A 80 20050529 )],
[qw( B 100 20050523 )],
[qw( C 70 20050525 )],
[qw( D 80 20050524 )],
);
my %hash = map{
$_->[0] => {
point => $_->[1],
date => $_->[2],
}
} @array;
my @sorted_keys = sort {
$hash{$b}{point} <=> $hash{$a}{point} || # 点数で
$hash{$b}{date} <=> $hash{$a}{date} # 日付で
} keys %hash;
print map{"$_\t$hash{$_}{point}\t$hash{$_}{date}\n"}@sorted_keys;
>>103 print map{
"$_->[0]\t$_->[1]\t$_->[2]\n"
} sort {
$b->[1] <=> $a->[1] ||
$b->[2] <=> $a->[2]
} map {
[
grep {
!/^\s*$/
} split /\s+/
]
}grep{
!/^\s*$/
} split /\n/, q(
A 80 20050529
B 100 20050523
C 70 20050525
D 80 20050524
);
111 :
nobodyさん :2005/05/29(日) 17:28:44 ID:w/eeChjM
112 :
nobodyさん :2005/05/29(日) 17:30:16 ID:w/eeChjM
>>111 そっくりそのまま落としてきて、subject.txtとして保存するんでもいいす。
むしろそれがしたいっす。
おながいします。
LWP
117 :
nobodyさん :2005/05/29(日) 18:35:04 ID:EsZHM8T2
>>111 >>116 はファイルに保存できないねすまん。
>>115 の真似はせず一つづつ展開してみた。
use LWP;
my $url = '
http://news19.2ch.net/newsplus/subject.txt '; #取得したいコンテンツのURLを指定
my $user_agent = 'HogeHoge-Agent'; #ユーザーエージェント名を指定
my $referer_url = '
http://hogehoge/ '; #参照元を指定
my $save_file = 'subject.txt'; #保存先のファイル名
my $ua = LWP::UserAgent->new(agent => $user_agent); #エージェントオブジェクトを作成
my $header =
HTTP::Headers- >new(Referer => $referer_url); #HTTPヘッダーオブジェクトを作成
my $request =
HTTP::Request- >new(GET => $url, $header); #HTTPリクエストオブジェクトを作成
my $respons = $ua->request($request); #サーバに接続してデータを取得
my $content = $respons->content(); #取得したコンテンツ内容を変数にコピー
open(FH,">$save_file"); #保存先ファイルを書込みモードでオープン
binmode FH; #保存形式をバイナリ形式に指定
print FH $content; #コンテンツ内容をファイルに保存
close(FH); #保存先ファイルを閉じる
120 :
nobodyさん :2005/05/29(日) 20:41:42 ID:QH9/XuV4
みなさんありがとうございます。ひとつひとつやってみます。
121 :
nobodyさん :2005/05/29(日) 22:00:45 ID:I/a3Ab/R
質問お願い致します。 @wk_list[0] と$value の共に数値、文字が混在している場合、 if( @wk_list[0] eq $value || @wk_list[0] == $value ){ と記述すると、数値同士の場合はうまくいきますが、文字の場合違う データと一致してしまいます。数値、文字が混在の場合の比較演算は どうすれば良いですか?
122 :
nobodyさん :2005/05/29(日) 22:23:47 ID:QH9/XuV4
>>121 Scalar::Utilのlooks_like_numberで数値かどうかは調べられるから、
両方が数値なら==、どっちかが数値でなけりゃeqでいいんでねーの?
124 :
nobodyさん :2005/05/30(月) 02:00:43 ID:sacYxvRr
>>122 さらに経過報告〜
できましたー
んが!
鯖がそのcgiに広告つけやがる。javascriptはきだすcgiなんで、んなことされたら
台無しなんですが…というわけで、鯖探し中。とにかく、
解決したっぽいです、ありがとー
昨日は回答がとても豪華だったみたいだなw
>>125 こういうのって設問から回答まで全部一人でやってたりすることってよくあるよね。
128 :
nobodyさん :2005/05/30(月) 16:13:42 ID:efT5hV/s
いわゆる自作自演って香具師?
かみいわゆるごっど
あれを全部一人で書いたんなら 乙。とだけ言っておこう ってか んなわけないやろw 普通そういう考えに至らない。自演常習者ならではの発想。
132 :
nobodyさん :2005/05/30(月) 19:01:53 ID:2nqscNNy
>>123 looks_like_number ってライブラリか何かですか?普通に使える関数でしょうか?
できれば使い方を教えてもらえないでしょうか?
>>132 「Scalar::Utilの」って言ってくれてるんだから、まずは自分で調べてみましょう。
perldoc Scalar::Util
くそっ、ばれたか!
135 :
nobodyさん :2005/05/30(月) 19:37:51 ID:2nqscNNy
>>133 私の素人用の本には載っていなくて、検索でなんとか
【@bool = DBI::looks_like_number(@array);リストの各要素について、数値に見え
ばTRUE、そうでなければFALSEを返します。未定義、あるいは空文字であれば、undef
もしくは空文字を返します。】
ってのは見つけたのですが、そもそもScalar::Utilってのがさっぱり分かりません。
素人考えで昨日から if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){
とか色々やってるんですが、もう疲れました。先生、そろそろ答えを。。
ちっ!さすがに質問まで自作自演じゃあなかったか。
137 :
nobodyさん :2005/05/30(月) 19:45:46 ID:Xh5clFyG
うざいやつら...
よくわからんが、(一時的に)数値も文字として比較しては駄目なのか?
139 :
nobodyさん :2005/05/30(月) 20:42:20 ID:2nqscNNy
>>138 比較対象データが、数値・文字混在で1000件ほどあって、比較元が
数値の場合は良いのですが、文字の場合、先に違うデータ(数値?)と
一致してしまうんです。
ん? @bool = DBI::looks_like_number(@array); なら if (DBI::looks_like_number($value)) は必ず真にならないか? wantarray でちゃんと 0 か 1 で返してくれてるのかな。 あと if( DBI::looks_like_number($value) && @wk_list[0] eq $value ){ の @wk_list[0] eq $value の部分 は、「数字の場合」、なんだから $wk_list[0] == $value になるのでわ。 同じかも知らんが一応。 つーか数字に見えるかどうかくらい、そのモジュール使わなくても自作でできると思うがw
それ使うと、$value が '123' か 123 か見分けられんの?
>>142 looks like number = 数値のように見える
'123'と123を見分けるにはPerlレベルでは無理だし、見分けても意味ない。
DBIにもlooks_like_number()はあるが、それだけのためならScalar::Utilの方を使うべきだろうな
$ENV{'TZ'} がないとき、サーバのタイムゾーンってどうやればわかるのかな? JST とか GMT とか EST とかそういうの。
perl -e 'print `date`, "\n";'
おお、見れた! thx! windows perl じゃ取れなかったけどw
>>146 タイムゾーン関係の設定ファイルがあるがlibcのバージョンや
OSの作法によっていろいろ違いがあり、ポータブルなのを自前
で書くのはたいへんなのでDateTime::TimeZoneモジュールを使
うのが楽だろう。
use DateTime::TimeZone;
use DateTime;
my $tz = DateTime::TimeZone->new(name => 'local');
print $tz->name, "\n";
my $dt = DateTime->now;
print $tz->short_name_for_datetime($dt), "\n";
use POSIXしてstrftimeの%Zという手もあるな。 use POSIX; print strftime "%Z", localtime;
うは いろいろ試してみたけど POSIX 軽く鬱るくらい便利だなw すげえ。
>>149 も ありー。
でも必要なモジュール多いし揃えても何故か動かなかったw スマン。
152 :
nobodyさん :2005/05/31(火) 11:03:00 ID:TIA+apXZ
ここでいいのかどうかわかりませんが… 習作でperlでライブラリ及びdbを使わずに(なるべく多くの環境で動くことを目標に) 2ch風の掲示板を作ろうとしています。 んで、排他処理について質問…というか意見を伺いたいです。 板(blist.dat)、スレ(tlist.dat)、書き込み(スレid.dat)があります。 権限を持っていれば、板とスレも作成/論理削除が可能で、 同時に更新される可能性があります。 数は板・スレッド共に、00〜ffまで持てる物とします。 排他処理はロックファイルのリネーム方式で行おうと考えています。 なるべく軽快に動かしたい為、必要な時に必要な所だけロックをかけようと思っており、 そういう意図で必要になるロックファイルは ・lock_blist(板一覧用) ・lock_tlist(スレッド一覧用) ・lock_スレッドid(個別スレッド用) となります。 これで組むと、ロックファイルが板の数*256個となり、最大で65536個になってしまうのですが、 これは設計としてアリ…というか必然なのでしょうか。それとも、ダメダメ(工夫の余地あり)なのでしょうか。 もちろんここに書き込む時点で多いなーという疑問を持っているのですが、 任意の一スレッドに書き込むたびに掲示板全体をロックするというのは、 それはそれで違うかなという気がしています。。 ご意見などありましたら、ご教授お願いします。
書き込むたびにスレ一覧も更新するんじゃないの? レス数とか
あ、、、、 そうか。。。 その通りでした…orz 何ではまってたんだろう…ありがとうございますorz
お願いします。 簡単なデータベースを動作させたいと思っています。 1つのページに2×4個データを表示させたいんです。 もちろんそれ以上の情報があれば次のページへと移動です。 この「2つ目で改行・8個目でページ終了、さらに次のページ移動やページ数を計算」 というものを勉強したいのですが、どこかに良いサイトや参考となるCGIはありませんか?
たくさんあるデータをページ単位にするのとそれをページ内で どう表示するかはわけて考えた方がいいだろうな。 前者は自分で作ってもいいが、Data::Pageとかそれっぽいのが CPANにあるから適当に探して気に入ったものがあれば使うのも いいだろう。次のページあるかないかとか、このページにある データはいくつかなんてのはもちろんよく考えれば簡単に計算 で求まるとはいえめんどうだからね。もし自分で書くとしても だらだらとスクリプトのあちこちでその場で計算しないで、 うまく手続きをまとめておくことをお勧めする。 後者はあんまり知らないのだがどうせ作るんならn×mで一般的 に作っておくと気がかわったときにいいかもしれん。 あとhtmlベタでスクリプトに埋め込むよりはTemplate Toolkit とか使った方がすっきりするよ。
157 :
nobodyさん :2005/05/31(火) 18:51:34 ID:md7jEE3a
PHPでいうincludeをperlでやるにはどうすればいいんですか?
ファイルのパーミッションを調べる方法はございますでしょうか。 statでは調べられないみたいですが、もしもございましたら ご教授いただきたい次第です。
ちゃんと stat のリストの中にあるよ。
161 :
157 :2005/05/31(火) 19:41:37 ID:???
>>158 ありがとうございます
早速やってみます!
>>160 勉強になりました。
有難うございました
モジュールの中を見てるみると require Exporter; require DynaLoader; @ISA = qw(Exporter DynaLoader); bootstrap なんか別のモジュール?; みたいな流れがよくあるんですが、 これって何をやっているんでしょう?
ExporterとDynaLoaderのマニュアル嫁
>>164 んー、Exporterのほうはぐぐってみても日本語化されたマニュアルが見つからないのです。
動的にモジュールをロード?しているっぽいんですかね。
これを使えば、引数からモジュール名を得て、インポートするモジュールを選べたりするのでしょうか。
>>165 ぐぐり方が悪すぎるんじゃ...
Exporterとperlをキーワードにして日本語のページを検索すると
普通に出てきますが...
>>163 Exporterはモジュールのシンボル(通常はサブルーチン)を呼び出し元に輸出するためのモジュール。
DynaLoaderはCなどで書かれた外部サブルーチン(XS)をロードするモジュール。
詳しいことはぐぐるなりマニュアル読むなりせよ。
オブジェクト指向でPurePerlなモジュールを書く分にはどちらも無関係。
168 :
nobodyさん :2005/06/01(水) 23:13:36 ID:4wa3Dv1b
すみません。sendmailを使ってメールを送る際に ファイルを添付することは出来ませんか?
>>168 できる。でもsendmailそのまま使ってあとは自分で作るのはお勧めしない。
search.cpan.orgでmailとかMIMEとかキーワードに検索するといろいろでて
くるのでなるべく利用するのが吉かと。
>>167 "PurePerl" って何?
その言い方から予想するとプラグマ以外の他のモジュール使わないで単独で動くモジュールってことかな。
DynaLoaderはXS専用じゃないよな。
>>170 PurePerlってのは他の言語で書いたライブラリに依存せず、Perlのみで書かれたコードのこと。
どんなモジュールを使っているかは関係ない。
標準ライブラリだと、CGI.pmはPurePerlで、POSIX.pmはPurePerlじゃない。
といってもそんな厳密なものではなく、例えばData::Dumperなんかはコンパイル済みライブラリがあれば
その(速い)ルーチン、無ければPurePerlルーチンを自動的に選択して使用する。
非PurePerlモジュールに依存したPurePerlモジュールをPurePerlというか否かも意見の分かれ目だな。
>>171 まあXSインターフェイスを使わなくてもDynaLoaderを使うことはあるわな。
ここでは単に「外部サブルーチン」という意味でXSとした。
>>172 おおなるほど!(゜∀゜) 勉強になったよありがとう!
my ($i, $j) = (0, 0); foreach (1 .. 10) { $i++; } continue { $j++; } print " ($i , $j) \n"; こういうコードを実行すると、結果が (10 , 10) ってなるんだけど、これはいいの?w (10 , 9) ってなってほしかったんだけど・・・ orz
>>174 どこからどう考えても (10,10) なのだが・・・。
foreach節の最後に last until $i < 10; とでも付け加えれば
最後の continue は実行されないが。
>>174 ラクダ3版の「4.4.3 foreachループ」の最後のあたりに
はっきりこのように書いてある。
while文と同様に、foreach文もcontinueブロックを持つことが
できる。continueブロックは、ループが普通に実行された場合
でも、nextが実行された場合でも、ループの各繰り返しの最後
に必ず実行される。
177 :
nobodyさん :2005/06/02(木) 20:09:01 ID:QYKowdcj
if(-e $saitama){ print $saitama; } すいません↑これって何をしてるんですか? -eで$saitamaが存在しているのかどうかを調べているんでしょうか
> -eで$saitamaが存在しているのかどうかを調べているんでしょうか 正解。
179 :
nobodyさん :2005/06/02(木) 20:15:16 ID:QYKowdcj
ありがとうございました
my %d; $text =~ s/\A([^\n]*)\n//s; $d{title} = $1; こんなのが出てきたんですけど、$1は、「上の正規表現『s/\A([^\n]*)\n//s』で一番最初にマッチングしたもの」であってますか?
182 :
nobodyさん :2005/06/02(木) 21:38:25 ID:U6HelXRG
すいません。教えて下さい。 名前 住所 電話 A氏 東京 1111111111 B氏 大阪 2222222222 C氏 愛知 3333333333 D氏 広島 4444444444 上記のようなデータファイルがあって、B氏だけの内容を変更したい時、 ファイルを出力用 ">" で開いて再度1レコードずつ書き込めばできる のですが、出力用で開くと一旦データが全て消えて危険性が高いので、 入出力両用 "+<" 等で開き、他のレコードは保持したまま、B氏のレ コードだけを書き換えるようなことは出来るのでしょうか?
レコードのサイズを固定長にする。
別ファイルに書いて、成功したらばrename
185 :
nobodyさん :2005/06/02(木) 22:00:22 ID:U6HelXRG
>>183 他にも項目があって固定長には出来ないのですが、固定長にすると
対象レコードのみ書き換えられるのでしょうか?
>>184 成功したかどうかはどう判断すれば良いでしょうか?
>>185 エラーが発生せずに、書き込み、クローズが完了したら成功。
もっと気にするなら、読み込んでベリファイ。
if (変更前のファイルサイズ - 変更前の変更行のサイズ == 変更後のファイルサイズ - 変更後の変更行のサイズ) { rename 〜 } とかな。 他にも方法はいくらもあるけど、上のもそうだがいちいち聞くな、自分で考えろと。
189 :
188 :2005/06/03(金) 07:13:27 ID:???
自己レス なんか全然別のつまらないところでミスっていただけでした…… 板汚しすみません……
190 :
nobodyさん :2005/06/03(金) 09:54:19 ID:lSpNwut+
超初心者でもわかるPHPの書籍探してるんですが、できれば、教えて頂きたいのですがよろしいでしょうか?
だめに決まってるでしょ。
PHPのスレが別にあるから、そっちで聞きなさい
193 :
nobodyさん :2005/06/03(金) 16:31:13 ID:p0YkzVQc
sub lengthw { local $_ = shift; -(tr/\x00-\x7f//)+2*length } ↑これはどんなことをしてるんでしょうか lengthwは if((lengthw $x) < 50){} のような使い方をしているみたいですが どなたか分かる方がおりましたら解説希望です。
if ( (文字列 $x のバイト数 x 2) - ($x の中のアスキー文字の数) > 50 ) { } なにがしたいのかはよくわからん。
不等号逆だー orz
>>194 $_がunicode文字列でbytesプラグマの影響範囲内でなければ
lengthはバイト数じゃなくて文字数だな。
もしそうならアスキーの範囲は1,それ以外は2で文字幅を
数えてるような気がする。
条件が示されてないのでなんともいえんが。
197 :
193 :2005/06/03(金) 18:27:26 ID:p0YkzVQc
>>194-196 お答えありがとうございました!
というか
local $_ = shift;#←これがよく分かってないんです。
-(tr/\x00-\x7f//)+2*length #←これは_$が略されてるのは想像つくんですが。。
>>196 結局見てみないとわからんねw
>>197 local $_ = shift;
↓=
local $_ = shift @_;
OK?
199 :
193 :2005/06/03(金) 18:52:05 ID:p0YkzVQc
うはー「@_」が略されてたんですね。 わけ分かりませんでした。ありがとうございました! ちなみにbytesプラグマの影響範囲内ではありません。
perlって略すような書き方が多いから、解析するのに苦労するよね。 use Time::Local とか意味分かんないし
use Time::Local のどこが意味分かんないの?
use Time::Local って「Timeと言うクラスのLocalって関数を使えるようにしますよ」って意味でいいのかな?
うーむ、略すような書き方とか解析するとか以前に、 それは単に君が勉強が足りてないだけのような気が。
use Time::Local; ↓= BEGIN { require 'Time::Local.pm'; import Time::Local; } アンダースタンンドゥッ!?
BEGINって何ですか?
Time::Localでどんなことが出来るようになるの?
それぐらいぐぐれ。調べれば分かることを聞くスレじゃない。
ぱーるどくれ!しーぱんれ!
212 :
nobodyさん :2005/06/03(金) 21:38:29 ID:p0YkzVQc
$a = $x if ($x !~ /[$kw]$/ or $rest !~ /^[$kw]/) and ($rest !~ /^[$kt]/ and $x =~ /[$kk]$/) こんなのが出てきましたけど、私にはチンプンカンプンです。 これだけで申し訳ないのですが、↑が分かる人がいましたら、解説願います。
おいおい、片っ端から質問していくつもりかよ・・・?
( ゚Д゚)…
ファイルサイズの単位をバイトからメガバイトにして小数点第三位以下を切捨てするにはどうすればよいですか? たとえば12345678を11.77にしたいです。
my $chinko = 12345678; my $manko = 100; print int($chinko / (1024 * 1024) * $manko) / $manko;
ありがとう!
printf "%.2f",12345678/1024/1024;
それ切り捨てじゃないし
変数名なんとかしろよw
質問があります。 ↓のような場合で、 for($i=0;$i<=10;$i++){ $po[$i] .= int(rand(6)); } これはあくまで例なのですが、似たような場合などでも、 randで選ばれる数字が同じものが続けて入ってしまう事が良くあるのですが、 これをもっとばらけさせたいのですが、何か方法があるのでしょうか? 上手く説明できずにすみませんが何卒よろしくお願いします。
>>224 0〜5までの数字から完全にランダムに選んだ場合、
直前と同じ数字になる確率は1/6もあるわけで、
10回も続けてやれば一度でも同じになる確率は
8割以上だからまあ当たり前だろうな...
同じ数字が続くのがいやならひとつ前の数字を
保存して同じ数字にならないように細工すりゃ
いいんじゃねーの。
お手軽コース:
同じ数字の間はやり直す
少し考えたコース:
0〜4までの乱数を求めて、前の数字と等しいか
大きければ1を加える。
>>224 コード書いてみたがね。
同じ数字が並びそうなら振りなおすなも。
my @numbers;
my $last = $num = -1;
for(my $i = 0; $i <= 10; $i++){
$num = int(rand(6)) while($last == $num);
$numbers[$i] = $last = $num;
}
print @numbers;
# 11回振ってるようだが、いいんきゃーも?
WindowsのMySQL+DBIの使い方で困ってます。詳しい方、教えてくれないでしょうか。 下のテーブルをセレクトしたいだけなんですが、mysqlのコマンド上ではちゃんと表示される日本語がPerlで出力させるとクエスチョンマークで表示されてしまいます。 ↓こういう風に表示させたい。 >2005-06-05 17:27:47<>0<>ニュースタイトル!< >2005-06-05 17:27:48<>0<>news title!< ↓こういう風になってしまう。 >2005-06-05 17:27:47<>0<>?????????< >2005-06-05 17:27:48<>0<>news title!< どうやったら日本語を出力できるんでしょうか。どなたかご教授お願いします。m(__)m ◆ソース(perl v5.8.6) $dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0}); $datasp = $dbh->selectall_arrayref(q{ SELECT * FROM NEWS }); for($n = 0; $n < scalar(@$datasp); $n++){ printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]); }
上の続き・・・ ◆テーブル | NEWS_DATE | NEWS_IMPORTANCE | NEWS_TITLE | | 2005-06-05 17:27:47 | 0 | ニュースタイトル! | | 2005-06-05 17:27:48 | 0 | news title! | ◆DBステータス mysql Ver 14.7 Distrib 4.1.12a, for Win32 (ia32) Connection id: 1 Current database: testdb Current user: root@localhost SSL: Not in use Using delimiter: ; Server version: 4.1.12a-nt Protocol version: 10 Connection: localhost via TCP/IP Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis
229 :
nobodyさん :2005/06/05(日) 19:01:00 ID:??? BE:3921449-#
前回と同じ値だからといって再度乱数を発生させると、ループがかさばる可能性もあるですよ。 my @dice_seed = (1..6); my @dice_rand; for(reverse (0..$#dice)){ push @dice_rand, splice @dice_seed, rand $_, 1; } みたいな。。。
231 :
227 :2005/06/05(日) 20:35:05 ID:???
>>230 ログイン直後に SET NAMES sjis を追加したらできました!
ありがとう!!!
もう、perlあきらめてphpで開発しようかと思ってたら
phpでも同じだったんですね・・・
◆ソース(変更後)
$dbh = DBI->connect("DBI:mysql:$dbname", $dbuser, $dbpass, {PrintError => 0, RaiseError => 0, AutoCommit => 0});
$dbh->do('SET NAMES sjis'); # ←追加
$datasp = $dbh->selectall_arrayref(q{
SELECT * FROM NEWS
});
for($n = 0; $n < scalar(@$datasp); $n++){
printf(">%s<>%s<>%s<\n",$datasp->[$n][0], $datasp->[$n][1], $datasp->[$n][2]);
}
はじめまして、よろしくお願いします。
1: HTMLを取得して例えば
<A href="
http://www.**.co.jp/~sample/image/a.jpg ">
<A href="image/a.jpg">
<A href=
http://www.**.co.jp/~sample/image/a.jpg >
<A href=image/a.jpg>
とあるものをすべて
<A href="
http://www.**.co.jp/~sample/image/a.jpg ">
に統一したい。
2:
$url = $ENV{'QUERY_STRING'};
$url =~ s/$0//gi;
$surl = $url;
if($surl !~ /\/$/){$surl =~s/(.*)\/.*/$1\//i;}
use LWP::Simple;
$html = get $url;
&jcode'convert(*html,'sjis');
#携帯で見れるようにしたいのでテーブル等不要と思われるものを削除
#出来ればここも1行に統一できればうれしいです
$html =~ s/<(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
$html =~ s/<\/(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
3: 相対パスと絶対パスの相互の方法がまったく思い浮かばずにいます
これぐらいでよろしいのでしょうか。よろしくお願いいたします。
>232
>これぐらいでよろしいのでしょうか。
もう少しやりたいことと何が問題なのかを整理して書いてくれ。
1と3って同じことだと思っていいのか?
とりあえず hoge/./ を取り除いたりまではしてない。
my $server = '
http://www.example.com '; # サーバのところまで
my $base = '
http://www.example.com/~sample/ '; # 相対パス起点
sub absolute($)
{
my $str = shift;
$str =~ s/^"//;
$str =~ s/"$//;
if($str =~ m,^/,) {
return qq("$server$str");
} elsif($str =~ m,^
http://, ) {
return qq("$str");
} else {
return qq("$base$str");
}
}
$target =~ s,(<A[^>]*\s+href=)("[^"]*"|\S*)([^>]*>),$1.absolute($2).$3,eigm;
2: まとめればいいんだな?
$html =~ s/<\/?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt).*?>//gi;
個人的には
$html =~ s,</?(?:TABLE|TD|TR|TH|script|TBODY|font|B|U|I|center|form|dl|dt)[^>]*>,,gi;
の方が好きだな。
>233 $target =~ は $html =~ だと思ってくれ。
>232
度々申し訳ない。
>>1 のテンプレ?に合わせようとしてたんだな。
でもやっぱり何が問題なのか、どこがポイントなのかを整理して欲しいとは思う。
236 :
nobodyさん :2005/06/06(月) 14:15:56 ID:nLjgLi0T
質問させてください。 flockを使わずにflockと同じ動作する方法って、ありますか?
そうさなあ。あれは何年前のことじゃったか…。
なにもかも、懐かしい思い出じゃった…
本当になつかしい
241 :
nobodyさん :2005/06/06(月) 23:52:50 ID:7fi2eBpp
実行ボタンクリックすると、フォーム内のデータをファイルに書き込むと言う 多分超簡単なものを作ってます。 ファイルをオープン後 $buff=<DAT>; @buff=<DAT>; としました。 これは、データの1行目と全てのデータを表示させたかったからなのですが どうやら上記のように書くと@buffには、$buffを除いたものしか入ってこないようです。 簡単に、データの1行目、1行目を含む全データを格納したいのですが どうしたらいいでしょうか。
@buff=<DAT>; $buff=$buff[0];
243 :
241 :2005/06/07(火) 00:07:20 ID:???
>>242 なるへそ…出来ました!
アザース!!!
>>233 できました、ありがとうございます
整理できていなくてすいませんでした
いまさらですが整理というか用途を書きますと
携帯からこのcgiにアクセスし、
****.cgi?
http://www.abc.*.jp/ と言う形でみたいページのアドレスを指定します
指定されたアドレスをcgiで取得し、テーブルなどの携帯では不要なタグを切り捨てます
次に、アンカー?<A〜タグにあるhrefにこのcgiをかえすように、
href=****.cgi?リンク先
と言うようにかえたいので、hrefのぶぶは絶対パスに統一する必要があるのですがこの方法が分からずにいました
あともう一つ間違えてたら分かればでいいので教えていただきたいのですが、
>>232 のソース+
>>233 パスを統一するソースのみのソースで何故かbodyタグまで消されるのですが、理由分かりますでしょうか
正規表現の中に |B| があるから Bで始まるものタグが消されてるんじゃね? Blockquote とか UL とかも消されてるはず。 もうちょっと正規表現考えた方が良かったね。 プ
>>245 たしかに…
気づきませんでした
ありがとうございます
質問です。 ↓これだけの文章だと、"newdir"というフォルダがなければ、作るまで永遠に繰り返すってことになりますかね? while (!mkdir("newdir", 0755)) { }
サーバークラッシュさせたいってこと?
↓こうやらないと、フォルダが作られたら、ループが終わっちゃうんでは? while (!mkdir("newdir", 0755)) { rmdir("newdir"); }
>>249 「作るまで永遠に繰り返す」だから作ったら終わっていいんじゃない?
>>247-250 これってどこでフォルダが作られてるの?
while(この部分)←この部分でフォルダが作られる?!
Yes. mkdir は フォルダを新しく作ったら 1、失敗した場合は 0 を返す。 なので、もし既にnewdirフォルダが存在していた場合、無限ループになるわけで。
で、なんの役に立つんだ、ソレ、、、
255 :
◆wSkAcTBWJw :2005/06/07(火) 17:50:20 ID:Jzx4SwvB
質問です。 \%hogehoge と記述した場合、どのような意味を成すのでしょうか? 具体的には↓のような文章なのですが、 return \%hogehoge if (rename($hogehoge{path}, $hogehoge{cureer})); ifの中が真(renameに成功)の場合は\%hogehogeの中に何かを入れているのでしょうけども、 よく分かりません。どなたか教えてください。
リファレンスで調べよ
横から補足。 「perl リファレンス」でぐぐれって事な
renameに成功した場合は hogehoge{path}を戻り値がリファレンスとして返される。
あ、違う renameに成功した場合は $hogehoge{cureer}を戻り値とし、リファレンスとして返される。
>>255 > \%hogehogeの中に何かを入れているのでしょうけども、
何も入れてないでしょ。
renameに成功したら、return \%hogehoge を実行してるだけ
とにかくリファレンスを理解しろ。話はそれからだ。 つーかそれからの話などそれで消えてなくなる。
>>262 何か勘違いしてるのでしょう。ほっとけば気づくのでは。
264 :
nobodyさん :2005/06/07(火) 20:33:44 ID:B1nXEBrs
open(FILE, "+>$file"); $xx = <FILE>; $xx++; print FILE $offCount; close(FILE); ファイルから値とって、1増やして上書きしたいんですけど、上の通りにしてもできないんです。 $fileの初期値を1にして、上の通り実行すると、$fileが空っぽになる open(FILE, "+<$file"); $xx = <FILE>; $xx++; print FILE $offCount; close(FILE); こんな感じで追加書き込みモードにすると、うまく行くので、変数にはちゃんと値が入ってるみたいです。 ご指摘お願いします。
>>264 下のでできたならいいじゃん。
$offCount ってなんだよ。
+> はまず最初にファイルを真っ白にするんだが。
cgi(perl)で書くHTMLについて質問させてください。 @hoge という配列に適当な文字列を複数pushして、 <textarea>@hoge</textarea>とすると、テキストエリア内で各要素の間に半角スペースが入ってしまいます。 簡単にこの半角スペースを消す方法や、別の楽な書き方はないでしょうか? foreachで書いていくのが妥当でしょうか?
267 :
nobodyさん :2005/06/07(火) 22:01:43 ID:B1nXEBrs
>>265 すいません、$offCount は $xx と脳内変換しといてください・・・
追加書き込みモードじゃなくて、上書きしたいんですができます?
そういや mod_perl 使うと $\ とか $, が効かなくなるのはどうにかならんのかな。
>>267 seek truncate tell とかで検索しとけ。
>>268-270 ありがとうございます。$"=undef; とするとかなり簡潔になりました。
273 :
nobodyさん :2005/06/08(水) 02:11:43 ID:3Bw2MIjp
>>272 俺も若い頃 print FILE "@log"; とか書いてスペース入るのが困って foreach (@log) { print FILE $_; } とか書いてた甘酸っぱい記憶を思い出したよ・・・ orz
>>275 建前上は環境依存するものなのでFcntl使っとけ。
いちいちいくつになってるか調べたりこの環境では
OKか気にするのは無駄。
>>276 ありがとうございます。
やはり環境依存する可能性があるものなんですね。。
迷うorz
278 :
nobodyさん :2005/06/08(水) 18:09:13 ID:iGltiuvK
foreachの使い方についてご質問させてください 配列の要素をすべてではなく一部飛び飛びで 取り出したいのです。 $count = @DATA_N; foreach (5..$count) { 処理 } とすれば5番めの項目から最後までと言うことらしいのですが では1番目と5番目以降というように いくつか項目を飛ばして取り出すには どのようにすればいいのでしょうか? よろしくお願いいたします。
foreach (1, 5..10, 15..$count) つーか配列の "5番目の項目" の添え字は [4] なのは理解してるよね? 一応釘
280 :
nobodyさん :2005/06/08(水) 18:47:04 ID:iGltiuvK
ありがとうございます >添え字は [4] なのは理解してるよね? 一応釘 はい[0]から始まると言うことは理解しております:汗 そうですね「,」で区切ればいいのですね。 「..」は「から〜まで」と言う風に理解すればいいのですね! 勉強になりました。 ありがとうございました。
/usr/tmp とかのテンポラリーなディレクトリがあったら、これって勝手に使っていいのかな? CGI.pm だと使ってるようだから?、後始末さえしっかりやればいいのかのう。
open(LFILE,"+<$logfile"); @log = <LFILE>; ($sec,$min,$hour) = localtime(time); $aftertime = "$hour:$min:$sec unixtime:" . time ; $data = "$aftertime \n"; unshift(@log,($data)); while($log){ print LFILE $_; } close(LFILE); 質問です $logfileに時間を一番上に追加してゆく処理を行いたいと思い、 ↑のようにコーディングしたのですが、全く更新されません。 なぜですか?
>>282 問題点1:
while($log) → foreach (@log)
問題点2:
LFILEの中身を呼んだ後seekしてないのでこのままでは続きから書かれるだろう
問題点3:
そもそもファイルの頭に追加するという設計を見直した方がいい。
末尾への追加は簡単だが、頭へ追加しようとすると全部書き直しになるので
普通はそういうことははじめからしなくていいようにしとくものだ。
設計し直し、っていうか勉強し直しが必要なような。
出来ました! 頭に追加したほうが、見やすいので、そういう設計にしました。 ありがとうございました!
286 :
nobodyさん :2005/06/09(木) 13:53:02 ID:r/eHxoG7
特定の条件でCGIからメールが
送信できなくてこまってます・・
www.hoge.co.jp サーバで
メール送信CGI mail.cgi があって
ここからメールを送信させているんですが
送信先メールアドレスが
[email protected] とか
[email protected] のような
hoge.co.jp サーバ以外への送信ならうまくいくんですが
[email protected] とか
[email protected] への
送信だとうまく送信されない(届かない)ようなんです。
mail.cgi自体は同じものを使用していて
@hoge.co.jp 以外のメールアドレスへの送信はうまくいっているので
sendmail の問題?なのかもしれませんが
何か調べる必要がある点などありましたらご教授お願いします。
287 :
286 :2005/06/09(木) 13:55:21 ID:r/eHxoG7
意味がわかんね
289 :
286 :2005/06/09(木) 14:19:27 ID:r/eHxoG7
すんません、もっかい整理します。
www.hoge.co.jp 上に mail.cgi を設置しています。
mail.cgi の内容は次のような感じです。
mail.cgi
----------------------------------
$head = "From:
[email protected] \n";
$head .= "To:
[email protected] \n";
$head .= "Subject: TEST MAIL\n";
$head .= "Date: $Date\n";
$head .= "Content-type: text/plain\n";
$head .= "Mime-Version: 1.0\n\n";
$body = "テスト";
open(MAILER, "| /usr/sbin/sendmail -t") || exit(0);
print MAILER $head;
print MAILER $body;
close(MAILER);
----------------------------------
290 :
286 :2005/06/09(木) 14:20:03 ID:r/eHxoG7
"@hoge" の部分が配列として評価されて "" になっちゃってんじゃないの? シングルクオートで囲むか "\@hoge" とエスケープしてみ。 ていうか、 abc.co.jp とか test.co.jp とか実在するドメインを例に使うな。 予約ドメインの example.co.jp とか example.ne.jp とか example.jp とかを使え。
input type="file"で指定されたcsvファイルをデータとして読み込みたいんですが、 モジュールを使わないという前提で、参考になるサイトはありませんでしょうか。 ぐぐり疲れました・・・orz
294 :
nobodyさん :2005/06/10(金) 00:38:57 ID:gI851X9W
sss
295 :
nobodyさん :2005/06/10(金) 00:52:30 ID:gI851X9W
上の誤投稿でした、すんません 質問なんですけど、shiftやpopは先頭か末尾ですよね。 そういうのじゃなくて配列の任意のデータを削除したいんですが、どうやるんでしょう?
splice
>>293 ありがとうございます。
とりあえず隅から隅まで読んでみますー
>>295 いつの日か delete も使えるようになったよね
299 :
nobodyさん :2005/06/10(金) 11:01:32 ID:n3jB9OmG
初歩的な疑問ですんません # 処理 my %in; &decode; &html if (!$in{send}); $inや%inは何か特別なのでしょうか?
なんで特別とか思ったの?
CGI.pmのメソッドradio_groupで作成されるオブジェクトにラベルタグを付けたいです。 <input type="radio" name="yes" value="1">はい <input type="radio" name="yes" value="2">いいえ を <input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label> <input type="radio" name="yes" value="2" id="yes2"><label for="yes2">はい</label> にしたい。 メソッド改造は汎用性が無いので 正規表現とかでなんとかならないでしょうか?
どうでもいいけど、 <label><input /></label> のが気持ちがいいよ。
305 :
299 :2005/06/10(金) 12:06:16 ID:n3jB9OmG
ありがとうございます ページを読みましたが$inはなかったです。
306 :
299 :2005/06/10(金) 12:12:11 ID:n3jB9OmG
cgi-lib.plの中に%inという連想配列があるからなのですね! ありがとうございます。 早速cgi-lib.plをみてみます。
あぼーん
308 :
302 :2005/06/10(金) 12:29:51 ID:???
>304 私もそう思うけど <input type="radio" name="yes" value="1" id="yes1"><label for="yes1">はい</label> なら、とりあえず %labels =('1','<label for="yes1">はい</label>'); $co->radio_group( -name=>'yes', -values=>['1','2'], -labels=>\%labels); で、いけるんで・・・。 これもむちゃくちゃ使いにくいけど。(・・`)
309 :
nobodyさん :2005/06/11(土) 01:51:46 ID:KxmWI2vs
質問です。 配列の中から文字列を検索して、 その文字列が含まれている配列の添え字を取得することはできますか? 例えば、 $data[0]="おじいちゃん<>76歳"; $data[1]="おばあちゃん<>72歳"; $data[2]="おとうさん<>56歳"; $data[3]="おかあさん<>52歳"; みたいな配列@dataがあって、そのなかから"72歳"という文字が 含まれている配列の添え字(この場合だと1)を取得したいのですがどうすればよいでしょうか?
use strict; my @data; $data[0]="おじいちゃん<>76歳"; $data[1]="おばあちゃん<>72歳"; $data[2]="おとうさん<>56歳"; $data[3]="おかあさん<>52歳"; my $str = "72歳"; for ( 0..$#data ) { if ( $data[$_] =~ /$str/ ) { print; } } __END__
$data[0]="おじいちゃん<>76歳"; $data[1]="おばあちゃん<>72歳"; $data[2]="おとうさん<>56歳"; $data[3]="おかあさん<>52歳"; my$str = "72歳"; for(0..$#data){ print $_ if [split(/<>/,$data[$_])]->[1] =~ /$str/; }
print map { $_->[0] } grep { (split /<>/, $_->[1])[1] =~ m/$str/ } map { [$_, $data[$_]] } 0 ..$#data;
@index = grep m/72sai$/, 0..$#data;
314 :
313 :2005/06/11(土) 03:05:12 ID:???
index そのままマッチテストした。だめだね。
315 :
312 :2005/06/11(土) 03:06:40 ID:???
>>313 オマイので気付いた('A`)
print grep { (split /<>/, $data[$_])[1] =~ m/$str/ } 0 ..$#data;
質問させていただきます。 変数名を変数で扱うことができますでしょうか? 分かりにくいので例を示しますと、 $TEST = "test"; $OUTPUT = "[[[TEST]]]"; $OUTPUT =~ s/\[\[\[(.*)\]\]\]/$$1/g; print "$OUTPUT"; ↑これで、”test”という出力がほしいのですが… 3行目のコーディングはWindows版のActiveperlでは動くのですがLinux版ではエラーになってしまいます。(もともと、あんなコードで動くことが予想外なんですが。) よろしくお願いします。
317 :
309 :2005/06/11(土) 10:20:03 ID:???
>>316 それであってるはずだがsymbolic referenceを使うことに
なるのでstrict refsな時は問題がでるかもしれん。
というかエラーになるというのならエラーメッセージぐらい
示せよ...
以前サーバのルートディレクトリじゃないディレクトリに大きなファイルをアップロードしたのですが、 そのファイルをほしいと言う人がいるので、その人にファイルを与えようと思っています。 しかし、そのファイルを再びダウンロードしてアップロードするとすれば 1 日ぐらいかかってしまいますので、 CGI からそのファイルにリンクしようと思っています。 しかし、 perl 初心者なので、自分が作ったプログラムをサーバ上で実行していいかわかりません。 どうか、以下のプログラムは大丈夫か確認していただけないでしょうか。 #!/usr/bin/perl &output; sub output { open(IN,"(ここにファイルパス)"); print "Content-type: application/x-zip-compressed\n\n"; binmode(IN); binmode(STDOUT); print <IN>; close(IN); exit; }
なんでCGIで出力しなきゃならんの?w 迷惑だからやめれ。 そのファイルへのリンク貼るか教えるだけでいいじゃん。
シンボリックリンクしろ。
322 :
329 :2005/06/11(土) 12:16:57 ID:???
>>320 ご指摘ありがとうございます。
素直にルートディレクトリにアップロードします。
ご迷惑をおかけしました。
323 :
319 :2005/06/11(土) 12:18:04 ID:???
>>321 あ、その方法がありました。
ありがとうございます。
324 :
質問 :2005/06/11(土) 22:30:32 ID:95WOJCIX
AというCGIでBというCGIファイルを作ろうとしています。 具体的には、Aのなかで、 open(HANDORU,">B.cgi"); print HANDORU << "END"; #!c:\perl\bin\perl print $data; END close(HANDORU); とした場合、B.cgiはつくられるのですが、 その内容で、\(円マーク)が消えており、、また$dataがなくなってしまいます。 ¥を¥にしたらそのまま「¥」にされて書き込まれたりします。 どうしたら、うまく¥や変数が記述されるのでしょうか?
325 :
質問 :2005/06/11(土) 22:36:20 ID:95WOJCIX
訂正です。。 ¥を&yen;にしたらそのまま「&yen;」にされて書き込まれたりします。
327 :
質問>解決 :2005/06/11(土) 23:12:39 ID:???
CGI.pm の中に if -d $_ && -w _; って式があるんだけど、これは if -d $_ && -w $_; の略、ってことでよいの? つーか 略せるんだったの・・? 見たことなかったんだけど
330 :
nobodyさん :2005/06/12(日) 01:21:50 ID:Eqf0BMjV
今オブジェクト指向でモジュールを組んでいるのですが質問いいでしょうか? プライベートメソッド内で俗に言うthisを使い処理をする場合、 thisはプライベートメソッドを使用しているメソッドからそのメソッドに引数として渡して処理しなければならないのでしょうか? どなたかご教授して頂けると嬉しいです。
>>329 そこにあったか!
あーサンクス!! いいこと知ったー
333 :
330 :2005/06/12(日) 20:39:01 ID:Eqf0BMjV
>>332 すみません、一通り見てみたのですが何処に答えがあるか分かりませんでしたorz
見落としていたらごめんなさい。
プライベートメソッドがオブジェクトのリファレンスを取得するには、
やはり実際に呼び出されたメソッドから引数でリファレンスを渡してやらないと行けないのでしょうか?
そもそもperlにプライベートメソッドなどないわけだが... なにをさしているかわからない以上はマニュアル嫁的な 一般論以上の回答のしようもないんじゃないかと。 perlの場合オブジェクト指向といっても$foo->f(...)の 形で呼べばfが$fooをblessしたときのパッケージから 探されるのと、自動的に$fooがサブルーチンfの最初の 引数になるぐらいの単純な仕掛けだから難しく考えても しょうがないと思われる。
335 :
330 :2005/06/12(日) 21:18:28 ID:Eqf0BMjV
>>334 説明下手ですみません。。たぶん、用語等ちゃんと理解できてないんだと思いますorz
プログラムからあるクラスのメソッドを呼び出すとき第一引数にオブジェクトのリファレンスが渡されますよね、
#sub new { $this = shift; ←これ
そのリファレンスをそのクラス内でしか使えない(使わない)メソッド
#sub _cool { ←慣例的に_で始まるサブルーチン名を付けられ、そのクラス内のメソッドから呼び出すので、
#第一引数にはオブジェクトのリファレンスが渡されないメソッド
で使いたいのですが、
#$this->{hoge} ←こんな風に
引数としてリファレンスを渡すしか方法はないのでしょうか(もっと綺麗な方法はないのでしょうか)?
336 :
330 :2005/06/12(日) 21:19:41 ID:???
"#$this->{hoge} ←こんな風に" → "#$this->{hoge} ←こんな風に使いたい。"です。すみません。
>>335 頭に_をつけたなんてのは人間が勝手に目印にしてるだけで
perlは何の特別扱いもしてくれない。頭が_じゃないのと
全く同じ。
もうちょっと読んでやれよ
マニュアル嫁
>>330 $this->_cool();
これではいやだと言っているのか?
341 :
330 :2005/06/12(日) 23:15:22 ID:???
>>340 仕組みを理解してませんでした。orzありがとうございます〜。
$you->houkei
$i->muketruyo->kaseidakedona;
encodingモジュールはどういうときに使いますか? Jcode.pmのような使い方をするときは、Encodeだけで間に合うと思うのですが。。
JIS漢字が含まれている文字列のタグを取り除こうと $str =~ s/>/>/g; $str =~ s/</</g; とやったら、「小」とか「松」って文字が文字化け するようになったのだけど、どうやったら対処できそう?
あ、元に戻された。全角で書くと $str =~ s/>/&gt;/g; $str =~ s/</&lt;/g; な感じ。
つまり、 jcode なんとかを 突っ込んで EUC に変換して、 タグを変換して JIS に変換し直すって ことかな?だりぃな。
つーかソースをeucで書けよ。 それにブラウザによっては違う文字コード送ってくる場合もあるから、 どちらにしろ文字コードのチェックは必要だ。
ソースはEUCにしたところで、何も変わらない。 ファイルと出力がJISなんだよ。 頭の柔らかい奴は、JISのタグ変換ぐらい、 もっとスマートな方法でやると思ったんだがな。
>>350 いまどきSJISじゃなくてJISだなんて・・・。 メール以外に使うときあったのか。
大手企業のサイトをいくつか見ればわかるが 意外と JIS 指定のところが多い 依存性の関係もあるのだろうが SJIS とか EUC に拘っている奴は 場数が少ない人だと思う といっても、 JIS に未来はないけどな
例えば何処か教えて頂けると嬉しい。 知ってる企業をいくつか検索してもJISで構築されているサイトが見つからない。。。
>>354 おまいが一番拘ってるように見えるがw
つーか、マンドクセだからeuc使ってるだけで。
普通に使う分には一番コスト低いと思うが。eucにデメリットある?
aho
Web ページだと、文字コード自動判別するとき、 EUC-JP と Shift_JIS は誤判定されることが多いけど、 ISO-2022-JP だと割と誤判定されにくい、ってのはあるかも。
>>358 自動判別とかw 黙って Content-Type くらい書こうぜー
>>360 ローカルの HTML ファイルを開こうとしたら Content-Type なんてないわけですが
ローカルファイルを直接開くときはさすがに無理だが Apache なら AddCharset しておくのが正しい姿だろうな
>>345 たぶんこれでできるから
foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
if($str=~/^[^\x1B]/){
$str =~ s/&/&/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
}
$out .= $str;
}
>>363 すまん、間違い。
foreach my $str($in =~ /(\x1B.*\x1B..)|([^\x1B]+)/g){
は
foreach my $str($in =~ /(\x1B.*?\x1B..)|([^\x1B]+)/g){
ね。
366 :
nobodyさん :2005/06/14(火) 12:33:58 ID:TLKadJIJ
初歩的な質問かもしれませんが、 $text[$ii] = "<tr><td>上の段</td></tr>\n"; $text[$ii] =. "<tr><td>下の段</td></tr>\n"; と書き $text[$ii]に"<tr><td>上の段</td></tr>\n<tr><td>下の段</td></tr>\n"が格納されるように、 コーディングしたつもりなのですが、エラーが発生してしまいます。 $text[$ii]に"<tr><td>上の段</td></tr>\n"に後から追加で"<tr><td>下の段</td></tr>\n"が、 格納されるようにするにはどのように変えたらよいですか?
×=. ○.=
368 :
nobodyさん :2005/06/14(火) 12:48:08 ID:TLKadJIJ
ありがd!
$text の中には下のような配列になっています。 成田 船橋 , 八王子 町田 立川 国分寺 , 所沢 川越 秩父 これを最終的に下のような二次元配列にするために kanto[0][0] = "成田" kanto[0][1] = "船橋" kanto[1][0] = "八王子" ・・・ kanto[1][3] = "秩父" 下のようなプログラム文を書いたのですが、 for $ii (0..$#text) { @kanto1 = split /,/,$text[$ii];# ←ここはうまくいく foreach $kk (@kanto1) { @kanto[$kk][] = split / /,$kanto1[$kk];# ←ここでエラー } } @kanto[$kk][]のところでエラーになってしまいます。 どのようにしたら、うまく@kantoに二次元配列を作成することが出来るでしょうか
とりあえず foreach $kk (@kanto1) じゃなくて foreach $kk (0 . $#kanto1) だろ。
>>369 @kanto = map { [split / /] } split /,/, $text;
369の書き方でなら @{$kanto[$kk]} = split / /,$kanto1[$kk];
374 :
nobodyさん :2005/06/14(火) 19:17:35 ID:yq1owU75
UDPSocketを使って、 「Clientから何らかのパケットが届く"たび"に何らかの処理」 を行いたいのですが、recvイベントのようなものはキャッチできないでしょうか。
単純な質問で申し訳ないのですが @hogehoge[][]; $len = scalar(@hogehoge); print "要素数= $len "; この時の$lenに格納されているものは何でしょうか? $len = scalar(@hogehoge[1]); 最初の[]の要素数を調べるにはどのようにしたら良いのでしょうか?
すいません、投稿しなおしです。 単純な質問で申し訳ないのですが @hogehoge[][]; $len = scalar(@hogehoge); print "要素数= $len "; この時の$lenに格納されているものは何でしょうか? @hogehogeの最初の[]の要素数を調べるには、どのような関数を使ったら良いのでしょうか?
>最初の[]の要素数 意味不明
もちょっと "リファレンス" というのを勉強したらいいと思うぞ。 高次元配列っていうのも、単にリファレンスのネスト、と解釈すれば結構容易に理解できる。
open (TEST, 'hoge.txt'); my $fg = \*TEST; こんなことをしたとき、 close ($fg); でも my $fh = *{$fg}{IO}; close ($fh); でも どっちでもできるんだけど、どっちがいい、とか、どっちかが支障がでる、とかあるのかな? とりあえず stat (〜) は上で言えば $fg でしかできなかったんだけども。
>>379 引数にグロブ(グロブのリファレンス)を受け取るPerlのネイティブ関数には
ファイルハンドルのリファレンスを渡しても無理だから上の方がいいかと。
ただ、下のは、ブロック内でグロブをローカル化すればシンボルに依存しない
ファイルハンドルのリファレンスが得られる。
でも、シンボルに依存しないファイルハンドルが欲しければ
open ($fh, 'hoge.txt');
てやれば 、無名のグロブリファレンスが得られるから、こっちがいいかもよ。
>>379 それ@niftyだとできないんだよね。。
なので全部eval使ってる。
my $id = "FILE";
eval 'open(' . $id . ', "+>>$path$file")'
〜
eval "seek($id, 0, 2)";
eval "truncate($id, 0);seek($id, 0, 0)";
〜
eval 'print ' . $id . ' $tmp';
〜
eval '@tmp = <' . $id . '>';
〜
eval "close($id)";
>>381 単にstrict refsなだけなんじゃ?
Can't use string ("FILE") as a symbol ref while "strict refs" in use at 〜
ってなエラーじゃない?
わざわざ$idに"FILE"なんて入れないで380の言うように空のまま(=undef)に
しとけば、openするときに無名のリファレンスを入れてもらえるので問題ない
と思うが。
えと、一応ファイル扱う為の汎用パッケージのつもりで作った中身です<<381 pfile::open(FILE, writemode) read(FILE) write(FILE) close(FILE) 見たいな感じで、同時に複数開けるように作りました。 あと、@niftyはエラーlogは見れないようになってるらしくて、 内容は分からないんです。。 どっかで配布してた、エラー内容返すcgiも走らないので… use strict(綴り適当)も、宣言しただけでエラーが出ます。 @niftyは特殊らしい。。でも鯖を選ばず動くscript書きたいので。。 @niftyでエラーメッセージを見る方法ってあるんでしょうか? 誰か使ってる方いましたらご教授お願いします。
>>383 特定環境の話をここで続けていいものかわからんが、@nifty は
プラグマも含めて全てのモジュールが故意に削除されている。
use strict; すると strict.pm が見つからないのでコケる。
別にモジュール「が」使えないわけではないので、必要な
モジュール一式を任意のディレクトリに入れて、スクリプトの
頭で BEGIN { push @INC, '/your/lib/dir' } すれば動く。
>>384 全部消すとは…CGI利用可能にしてるくせに、珍しいですよね。。
@niftyは負荷に対するチェック基準?も厳しいらしく、
自分で作ったfilelockのテストも(n回読み込み→書き込みを繰り返すスクリプトを2つ同時に走らせる)、
nを100回で指定して走らせたら鯖でタイムアウトになりました。
isWebだと300でも軽快に動いたんですが。(それ以上は迷惑になるっぽいので試してません)
確かにちとスレ違いっぽいので以後控えますね。
色々情報ありがとうございました!
386 :
nobodyさん :2005/06/15(水) 11:21:53 ID:pMiUaalZ
とあるPerlの参考書にこういうコードがありました。 $file_name = "./text.txt" open(HANDLE, "$file_name"); ファイルオープンの行の第二引数にダブルクォーテーションがついてるんですが、これは何故なんでしょうか? これがなくても大丈夫みたいですが。。
「"」 = 変数を解釈し、展開する。文字列は文字列として解釈する。 「'」 = 全て文字列として解釈する。 my $a = 10; print "ねむいよー$a"; →ねむいよー10 print 'かたがいたい$a'; →かたがいたい$a
>>387 引用符の違いではなく、変数だけのときにわざわざ二重引用符をつける意味を聞いているのだが
my $a = 10;
print "$a";
print $a;
389 :
nobodyさん :2005/06/15(水) 11:44:11 ID:EGr0DnSI
# パスワード $pass = '○○○○'; # パスワード確認 if ($in{'pass'} eq "$pass") { print"パスワードが合ってます"; } else { print"パスワードが違います"; } パスワード認証なら上記でも良いのではないでしょうか? 複雑にする必要性ありそうなのだけど教えてください。
>>389 KENTとかそうやってるね
ソース見られたときにパスワードがモロばれだけどね
普通はDESとかMD5で暗号化する
391 :
386 :2005/06/15(水) 12:38:11 ID:???
>>388 そうなんです。
そっちがわからないんですが・・・。
まあどっちでも動くみたいなんで今のところ気にしないことにしますね^^
失礼しました。
>>391 明示的に宣言したり、デフォルトの読み書き方法で無いときは"がいるから使い回してるだけじゃない?
394 :
389 :2005/06/15(水) 13:32:19 ID:EGr0DnSI
>>390 早々有難うございます。
暗号化するというのは、こんな事をするのでしょうか?
my @SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
$in{pwd} = crypt($in{pass}, $SALT[int(rand(64))] . $SALT[int(rand(64))]);
なんでキーを rand するんだろ? そのままじゃ暗号化されたパスの先頭にキーがついたままだから、substrとかしないと意味ないし、 取ったら取ったで、キーがわからないとどうやってパスワードチェックしたらいいのかわかんねくね?
>>380 >>379 だけど、サンクス!参考になった。
今回はシンボルの文字列自体に意味があるので、グロブにさせてもらうよ。
そういや nifty も知らんけど、まだ perl-5.005 以前を使ってる鯖ってあるのかな?
AAA! が 5.005 だったが。 ってスレ違いか。
とにかくなるべく新しいのにして欲しいな。 いろいろ動かなくて困るw
>>395 パスワードの暗号化ってのはパスワードをプレーンテキストで
保管せず、暗号化したデータを保管するってこと。
登録時には下記$pwdをサーバに保存。
$pwd = crypt($input_pwd, $salt);
認証時には保存された$pwdでチェック。
if (crypt($input_pwd, $pwd) eq $pwd) { # 認証OK
>>397 それはわかるけど、
>>395 でさ、
>>397 で言う $salt を rand させる意味はなくね? って話。
暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
rand させようがさせまいが、 $pwd を見られたら $salt わかるわけじゃん?
だったら $salt は rand させても、最初から"xy"とかに固定してても、そんなに変わらない気がするのだよ。
>>397 横レスだけど、それってチェック時はなにやってるの?
登録時には下記@indb_pwd($pwd及び$salt)をサーバに保存。
@indb_pwd = (crypt($input_pwd, $salt), $salt);
認証時には保存された$saltを使用して、$pwdでチェック。
if ($indb_pwd[0] eq crypt($in{pwd}, $indbpwd[1])) { # 認証OK
これだったら意味分かるけど…。
ああああ
>>397-398 >暗号化した $pwd の先頭2文字に $salt の値が含まれるわけだから、
知らなかった…
失礼しましたorz
でもどっかの誰かさんのスクリプトはrandしてるね。
誰誰?
>>382 遅レスですが、なんか勘違いしてたかも。
@niftyだと
>>379 のような、「ファイルハンドルを変数に入れる」ということ自体が出来ないんです。
多分perlのバージョンのせいだと思うんですが。
んでしょうがないので、ハンドルをあらわす文字列自体を動的に扱う為にevalを使ってるという感じです。
$id = "FILE"というのはファイルハンドルを変数に入れようとしているわけではなく、展開してevalに渡すためです。
>>403 @nifty のPerlのバージョンっていくつ? print $]; ってやってみてくれ。
>>398 例えば複数のパスがあるとして、クラックするときsaltが全部同じだったら探索効率が良い希ガス。
>>407 そゆこと。 rand しとけば 4096 倍掛かる。
409 :
389 :2005/06/15(水) 17:31:01 ID:EGr0DnSI
>>399 有難うございます。
意味わかりました。
>>401 randがついてるので、rand関数により暗号化してるのかと思ったのです。
「パスワードの暗号化」と言うけど、 crypt() のやってることは厳密には「暗号化」ではないからね。 などと言って混乱させてみるテスト。
万が一同じパスワードが複数与えられた場合に、暗号化後 (厳密には暗号化じゃないんだが) の 文字列がかぶらないようにするため
412 :
411 :2005/06/15(水) 17:49:12 ID:???
部分的にカブタ
>>411 それはちょっと無理があるようなw
aaaaaaってパスワードがたくさん登録されれば 1/4096でかぶるわけだし、
そもそもパスワードがかぶっても普通は問題ないし。
>>408 それは 4096個 salt があった場合の話だがな。
違う salt の pwd が2個なら2倍かかる、ってだけ。
>>414 あぁ、すまん。
>>394 の DES crypt() の場合のことしか考えてなかった。
saltをに日本語を使おうぜ。 $p = 'password'; ($s) = ('∀'); $c = crypt $p, $s; とかやればコード中に顔文字が出てきて和めるぞ。
∀は別に日本語というわけではなかった罠。
なにこの流れ('∀')
>>406 v 5.00503 の AAA!cafe だと
× my $fh = undef; open ($fh, '>test.txt');
○ my $fh = \*FILE; open ($fh, '>test.txt');
試しに↓のコードで動かしてみ
#!/usr/bin/perl -w
use strict;
local *FILE;
my $fh = \*FILE;
if ($fh) {
open ($fh, '>test.txt'); print {$fh} 'hogehoge'; close ($fh);
}
print "Content-type: text/html\n\nOK? // $$fh // $fh";exit;
>>416 ちなみに、最近のモダンな crypt() は、 salt の文字種によって、
暗号化の方式 (ていうかハッシュ関数) を切り替えてくれちゃったりするので、
あんまりへんてこりんな文字列を salt に許すと portable じゃなくなったりする罠。
422 :
考えて半年 :2005/06/15(水) 19:50:20 ID:biXgIpFa
Perlコーディング初心者から抜け出す方法ないの。 ていうか、Perlでチャットとか掲示板とか、画像をうpするとか機能を追加した ゼロからプログラミング作れるようになるには、どうすればよいのでしょう? 10日で覚える、とほほ、独習、リャマ本、らくだ本、リファレンスなど よんでも、いまだに初心者です。漏れがbakaなの?
一冊読めばだいたいある程度のものは作れるようになるから、結論としてはb・・(ry つーか、このスレのタイトルを変える相談かと思ったw 半年もかじれば、シンプルなカウンターや掲示板くらいならできない? 本を閉じて、試しに作ってみればいい。 分からないときに本を見る。 参考書が一冊もなくても、ネットのあちこちで転がってるし、 生半可な本より充分な内容の perl.doc もある。 とにかく、芸術分野みたいなもんで 「自分で造る」 「自分で調べる」 のが大切。 ・・・なんてな。
読むだけでは上達するのは頭の良いひとだけだと思う。 凡人プログラマなら、とにかくいっぱい作りまくって練習するしかないかと。
なにこの釣りスレ
426 :
考えて半年 :2005/06/15(水) 20:26:41 ID:biXgIpFa
>422です。例えば foreach $lines (@lines) { ($tm,$cnt,$scnt,$ip) = split(/<>/, $lines); if($ipc==2){&get_;if($cook){ $flag=2; last;}} if($date eq "$tm") { if($ipc==1){if ($addr eq "$ip") { $flag=2; last; }} $flag=1; $cnt++; $scnt++; $lines = "$tm<>$cnt<>$scnt<>$addr<>\n"; } foreach { から } までを繰り返すコードであることは理解できる。 しかし、{ } の中身が理解できない。 だから、どうしてよいのかわからない。
>>426 よくそれでラクダとか読めたなw
読んだって文字を目で追っただけだろ
428 :
考えて半年 :2005/06/15(水) 20:32:45 ID:biXgIpFa
「ちゃんと本読めばすべて書いてある」ってことですか?
ああ釣りスレだな
きっぱりあきらめるのも手かと。 混乱しちゃって、今は何を言われてもポカーンじゃないかな。こんな感じ。 @ @ △
431 :
nobodyさん :2005/06/15(水) 20:38:07 ID:qXBtGg7k
↓下のようなデータを「,」区切りで分け、空の時はテーブルを二列連結させるプログラムを作りたいと思いますが、 空のデータがある時のやり方がどうしても出来ません。 埼玉,東京,群馬 大阪,,奈良 空のデータがある場合はcolspanを使い↓のように連結させる <table> <tr><td>埼玉</td><td>東京</td><td>群馬</td></tr> <tr><td colspan=2>大阪</td><td>奈良</td></tr> </table> このようにするにはどうしたらよろしいすか? サンプル等をご存知でしたら教えていただければ助かります。
>>431 先に普通にテーブル作ってから
<td>([^<]+)</td><td></td>を
<td colspan=2>$1</td>に置き換えるとか
>>431 最初がカンマの場合は全部一番後ろに押し付けてみた。
while (<DATA>) {
chomp;
my $data = $_;
$data =~ s/^(,+)//;
$data .= ',' x (1+length $1);
my @pref = split /,+/, $data;
my @count;
while ($data =~ s/(,+)//) {
push @count, length $1;
}
print qq{<tr>};
my $n = 0;
foreach my $span (@count) {
print $span > 1 ?
qq{<td colspan="$span">$pref[$n]</td>}:
qq{<td>$pref[$n]</td>};
$n++;
}
print qq{</tr>\n};
}
>>419 以下で問題なく動きました…orz
ありがとうございます。
>>9 のページではハンドルのリファレンスじゃなくてグロブそのものを入れようとしてるんですが、
そちらだと出来ませんでした。。
#!/usr/local/bin/perl -w
local *FILE;
my $fh = \*FILE;
if ($fh) {
#? エラー
#? エラー
open ($fh, '>./data/test.txt');
print {$fh} 'hogehoge';
close ($fh);
}
print "Content-type: text/html\n\nOK? // $$fh // $fh";exit;
>>428 ランダきちんと読めばこの世にある殆どのPerlコードは理解できる。
個々の部分が何をやってるかはわかるようになるとは思うが 全体として何をやってるか理解するのは難しいのもあると 思うよ。 このコード結局なにがやりたいんだよみたいな(笑)
perl の文法を学ぶ前にアルゴリズムというものが理解できてないと いろいろと難しいかもしれんですな
440 :
nobodyさん :2005/06/17(金) 00:42:38 ID:FGf+BXAB
>437様へ。 アルゴリズムって何ですか?perlの文法わかるのに、掲示板とかチャット とかプログラム作成しようと思うとイマイチ、わかりません。 どうすればよいの?アルゴリズムがわからないから、プログラム作成でき ないのでしょうか?
以下のものを自分で一から作ってみては? 既にあるものを参考にしない事(詰まったときにヒントとしてみるのはあり)ってルール作って。 hallo world表示 ↓ フォームの入力内容表示 ↓ ファイルの内容を読み込んで表示 ↓ フォームの内容をファイルに書き込み ↓ カウンタの作成 ↓ 一行掲示板の作成 ↓ eコマースサイトの作成
442 :
nobodyさん :2005/06/17(金) 00:55:30 ID:FGf+BXAB
hello world表示 #! c:\perl\bin\perl print "Hello Perl\n";
それってコーディングの問題じゃないんじゃないだろか。設計じゃない?
444 :
nobodyさん :2005/06/17(金) 01:00:22 ID:FGf+BXAB
フォームの入力内容表示、内容読み込み表示 #! c:\perl\bin\perl print "Enter Word : "; $word = <STDIN>; chomp($word); print "$word\n";
Σ(゜Д゜)ハッ!! 数ヶ月いるのに、ずっと "コーティング(coating)初心者質問スレ" って読んでた・・・。 orz
最近 #!perl でも動くことを知った(ActivePerl)
ああ…なるほど
449 :
nobodyさん :2005/06/17(金) 01:25:54 ID:FGf+BXAB
フォームの表示わかんないんです。
winでパス通ってりゃ、何もつけなくても動く罠
はは、よく釣れてるw
暇だしねー
これは、なにするCGIですか? %in=map{s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;$_}map{split/=/,$_,2}split/&/,$ENV{QUERY_STRING}; print<<HTML; Content-Type: text/html <form action=$ENV{SCRIPT_NAME}><textarea name=text rows=20 cols=40>$in{text}</textarea> <input type=submit></form><hr> HTML eval$in{text},$@&&print"<pre>$@</pre>";
GET 受取処理
まともに答えられとるw
ハッシュ同士を合体させてくれるような、格好いいモジュールってありますか? もし自分でコードを書くとしたら、テンポラリなハッシュにforeachでキーと値をいちいちぶち込むことになるんでしょうか。
モジュール使わんでも・・・ %y = (%x , %y); ↑の書き方じゃ不満? my %x = qw(a 1 b 2 c 3 d 4 e 5 f 6 g 7); my %y = qw(e 01 f 02 g 03 h 04 i 05 j 06 k 07); print join (', ', map { $_ .'=>'. $x{$_} } sort keys %x), "\n"; print join (', ', map { $_ .'=>'. $y{$_} } sort keys %y), "\n"; %y = (%x , %y); print join (', ', map { $_ .'=>'. $y{$_} } sort keys %y), "\n";
@y{ keys %x } = values %x;
あれ? keys と values の値の出てくる順番って、両方同じ順番で確からしいんだ?
>>460 keys, values, eachはハッシュを変更しない間は同じ順番になることが
保証されている。keysのマニュアルなど参照。
あと、ハッシュをリストコンテキストで評価したときに返るリストも
同じ順番になりそうなもんだが、そういう記述は見つけられなかった。
これはどうなんすかね?
試してみないの?
経験則じゃなくて、仕様的情報があればって感じなんでは
つーか、そもそも考えが質問がおかしいというか、 重複するキーの値をどうするか?という問題の希ガス。 %xに%y入れるか、%yに%x入れるか。
y と x 逆にすればいいだけぢゃん。 それとも重複したら Array にしたい、とかかねえ。
466 :
質問 :2005/06/18(土) 16:37:14 ID:DZNl0XpA
フォームをつかったCGIを作ろうと思っているのですが、セキュリティが心配です. 自分が作ろうと思っているのは、 ラジオボタンを使ったクイズ、チェックボックスを使ったクイズ、テキストボックスを使ったクイズ なんですが、 気をつけることなどんなことでしょうか? 自分の考え(素人レベルですが・・)では、ラジオボタンとチェックボックスのほうは問題ないと思うのですが、 テキスト形式は不正な文字や引数を使われるとやばいとおもうので、正規表現でチェックするぐらいしか思いつきません.
>>466 とりあえず、文字列のチェックつか文字コードのチェック話は
さんざこのスレでも出てるので読み返しる。
469 :
nobodyさん :2005/06/19(日) 10:05:28 ID:a/QQeV38
質問なんですが $/ = "a"; chomp($data); とすると$dataの行末のaを取り除くことができるみたいですが aとbというような他の文字であっても取り除くようにすることはできませんかね? PHPでいう$data = rtrim($data, "ab");みたいなことをやりたいんですが。 $/ = "ab"; chomp($data); ではできませんでした。
$data =~ s/[ab]$//mg;
自鯖にpingを送って生死判定をしたいのですが、 pingの結果はどうやって得るのですか?
473 :
nobodyさん :2005/06/20(月) 00:43:18 ID:9D61R1Ak
入力に、「全角ひらがな」と「全角カタカナ」のみ許容するように したいのですが、うまくいきません。 if ($str =~ /[\xA1-\xFE][\xA1-\xFE]/) { } これですと全角全てを許容してしまいますので、何か良い方法が ございましたらご教示いただきたい次第です。 何卒、宜しくお願いいたします。
全角ひらがなとカタカナの文字コードの範囲を指定すれば? 文字コード表は検索すれば出てくるよん。
その正規表現だと「[\xA1-\xFE][\xA1-\xFE]を含むもの」全てにマッチしちゃうよ。
うにこーどにして一文字ずつ弾け
$name !~ m/^[ぁ-ヶ]+$/ で何とかなるかと思いましたが。うまく動いてくれませんでした。 皆様、色々とご教示有難うございました。
>>477 use encoding 〜 使えばそれでもできそうだがね。
>>479 アドバイス有難うございます。
EUCで全て書いて最後にSJISにしてページを出力しているため、
化けてしまうようです。この方法は諦めました。。
文字コードの範囲と言うものが少しわかってきたのですが、まだ
まだ勉強不足なので調べまくっているところです。
貴重なアドバイス有難うございました。
>>473 アバウトだけど叩き台くらいにはなるかしら。
/\A([\xA4\xA5][\xA0-\xFF]|\xA1\xBC)+\z/
おお、ちょうど473と同じような状態なんですが、私は +漢字も含む文字以外を許容しないというものなん ですね。 この場合は if ($str !~ /^([\xA1-\xFE][\xA1-\xFE])+$/) { } これで問題ないのでしょうか?
483 :
nobodyさん :2005/06/20(月) 17:47:52 ID:/wReIU3I
お世話になっております。 perlでcgiを作成しているのですが URLでhoge.cgi?day=20050620 と指定しているのに -------------------------------- use CGI; my $cgi = new CGI; my $gDay = $cgi->param('day'); -------------------------------- というように取得できません、、、 Ctrl+F5で更新すると取れるのですが なんでなのでしょう? 何か情報をお持ちな方はお教え頂けますとありがたいです。
url_param じゃね?
>484さん ありがとうございますっ url_paramというのがあったのですね、、 不勉強でした。 どうもですっ
487 :
482 :2005/06/20(月) 21:33:18 ID:???
うおおおお。 ぐぐりまくってなんとかここまでたどりつきました。 先生方、見てくださると大変助かります。 $eucpre = qr{(?<!\x8F)}; $eucpost = qr{ (?= (?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて (?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端 ) }x; $hiragana = '\xA4[\xA1-\xF3]'; # ぁ〜ん $katakana = '\xA5[\xA1-\xF6]'; # ァ〜ヶ $kanji = '[\xB0-\xFE][\xA1-\xFE]'; # 漢字(実際に割り当てのない領域も有るが問題はない) $nobashi = '\xA1[\xBC\xBD\xC1]'; # ー−〜 if($name !~ m/^$eucpre(?:$hiragana|$katakana|$kanji|$nobashi)+$eucpost$/){}
え、何? ひらがな + カタカナ + 漢字 + [ー〜] だけを許容したい、ってこと? ・・・にしては最後のアスキーは何なのかわからんか・・・。 全角記号とかはどうなるのかな。 まあ、やりたいことをもちょっと詳しく。 例とかだしてくれるとわかりやすいかも。
はじめまして。 すいません。ファイルオープンについて教えてください。 ファイルを読み書きオープンで開いて、 前の書き込みのデータを参照して処理をしたあとに追加でデータを書き込みたいのですが、 なかなかうまくいってくれません。 どなたかご教授願えませんでしょうか。 【ファイルについての仕様】 ・データの追加書き込みがある ・ある程度データがたまったら削除される。 open(DOUT, "+<$log_file"); これだと、ファイルが削除されている場合エラーが出てしまいます。 open(DOUT, "+>$log_file"); open(DOUT, "+>>$log_file"); 上2つだとデータが読み込めないんですけど、これは自分の書き方は悪いんでしょうか。 乱文ですけどよろしくお願いします。
if (-e $log) { 読み書きopen } else { 新規でopen
open(DOUT, "+>>$log_file"); seek (DOUT, 0,0); が安定じゃね?
493 :
489 :2005/06/21(火) 00:23:19 ID:???
お返事ありがとうございます。
>>490 私の目的だと
sysopen(FH, $path, O_RDWR|O_CREAT) || die $!;
sysopen(FH, $path, O_RDWR|O_CREAT, 0666) || die $!;
を選択するのが妥当・・・ですよね。
>>491 なるほど、そういう書き方がありますね。
>>492 open(DOUT, "+>>$log_file");
で
@log = <DOUT>
とすると、@logで値が入ってこないんですけど、
@log = <DOUT>をする前に
seek (DOUT, 0,0);
が必要でしょうか??
また、明朝来ます。
>>493 そのための seek だろ。 何言ってんだw
495 :
482 :2005/06/21(火) 02:15:58 ID:???
>>488 説明不足ですみません。
ひらがな + カタカナ + 漢字 + [ー〜] だけを許容したい
ずばり、そのとおりでございます。
「最後のアスキー」とは、何か漏れがあったりしますでしょうか?
use encode しつつ [\wー〜] ってやるのが一番楽そうなんだがw 最後の $eucpost の後方参照が必要なのかどうかわからないのだった。 まあいるんならいいんじゃない? それで動けば。
utf8使えるんなら使わない手はない
498 :
493 :2005/06/21(火) 09:46:03 ID:???
>>494 ありがとうございます!なりました。
今までseekを使うことがなく、(<と>>だけ)
いまいち感覚がつかめませんでした。
たすかりました。
ところで、+>>でオープンした場合の書き込みは追記になるので
書き込む前に
seek(OUT, 0, 2);
をする必要はないと考えてよいでしょうか。
今のところ問題ないんですけど、やっておかないとマズイことはありますか?
以下のようにスクリプトをutf8で書いてやるとうまくいくんですが、 use utf8; $str='日本語'; print length $str, "\n"; # 3 foreach (split //, $str) { print sprintf("%04X\x20", ord); # 65E5 672C 8A9E } utf8で書いたファイルを読み込んで同じことをやろうとするとだめです。 use utf8; while(<>){ print length $_, "\n"; foreach (split //, $_) { print sprintf("%04X\x20", ord); } } ちなみにファイルは、以下のもので、 これはutfであります。 結果は、 ~$ perl utf_test.pl utf_test.txt 32 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0075 0074 0066 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 0000 FFFD FFFD 000D 000A cygwinのperl5.8.5でやってます。どうしたら、日本語マルチバイト認識して くれるんでしょう。
さっきの結果は、use Encode;の場合でした。use utf8;だと、 ~$ perl utf_test1.pl utf_test.txt 32 00E3 0081 0093 00E3 0082 008C 00E3 0081 00AF 0075 0074 0066 00E3 0081 00A7 00E3 0081 0082 00E3 0082 008A 00E3 0081 00BE 00E3 0081 0099 00E3 0080 0082 000D 000A です。よろしくお願いします。
連カキコすまソ。 use open ":utf8"; use utf8; while(<>){ # while(/\p{Hiragana}/g){ while(/[ぁ-ヶ]/g){ print "$&\n"; } } みたいにすると、結果はOKなんですが、 Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. Wide character in print at utf_test.pl line 6, <> line 1. これは抑止できないんですかね。
>>502 binmode STDOUT, ":utf8";
perldiag(1)のそのメッセージの説明に書いてあったわけだが。
エラーメッセージでぐぐるとかしなさいよ
>>498 ファイルロックするなら問題ないんじゃない?
>>505 POSTしてるからだろ。
ttp://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod の
「POSTとURLパラメータの混合」より:
問い合わせ文字列(引数が後ろについた"?"マーク)が入ったURLへ
POSTするフォームを作成することにより、スクリプトはフォームと
同じように CGIパラメータをURLで受け取ることは可能です。param()
メソッドは、 URLの問い合わせ文字列を無視し、常にPOSTされた
フォームの内容を返します。 URLパラメータを取り出すためには
url_param()メソッドを呼び出してください。
PHP の $_GET $_POST みたいに両方取れるといいのにね。
509 :
505 :2005/06/21(火) 17:02:14 ID:???
>>507 クエリ付きURLにPOSTすると
paramはPOSTされた値だけ持ってくるってこと?
勉強になった超エロイ人ありがとう!
510 :
502 :2005/06/21(火) 21:53:39 ID:???
Apache2.0.52+Perl5.8.3という環境で、CGIとおなじサーバにある RSSをHTMLとして出力するCGIを作成中なのですが、 my $rssfile = $cgi->url_param('rssfile'); open(my $fhin, $rssfile) or die $!; と書くとDOCUMENT_ROOTにあるrss.xmlを出力しようとして rssfileに/rss.xmlと指定しても出力できません。 仮想パスを物理パスに変換する必要があるのは分かるのですが、 IISのMapPathメソッドのようなものはないのでしょうか? よろしくお願いします。
>>511 $ENV{'DOCUMENT_ROOT'}
>>512 質問の仕方がまずかったですね。
それも考えましたがrssfileが//etc/passwdとかだった場合は
セキュリティ的に問題があると思ったもので。
DOCUMENT_ROOTの中か外かの判断ができればよいのですが。
>>513 だからこういう事だろ?
my $rssfile = $cgi->url_param('rssfile');
$rssfile =~ s|^[./]*|$ENV{'DOCUMENT_ROOT'}/|;
-f $rssfile || die 'No such file';
open my $fhin, '<' . $rssfile or die $!;
外から渡される文字列は全部危ないんだから、危なくないよう加工・確認
してから使うのがセオリー。問答無用で DOCUMENT_ROOT を基点にして
しまえば中か外か判断する必要はないし、DOCUMENT_ROOT の外の
階層構造をわざわざ外部に教えてあげる必要もない。DOCUMENT_ROOT の
外のファイルを読ませたいのなら、ハッシュを一個用意してそのキーを指定
させる等、パスを直接的に指定させない方法を採ればいい。
%rssfile = (index => '...', news => '...', ... );
if (defined $rssfile{$rssfile}) { ... }
何で ./rss.xml とかの指定じゃだめなん。 chdir ($ENV{'DOCUMENT_ROOT'}); とかにして、最初の スラッシュ を削除するとか。 つーかそーゆーモジュールすでにありそうだし、それくらいのメソッドくらい自分で造れそうだがw
517 :
511 :2005/06/22(水) 02:15:15 ID:???
なるほど。参考になりました。 ありがとうございました。
質問です。
ttp://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca 以下抜粋
>上の例では、ファイルハンドルを使う前にそれをスカラー変数に代入していました。
>これは式でもなく、ハッシュや配列の添え字でもなく単純なスカラー変数だけがprintやC<printf>、
>ダイヤモンド 演算子と一緒に使えるのです。コンパイル時にエラーになってしまうような間違いの例を挙げてみましょう:
> @fd = (*STDIN, *STDOUT, *STDERR);
> $got = <$fd[0]> # 間違い
これって、ハンドルのリファレンスをハッシュに入れることは出来ないってことなんでしょうか。
以下のソースでエラーは出ないのですが、書き込みも読み込みも動きません。
package p_file;
my %ref_handle; #クラスで使うファイルハンドルのハッシュ(複数のファイルを同時に開けるようにしたい)
sub open {
my ($id, $path, $file) = @_;
local *FILE;
$ref_handle{$id} = \*FILE; #←ここが問題?
open($ref_handle{$id} , "+>>$path$file");
}
sub read {
my ($id, $row, $begin) = @_;
my @tmp = <{$ref_handle{$id}}>;
〜以下略
sub close {
my ($id) = @_;
close($ref_handle{$id});
}
>>518 君が引用しているのは一つ下の問答のようだが、当の URL の問答に
> 複数のハンドルや無名ハンドルを作りたいのであれば、
> Symbol, FileHandle, IO::Handle といったモジュールを参照してください。
とあり、その例も書いてある。また君が引用している問答の中に、
> このアプローチは print や printf をオブジェクトメソッドの呼び出しの
> ように扱うものですが、これはダイヤモンド演算子には使えません。
> なぜなら、ダイヤモンド演算子はカンマなしの引数を取る関数ではなくて
> 本当の演算子だからです。
と書いてある。
>>519 ありがとうございます。
確認不足でした。。
sprintf、printfの書式指定文字列について質問です。 my($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($_[0]); return sprintf("%04d%02d%02d", $year+1900, $mon+1, $day); なら "%04d%02d%02d" → 20050622 のようになることは理解できるのですが、 ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($new); $day = sprintf("%.4d/%.2d/%.2d", $year+1900, $mon+1,$day); で "%.4d/%.2d/%.2d" → 20050622 となるのはどうしてなんでしょうか。 この『.』の意味が、調べてみても手元の本には載っていなくてわからず、すっきりしません。 桁数の指定(例えば『5.2』とかの)の . ではないようですし・・・ そして、"%.4d/%.2d/%.2d" は "%04d%02d%02d" に書き換えちゃってもかまわないでしょうか?
>>521 手元の本に載ってなければマニュアルを読めばいいじゃない。
http://search.cpan.org/~nwclark/perl-5.8.7/pod/perlfunc.pod#sprintf 英語が苦手なら駱駝本を買えばいいじゃない。
>>7 > "%.4d/%.2d/%.2d" → 20050622 となるのはどうしてなんでしょうか
$year + 1900 を 4 桁の精度に丸めると 2005 、$mon + 1 を 2 桁の精度に
丸めて ( d は整数型指定子なので) 0 パディングすると 06 、$day を 2 桁
の精度に丸めると 22 、それぞれ当てはめて 2005/06/22
> "%.4d/%.2d/%.2d" は "%04d%02d%02d" に書き換えちゃってもかまわない
> でしょうか?
スラッシュが無くなっても構わないならご自由に。
523 :
nobodyさん :2005/06/22(水) 15:55:25 ID:pDQou/2T
cgiファイルのパーミッション設定をWS_ftpで755に変えようとすると。 Permission denied on server. (chmod)とでます。 その上のフォルダは変えられたのですが・・・ 上記のエラーはどういう意味なんでしょうか?
524 :
521 :2005/06/22(水) 16:18:22 ID:???
>522 ありがとうございます。 URL先読んでだいぶ分かりました。 そして手元の本を見直したら、 「.」の後の数値の意味に「文字列の最大幅」というのがちゃんと載ってました。orz 「5.2」のように「.」には必ず前後に数値がないといけないと思い込んでしまってました。 >スラッシュが無くなっても構わないならご自由に。 そうですね、下はスラッシュを入れてますね。気がつかなかった・・・ これは $day = sprintf("%04d%02d%02d", $year+1900, $mon+1,$day); $day =~ s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/; とやっておこうと思います。 どうもありがとうございました。
>>524 hint:
sprintf("%04d%02d%02d", $year, $mon, $day); #20050622
sprintf("%04d/%02d/%02d", $year, $mon, $day); #2005/06/22
sprintf("%04d年%02d月%02d日", $year, $mon, $day); #2005年06月22日
>>524 hint:
$hoge = "ほげ〜ほげ〜ほげ〜<br>お〜れ〜は%s\<br>ガ〜キだいしょ〜うっとくらあ";
$hoge = sprintf($hoge, 'ジャイアン');
529 :
nobodyさん :2005/06/22(水) 18:46:41 ID:VvFC8JSF
my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id}); my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id}); print br (), br (), "$row->{t} $row->{status}", " [", a ({-href => $edit_url}, "Edit"), "]", " [", a ({-href => $delete_url}, "Delete"), "]", br (), "\n", "$row->{content}\n"; 1行目のsprintfで文字列を指定して、出力しているのはわかります。 しかし、括弧内の意味がわかりません。変数"id"について、URLを指定しているらしい ですが、よくわかりません。 どっかに詳しく解説している、サイトとかありませんかね?
ネタか?
ありゃ、みなさんありがとうございます。 ええと、わざわざ後からスラッシュを入れる方式(>524)にした理由は、 配布されてるあるCGIをカスタマイズしていたら、 そのCGIには日付を取得するサブルーチン(>521の上)があって ほとんどの部分でそのサブルーチンを利用しているのに、 一カ所だけ利用していない(>521の下)部分があって、 どうしてこの部分では利用して無いのか?他と違うデータなのか? というのが始まりだったんです。 ちなみにそのCGIの他の箇所で「2005/06/22」形式のデータが必要な時は、 サブルーチンで「20050622」形式のデータを取得した後 s/(\d{4})(\d{2})(\d{2})/$1\/$2\/$3/; をやってましたので、それに揃えようかと。
532 :
nobodyさん :2005/06/22(水) 21:23:12 ID:SO7tDheg
突然すいません、CGI.pmって普通はどこに置くものなんですか? OSはRedhatなんですけど
perl/lib
こんなプログラムを考えています。 ・ID(10バイト程)を入力してもらう ・IDを受け取ったプログラムはIDを一行ごとに入力してある ファイルを順次読み込み(読みオンリーでオープン) 該当するIDがあるかどうかチェックする。 (対象のIDは5千件程度) というWebを作りたいんですが、読み込みオンリーで オープンしておけば一度に10人とか同じチェック側の プログラムを動かしてもロックかかったりしてパフォーマンス が落ちることはない?それともプログラム中で条件式(if?) の中で固定でチェックした方がいいのでしょうか?
読みオンリーならロックかける必要なくない?
意味が良くわからないんだけど
>>534 読み出しだけならロック不要だが5000件あるなら
dbmとか使ったほうがいいんでない?
5000 * 10 約 50kb くらいか。 微妙だ。
539 :
nobodyさん :2005/06/23(木) 01:58:38 ID:dskomwuH
>>525 スレを教えてくれてありがとうございました
5000行程度のデータなら別に気にしなくてもよいのでは? 処理を速攻で終わらせてメモリを開放してあげるほうが重要かと。sleepとか使っちゃダメ。 ・・・10人同時って、ほんとにそんな状況発生するのかな?
宜しくお願いします。 CGIを改造中なのですが、知恵を貸してください。 ログの情報を「○番目の要素でソートして表示する」と言うのをしたいのですが、うまくできません。 他のCGIからソート部分だろうと思われるものをコピッて手を加えたのですが、ダメです。 open(IN,"$logfile") || &error("Open Error : $logfile"); @data = <IN>; close(IN); @tmp = map {(split /<>/)[3]} @data; @slist = @data[sort {$tmp[$b] cmp $tmp[$a]} 0 .. $#tmp]; $i=0; $flag=0; while (@slist) { ($no,$date,$name,$genre,$com,$kousi,$day,$w1,$w2,$w3,$w4,$w5,$w6,$w7,$time,$mony,$tail,$w,$h) = split(/<>/); --------- $genreにソートしたいもの(g_1,g_2,g_3〜)が入っていて、それを元に並べ替えしたいんです。 この状態で動作させると、変数が入っていない表が無限に続いてしまいます。 どこが間違っているのでしょうか? お願いします。
543 :
nobodyさん :2005/06/23(木) 16:06:01 ID:AbvQdhd4
cgi.pmを使用して以下のようにクッキーを取得しました。 use CGI; $cookie = $cgi->cookie(-name => 'hoge', -value => 'fuga', -expires => '+1h', ); print $cgi->header(-cookie=>$cookie); この結果は Set-Cookie: hoge=fuga; path=/; expires=Thu, 23-Jun-2005 07:21:10 GMT Date: Thu, 23 Jun 2005 06:21:10 GMT Content-Type: text/html; charset=ISO-8859-1 のようになりうまくクッキーを取得したようです。 しかし、上のクッキーを取得するために print $cookie = $cgi->cookie(-name=>'hoge'); と記述しましたが、何も値が入ってませんでした。 cgi.pmを使用してクッキーを取得するにはどのようにしたらよいのでしょうか
>>544 どうでもいいけど、 q じゃなくて blockquote のような。
q でも間違いじゃないよ。インラインだし。 原文が段落あるんだろうから、blockquote のがいいけど。 blockquote だと p とか pre とかも入れないといけないけど。
>>534 まぁ5000件くらいじゃ大丈夫だと思う。
もっと多い場合の対処法としては
データファイルをソートしておく→IDが存在しない時早く終れる。
IDの頭文字別にデータファイルを用意する→個々のデータファイルが小さくなるから早く処理が終わる。
548 :
nobodyさん :2005/06/24(金) 05:19:50 ID:kge0P1YB
こんにちは。 他の方が製作したCGIに次のような記述がありました。 $\ = "\n"; print "<html>"; print "<body>"; print "<p>test</p>"; print "</body>"; print "</html>"; $\ = ""; これの最初の $\ = "\n"; についての質問です。 これは、恐らくHTMLソースの改行が目的であることは分かりますが、 $\ とはどういった変数なのでしょうか? また、同じように使える特殊な変数はあるのでしょうか? 検索エンジンで必死に調べたのですが、「$\」で絞り込むのは厳しいようで…。 ご教示お願いします。
>>548 printで末尾に出力するものを指定できる
552 :
nobodyさん :2005/06/24(金) 12:27:48 ID:QTITokL2
動的なhtmlページをダウンロードしたいので教えて下さい。 掲示板などのようにcgiやphpなどで動的に表示が変わるページを ページが表示されてからソースの表示をした時に見られるような htmlソースでダウンロードしたいのですが、やり方がわかりません。 また、niftyのサーバで動かしたいので特殊なモジュールも使用できないので それでも可能な方法があれば教えて下さい。 本当にやりたい事はその先で、そのソースをまたperlで解析して テキストを表示するというものです。 ダウンロードしたファイルからそのテキストをただ表示する部分は出来ているので ダウンロードの部分を教えて下さい。 宜しくお願いします。
説明が分かりにくすぎ。 まじめな話、もう少し日本語を勉強せよ
555 :
nobodyさん :2005/06/24(金) 15:58:04 ID:/NGYg1v6
Niftyは何の標準モジュールも故意に消されているので、使いたい場合は自分で用意する必要がある、って誰かが言ってたじゃあないか。 ということで使いたきゃ自分で必要なもの全部揃えてアップして使いなさい。
557 :
548 :2005/06/24(金) 17:18:12 ID:???
>>549-551 ご回答ありがとうございました。
Perlの特殊変数のページ非常に参考になりました。
難しくて全てを理解するまでは時間がかかりそうですが、
とりあえず気になったことが分かって嬉しいです。
558 :
あ :2005/06/24(金) 17:24:31 ID:L251Ppfj
超基本ですいません。 パッケージ内でグローバルな宣言をされた変数って、それぞれ別にNewで生成されたオブジェクト変数ごとで固有に持たせる方法はありますか? $a = new foo; $b = new foo; fooは内部のmyグローバル変数 s をもってて、set メソッドで代入しgetメソッドで取り出せるとします。 $a->set(100); $b->set(200); とすると、 print $a->get; で 200 と返ってきてしまいます… javaそのほかのようにインスタンスごとの固有値は持たせられないのでしょうか?基本的で申し訳ありませんがよろしくご教授ください。
すいません。 初歩的な質問宜しいでしょうか? perlで文字列の長さを取得する関数って ないのでしょうか? my $len = strlen('auaua'); ^^^^^こんなの、、、
length
>>558 > myグローバル変数
そりゃグローバル変数だからだ。
562 :
559 :2005/06/24(金) 17:46:00 ID:???
>560さん わーい 本当にありがとーございますっ
563 :
あ :2005/06/24(金) 18:01:45 ID:L251Ppfj
>>561 言い方が変でした。すいません。
ようは、パッケージのインスタンスごとに、変数値を持たせられる方法が知りたいのです。同一のパッケージから生成したインスタンスごとでも
$a->get ⇒ 100
$b->get ⇒ 200
のようにできるコーディングがどうすればいいかわかりません…
Perlではこのような動作の要求は無理なんでしょうか?
>>563 perl クラス インスタンス
でググって、三つ目くらいにある「Perlでオブジェクト指向」みてみそ。
>>548 ってヒアドキュメントとか使ったほうがよくないか?そうでもない?
sub new { my $class = shift; my $self = {}; bless ($self, $class); } sub set { my $self = shift; $self->{s} = shift; } sub get { my $self = shift; return $self->{s}; }
567 :
563 :2005/06/24(金) 18:26:07 ID:???
皆様ありがとうございます!糸口つかめました! ケータイからのカキコで必死だったためろくにsageませんでした;; なるほどです。感謝!
>>565 ヒアドキュメントの見た目が嫌いな人だったりして
なんでそんなどうでもいい話を発展させるんだ?
すいません質問があります。 始めの一文字が同じならtrueとしたいのですが そのような関数もしくはやり方等ないのでしょうか? 昔 if( ($abc cmp $def) >1 ){: このようなコード書いたような記憶はあるのですが、、、
今日は初心者以前の質問が多いような・・・。 if (substr ($abc, 0 , 1) eq substr ($def, 0 , 1)) { 〜 }
どっかでperlクイズのような宿題でも出たか?
println "aaa";って欲しいな。
それ自分で作ってやってるw でもそれでファイルには書けないんだけどさ。
何言ってんだこのバカ
お世話になります。 cgi-lib.plのReadParseで読み込んだデータ $in{'hoge'} (中身はチェックボックスで選択された複数のデータが入っています)があります。 print $in{'hoge'};とすると あああ いいい ううう えええ おおお かかか ききき くくく・・・のように半角スペース区切りのデータが出ますが、 これを あああ・いいい・ううう(改行) えええ・おおお・かかか(改行) ききき・くくく のように、3の倍数個目のデータには改行を、それ以外には中黒「・」で区切るようにして表示したいのです。 単純に区切り文字を他の文字に全て置き換えすることなら出来るのですが、ちょっと複雑になるとお手上げです。 ご教示よろしくお願いします。
577 :
nobodyさん :2005/06/25(土) 03:06:46 ID:VyiiD8SR
0x00で区切られない? 半角スペース区切りだっけ? 普通に split して for文使うとかはどうよ
>>576 例えば、区切りとしてじゃなく、各データのケツに改行とか中黒が着いてると考える。
つまり「3の倍数個目か」「最後のデータか」「それ以外」かで後ろに何をprintするか分岐したらいい。
ループの中にif文2個書いてもいいし、最後だけが例外的なのを利用してループが最後のデータ直前で終わるようにしてもいい。
あとは、 $_ = "あああ\0いいい\0ううう\0えええ\0おおお\0かかか\0ききき\0くくく"; while (/([^\0]*)\0([^\0]*)\0?([^\0]*)\0?/g) { print $1, ($2 ne '' && '・'. $2), ($3 ne '' && '・'. $3), "\n"; } とかな。
print join("・", split /\0/), "\n" for m/(?:[^\0]+\0?){3}/g;
すみません、Net:CIDR:Liteモジュールはどこで落とせばいいですか?
失礼しました、CPANから落とせました。 連続で申し訳ありませんが、これを実行すると Can't use string ("") as a subroutine ref while "strict refs" at 〜 となってしまいます。find()をするとこうなるのですが、どこがおかしいのですか? use Net::CIDR::Lite; my $net = Net::CIDR::Lite->new; my @airedgecidr = ( '221.119.8.0/24', '221.119.9.0/24' ); foreach (@airedgcidr) { $net->add($_); } $result = $net->find('221.119.8.1');
>>583 !
use strictしたところ、配列の変数名が間違っていることに気づきましたorz
ありがとうございました。
# rootさんのソースなのに…
んなもん誰にでもミスはあるさ
586 :
576 :2005/06/25(土) 20:03:10 ID:???
ありがとうございました。
>>579 のソースが私的にわかりやすかったので、使わせていただきます。
教えて下さい レンタルの日記を借りて、スキンを使ったのですが画像を投稿出来ないので 自分でスキンのタグを変更可能してもおkと書いてあったので 画像を無理やり出すイレギュラーってのをやりたいのですが 何を挿入していいか分かりません・・。 画像投稿可版・不可版(同スキン)を両方DLしてソースを見比べたのですが どうしても分らず、ぐぐっても分りませんでした・・。 どんなタグ?をどの辺りに挿入すればいいのか教えてもらえませんか・・? よろしくお願いします。 (どこで聞いていいか分からなかったのでスレ違いだったらすみません・・)
588 :
587 :2005/06/26(日) 03:24:35 ID:???
すみません、初心者で検索かけたのでスレ違いに今気づきました・・。 他で聞いて来ます。 申し訳ありませんでした・・。
589 :
nobodyさん :2005/06/26(日) 23:02:23 ID:3dNr93yG
下記のSOCKET通信プログラムにて画像を取得しているのですが、サーバによって print SOCKET "User-Agent: " . $browser . "\n"; で止まってしまうものがあるようです。 モジュールが入っていることは確認できているのですが、もしも なにかお気付きの点等ございましたらご教示いただきたく思って おります。どうか宜しくお願いいたします。 use Socket; use FileHandle; my $ip = inet_aton($host) || die "host($host) not found.\n"; my $sockaddr = pack_sockaddr_in($port, $ip); socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n"; connect(SOCKET, $sockaddr) || die "connect $host error.\n"; autoflush SOCKET (1); binmode(STDOUT); print SOCKET "GET $directory$filename HTTP/1.1\n"; print SOCKET "User-Agent: " . $browser . "\n"; print SOCKET "Host: " . $host . "\n"; print SOCKET "Connection: close\n\n"; while(<SOCKET>){ m/^Content-Type: ([^\r\n]+)/i && print "Content-Type: $1\r\n"; m/^Content-Length: ([^\r\n]+)/i && print "Content-Length: $1\r\n"; m/^\r\n$/ && last; } print "\r\n"; while(<SOCKET>){ print $_; } close(SOCKET);
>>589 なんで
> print SOCKET "User-Agent: " . $browser . "\n";
で止まってるって思ったの?
俺もそれ聞こうと思ってた
perlのコーディングを楽にするために、 HTMLの記述をprint "〜"に変換する作業を一括で行うソフトウェアを探しているのですが、そのようなソフトはありますか? 例えば、 <a href="abc.html">ABC</a> を print "<a href=\"abc.html\">ABC</a>" と変換できるものです。
なんていうか、ヒアドキュメントとかqqとか知ってる?
ガーン・・・
そんな方法があったんですか・・・・。今日はじめた初心者だったのでごめんなさい。
>>593 さんありがとう('A`)
大正解
ちょっとウケタw
>>590 ご返答有難うございます。
止まっていると思ったのは、
print SOCKET "User-Agent: " . $browser . "\n";
print SOCKET "Host: " . $host . "\n";
を外したら進んだためです。
具体的には、KeitaiPicutureという画像変換サービスで変換された
画像をSOCKETでとってくる仕組みを作っているのですが、
GET $directory$filename?User-Agent=UA
だと成功するんですよね。
とにかくご教示有難うございました。
>>598 そのサービスが$ENV{HTTP_USER_AGENT}じゃなくてクエリーのUser-Agentを見てるからだろ。
>>598 それから、telnetで直接やってみ。そこで止まってるわけじゃないから。
601 :
nobodyさん :2005/06/27(月) 08:08:58 ID:7ZY2M4BI
HERE。字あってるか忘れたけど、たぶんこれでできるはず。
602 :
nobodyさん :2005/06/28(火) 16:25:00 ID:l0OJ7VtD
#!/usr/local/bin/perl
use
HTTP::Request; use LWP::UserAgent;
my $url = '
http://www.yahoo.co.jp ';
my $request =
HTTP::Request- >new(GET => $url);
my $ua = LWP::UserAgent->new;
my $response = $ua->request($request);
if($response->is_success) {
print $response->content;
} else {
print $response->status_line;
}
という LWP::UserAgent をテストするためのCGIを、サンプルを元に組んだのですが、
[Tue Jun 28 15:42:43 2005] [error] Premature end of script headers:
ということで 500 Internal Server Error になってしまいます。
Premeture〜ってぐぐってみたけどよくわかりません。
原因として何が考えられますか?
ようわからんが、print "Content-type: text/html\n\n"; が抜けてるとか。
604 :
602 :2005/06/28(火) 17:06:17 ID:???
>>603 ああああああああ〜〜
それでした〜〜
ありがとうございました〜〜
トホホ
すいません 質問があります。 -------------------------------- my %dir_name=(); readDir(\@dir_name); sub readDir{ my $dirname_ref = shift; $dirname_ref->{'aaa'}="BBB"; } -------------------------------- を実行しても Can't coerce array into hash at cron_day_table.cgi line 50. とエラーになってしまいます。 何がいけないのでしょうか? ご助力を頂けますと助かります。
>>606 エラーメッセージの通りじゃん。 readDir(\%dir_name); じゃないの。
608 :
606 :2005/06/28(火) 18:17:44 ID:???
あ、、、 本当だー ありがとーございますっ スレ汚し失礼いたしました。
609 :
606 :2005/06/28(火) 19:37:41 ID:???
たびたび本当にすいません 質問があります。 my %dir_name=(); my $dirname_ref = \%dir_name; $dirname_ref->{'bbb'}='hoge'; $dirname_ref->{'ccc'}='hoge'; $dirname_ref->{'aaa'}='hoge'; my $key; foreach $key(keys %dir_name){ print "$key -> $dir_name{$key}\n"; } -------------------------------- として出力すると↓ -------------------------------- bbb -> hoge aaa -> hoge ccc -> hoge -------------------------------- のようになってしまいます。 下記のように入れた順番通りに出力したいのですが bbb -> hoge ccc -> hoge aaa -> hoge そういった場合はどうすればよろしいのでしょうか? ご助力を頂けますと助かります。
そういや、 pseudo hash ってなかったっけ? もしかして、無かったことになった?
use strictしとけ。そういう単純ミスが防げるぞ。
>>609 スマートじゃないけど。
my %dir_name=();
my $dirname_ref = \%dir_name;
$dirname_ref->{'bbb'} = ['hoge', 1];
$dirname_ref->{'ccc'} = ['hoge', 2];
$dirname_ref->{'aaa'} = ['hoge', 3];
foreach my $dir (sort{$a->[1]->[1] <=> $b->[1]->[1]} map{ [$_, $dir_name{$_}] } keys %dir_name){
print "$dir->[0] -> $dir->[1]->[0]\n";
}
617 :
nobodyさん :2005/06/29(水) 23:40:40 ID:4HgpqCXd
変な質問ですみません。 どうしてこれで "0_" と表示できないのか教えて下さい。 $i = 0; print "$i_\n";
619 :
617 :2005/06/30(木) 00:06:48 ID:nq4lXHpH
すみません、自分なりに調べても分からなかったのですが、 ここでのアンダースコアはどのように効いているのでしょうか? 否定の演算子でもなさそうなのですが・・・
>>619 識別子には_も使えるから。($i_という変数も有り得る)
621 :
617 :2005/06/30(木) 00:29:51 ID:???
>>620 なるほど、よくわかりました。
どうもありがとうございます。
622 :
nobodyさん :2005/06/30(木) 01:13:28 ID:8FYD6O0q
掲示板みたいな簡単なCGIでも、フォームデコードとか細かくモジュール使うべきなんでしょうか? 簡単なの持っててもえーかな思ったんだけど、チェックボックスとかの複数選択がどーにもできんのです。。 複数のバリュあるときは配列にするのなら、 if (defined $form{$key}){ if(ref $form{$key}){ push @$key,$value; } else{ @$key=($form{$key},$value); $form{$key}=\@$key; } } うろ覚えで書いたんで変かも・・・っていうか、@$keyがおかしいケド。こんな感じで良いのでしょうか? プログラムそのものもperlが初めてなんで要領得なくて サブルーチン内外で変数共有しない方がいいのかと思ったんだけど、リファレンスする配列が局所化できません。
#複数のバリューあるときは「リファレンス」?にするのなら 参考にしたスクリプトで使われてたcgi-liteだかではそうなってたような気が。 そして、sageってシステムがよくわからない・・・申し訳ないです。
ハッシュに配列つっこむならこんな感じ。 push @{$form{$key}},$value; リファレンスするならこんな感じかの。 push @{$$form{$key}},$value; でも、別に配列にこだわらなくてもいい気がする。
625 :
606 :2005/06/30(木) 11:45:29 ID:???
にゅおーー 本当にみなさんRESありがとうございます。 順番を保持する配列とその配列の要素をキーとするハッシュで やる方法で自作し強引に解決(?)いたしました。 本当にRESどうもですっ そのうちこちらで解決案を書ける人になれますようがんばりますですっ
>>621 後ろの文字を識別子の文字と区別したいときは { } を使う。
print "${i}_\n";
627 :
nobodyさん :2005/06/30(木) 13:17:05 ID:wTRNDiAZ
すいません、質問お願いします。 &decrypt(入力されたパスワード、登録されてるパスワード) sub decrypt { local($in, $dec) = @_; local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2); if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) { return (1); } else { return (0); } } パスワード認証のサンプルなんですけど、 入力されたパスワードが認証されれば1を間違っていれば0を返すサブルーチンなんですが、 local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2); if (crypt($in, $salt) eq $dec || crypt($in, '$1$' . $salt) eq $dec) { ↑の部分がどうしてもわからないのですが御教授お願いします。
多分、 Perl のコードがわからないというより crypt() がわからないんだと思う。 crypt() の仕組みが理解できてないとキツいと思うので、 「crypt パスワード」あたりでぐぐって調べてみるのが良いと思う。
629 :
nobodyさん :2005/06/30(木) 14:05:04 ID:wTRNDiAZ
>>628 ありがとうございます。crypt()は勘違いして覚えてました。
変換キーに2文字じゃなきゃいけないんですね。
それで
substr($dec, 0, 2);
の意味はわかったんですが
$dec =~ /^\$1\$(.*)\$/ && $1
と
crypt($in, '$1$' . $salt) eq $dec
の部分がまだわからないのですが
お願いします。
substr が分かるなら、こう書けば理解できる? # - - - - - - - - - - - - $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || if ( length $dec >= 3 && substr($dec, 0, 2) eq '$1$' && substr($dec, -1, 1) eq '$' ) { $salt = substr($dec, 2); chop $salt ; } # - - - - - - - - - - - - if (crypt($in, '$1$' . $salt) eq $dec) || my $tmp = '$1$' . $salt; if (crypt($in, $tmp) eq $dec) # - - - - - - - - - - - - とりあえず正規表現学んで来い、といいたい。 作者が $1$ *** $ とつけてるのはよくわからない。
ところどころ何故か無駄な改行が入ったw スマン
MD5とDESの違いだね。
633 :
nobodyさん :2005/06/30(木) 16:30:42 ID:wTRNDiAZ
>>630 ありがとうございます。
一行づつなら理解できるのですが、
$dec =~ /^\$1\$(.*)\$/
↑この表現は変数$decの頭が $1$ で任意の文字がいくつか入って
その後 $ の文字列にマッチするか否かと理解していいんでしょうか?
$1$ これって特別な意味あるんですか?
local $salt = $dec =~ /^\$1\$(.*)\$/ && $1 || substr($dec, 0, 2);
あと上の処理の順番がよくわらないんですが
A && B Aが真ならBを実行
A || B Aが偽ならBを実行
と言うのならわかるのですが
その辺もご教授願えないでしょうか
一応本を見ながらやっているのですがイマイチ理解できません。
ちゅーか、これで十分な気がするのだが。 sub decrypt { crypt($_[0], $_[1]) eq $_[1]; }
質問です宜しくお願いします $in{race}="aa"; $raceindex="bb"; if($in{race} == $raceindex){print "ok";} exit; これを実行すると$in{race}の内容と$raceindexの内容は同じではないはずなのに if分は真となってokと表示されます これはif分の書き方がおかしいのでしょうか
>>636 有難う御座います
perlのスクリプト書くの1年ぶりですっかり忘れてました
無事解決しました
有難う御座いました
karame.comみたいな、特定のアドレスにメールが来たらその送信元アドレスに"Hello world!"とでも書いたメールを送信できるスクリプトを作りたいのですが、具体的にどうやればよいのかわかりません。 サーバからsendmailの使用は許可されているのですが、どうやったらメールが来たことが検出できるのかまるでわからないのです。 申し訳ありませんが一手ご教授下さいくださいですよ
>>633 $1$で始まるのはMD5でハッシュ化された文字列です
$1$から次の$までの文字列がハッシュ化のsaltになります
そのサブルーチンはDESとMD5の両方使えるようにしているようだけど意味無いと思われます
DES,MD5どっちを使うかはcrypt関数が知っておりsaltも自動的に判断されるので
>>634 で十分です。
640 :
わから〜ん :2005/06/30(木) 19:18:36 ID:UYjObKP/
1行目 my $edit_url = sprintf ("%s?choice=edit;id=%d", url (), $row->{id}); 2行目 my $delete_url = sprintf ("%s?choice=delete;id=%d", url (), $row->{id}); 3行目 print br (), br (), 4行目 "$row->{t} $row->{status}", 5行目 " [", a ({-href => $edit_url}, "Edit"), "]", 6行目 " [", a ({-href => $delete_url}, "Delete"), "]", 7行目 br (), "\n", 8行目 "$row->{content}\n"; 1行目の sprinfで整形された文字列 my $edit_url変数に代入される。 2行目も同じ要領で、my $delet_url変数に代入される。 3行目は HTML表示 4行目 意味不明 5行目 1行目の変数が"edit"としてURL表示される。 6行目 2行目の変数が"delete"としてURL表示される。 7行目 HTML表示 8行目 意味不明 ご質問いたします。 (1)4行目の意味がわからない (2)5行目と6行目がなぜ、editとdeleteのURL表示となるのか? (3)8行目の意味がわからない 特に、(2)の質問を詳しく解説してください。(2)の用法について ラクダ本に記述がありますか? よろしくお願いいたします。
もう夏休みなのか?
「リファレンス」 を知らないのもあるような。 ぐぐれー。
644 :
わから〜ん :2005/06/30(木) 20:11:02 ID:UYjObKP/
PerlのCGIモジュールを使っているのですね。 必死にいろんな本読んでも、記述が無いわけですね。 URLのところを読んで、勉強します。 大変ありがとうございました。
645 :
>>627 :2005/07/01(金) 18:26:12 ID:???
ありがとうございました。
$1$が謎だったので助かりました。
MD5とDESというのはレベルが高くてよくわかりませんが、
とりあえずそういうものだと思って頭の片隅においておきます。
今の段階では
>>634 のやり方で問題ないとわかっただけ十分です。
CGI.pmを使う利点は何ですか? 普通に$ENV{'QUERY_STRING'}などと変わらないような気がするのですが…
そう思うのなら使わなければいい 今時つかうやつも少ないだろうしな
あ、少ないんだ?
まじすか、今から使っていこうと思ってたのだがorz
フォームデコード程度なら必要ないっしょ CGI::Liteだってあるし
CGI.pmの利点が分からないなら、使ってみればいいのに。 分からないかも知れないけど。
なんかPHPっぽいねw>CGI.pm
653 :
622 :2005/07/02(土) 14:20:11 ID:???
>>624 ありがとうございます。どうも、リファレンスで混乱してたようです^^;
「.=」して分割を考えるとかでも十分なのかな。。
モジュールは勉強したいとは思うけれど、種類の多さ機能の多さに・・・
そもそも、なんかもっと根本的な部分で知識と理解が足りてなさすぎる。。
>>653 そうそう、そんな感じ。
複数データはタブとか改行で区切るだけでも十分。
どうせ汚染チェックは必要なんだから、タブや改行はそこで取り除けばいいだけだし。
モジュールはセキュリティに気を配って書かれているのは良いけど無駄が多いからなぁ。
データの区切りと言えば、前、レコードの区切りは改行、フィールドの 区切りはタブでデータを記録してた時、フィールド内をさらに区切りたくて、 そのときタブも改行も使えないから何を使えばよいか迷って、結局^fだか^gを 使ったんだけど、こういうときにどういう制御文字を使う(または使う順序)の 約束事みたいなのあるかなと思って調べてわからなかったんだけど、 なにかあります?
データに含まれない文字
\x00-\x07\x0E-\x1A\x1C-\x1F\x7F\xFF あたりとか。
自分なりに調べてみても分からなかったので質問です。 ファイルオープンのとき、読み取りモードで開こうとしてファイルがなかった場合に、新しく生成させるために &file_open(*FILEHANDLE,path)を定義してやってるんですが、 &file_open(FILE,$filepath); flock(FILE,1); とすると500Internal(以下略 が出てプロセスのタイムアウトとか言われます。 ファイルロックしているファイルにアクセスしようとしてるのかと思って調べてみましたがそうでもないみたいです。 なにか心当たりがあれば教えていただけませんか?
訂正 5行目 ×&file_open(FILE,$filepath); ○&file_open(*FILE,$filepath);
661 :
658 :2005/07/03(日) 04:39:10 ID:???
>>660 大変失礼しました。
もちろんローカルサーバでテストを行っていますが、「プロセス中にタイムアウトしました」としか
メッセージが出なかったもので、そのまま書いてしまいました。
3行ほどのテストプログラムを組んでコマンドプロンプトで実行させてみたところ、
いつまで待っても処理が終わらず、さらに問題と思われる行の前後で文字列を出力させてみたところ、
前ではうまく出力しますが後では出力しないため、問題がこの行にあるのは明白だと思われます。
&file_openのソースは以下のとおりです。
sub file_open{
local *FILE = shift;
my $filename = shift;
if(! -e $filename){
my $fntemp = $filename;
$fntemp =~ s/^(\>|\<|\+)*//;
open(NEW,">$fntemp");
close(NEW);
}
if(!open(FILE,"$filename")){&sub_error(2);}
return;
}
663 :
658 :2005/07/03(日) 14:25:42 ID:???
>>662 読ませて頂きましたが、使い方は私ので合っていると思います。
ただ、ファイルオープン後にflock関数が使えないという点について何か教えていただけませんでしょうか。
わざわざへんてこなサブルーチン作ってバグ呼び込むようなことしなくても sysopenでO_CREAT使えば一発なわけだが。
666 :
658 :2005/07/03(日) 16:00:37 ID:???
ぜんぜんわかんないです・・・。。。 ファイルハンドルを局所化して使うと、サブルーチンの外ではflockは使えないのですか?
>>666 試してみたがお前のプログラムは限定された状況でなら動くので、
問題は別のところにあると思われる。
% cat foo.pl
my $filepath = "foo";
&file_open(FILE,$filepath);
flock(FILE,1) or die "flock: $!";
sub file_open{
local *FILE = shift;
my $filename = shift;
if(! -e $filename){
my $fntemp = $filename;
$fntemp =~ s/^(\>|\<|\+)*//;
open(NEW,">$fntemp") or die "open NEW: $!";
close(NEW);
}
if(!open(FILE,"$filename")){&sub_error(2);}
return;
}
(続く)
(続き) % strace perl foo.pl (中略) stat64("foo", 0x814d0c8) = -1 ENOENT (No such file or directory) open("foo", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3 ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffff5a8) = -1 ENOTTY (Inappropriate ioctl for device) _llseek(3, 0, [0], SEEK_CUR) = 0 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 close(3) = 0 open("foo", O_RDONLY|O_LARGEFILE) = 3 ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffff5a8) = -1 ENOTTY (Inappropriate ioctl for device) _llseek(3, 0, [0], SEEK_CUR) = 0 fstat64(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 flock(3, LOCK_SH) = 0 close(3) = 0 exit_group(0) = ? ファイルは開かれているしflockも正常終了している。
ただし以下のような問題があるのできちんと勉強して書き直した方がいい。 file_openに渡している'FILE'はただの文字列なので、呼び元と file_openが別パッケージのときにおかしくなるだろう。 open(NEW,..)の戻り値を見ていない。せめてdieぐらいしとけ。 -eで調べてなければファイルを作っているが、ここがアトミック に実行されていないのでそのうちメチャクチャになるだろう。 最後の問題のおかしくなるシナリオの例はこんな感じだ。 (プロセスA) -eでファイル調べたらなかった (プロセスB) -eでファイル調べたらなかった (プロセスA) ファイル作ってflockしていろいろ書き込む (プロセスB) open(NEW ">$fntemp")いきなりやるのでAが書き込んだファイルが空っぽに
671 :
658 :2005/07/03(日) 17:01:45 ID:???
>>667-669 ありがとうございます!
視点を変えてもうすこしバグフィックスしてみますね。
最後の問題は、もう少し煮詰める必要がありそうですね。
open(NEW,"+>$fntemp");truncate・・・のほうがいいんでしょうか。
ともあれ、本件は本当にありでした。
まだ問題の解決になっていませんが、とりあえず問題がこのルーチン以外にあるということが分かったのでもう少し考えて見ます。
>>655 データファイルとして保存する際、特殊な制御文字を使うのはあまりおすすめしない。
テキストエディタでメンテナンスする時のことを考えるとね。
スペースとかカンマとかで区切っちゃっていいんじゃないの?
checkboxやselectでスペースやカンマを使用しなければ済む話なんだから。
他のシステムで読み書きする必要がなければ Storableが楽だと思う。
>>673 Data::Dumper の Dump()なら単なるテキストファイル
script内に、ある package が取り込まれている、ってことをどう調べたらいいのかな? # Hoge->new() があるかどうか、ってことは ↓ みたいにすればできるみたいなんだけど use strict; print defined Hoge; # これは error print defined &Hoge::new ? 1 : 0; # 1 print defined Moge; # これも error print defined &Moge::new ? 1 : 0; # 0 package Hoge; sub new {}
>>675 print exists $main::{"Hoge::"};
うわ、できてる! すごっ
>>676 ありがとうー。
でも何で? どういう理屈?
リソースとかあったら教えてほしいわ。
・・・あ、あった(笑) ありーー
@arr = ([0, 1, 2], [3, 4, 5]); の状態で @{ $arr[0] } とすると $arr[0]にある無名配列の参照をデリファレンスしてリストとして見ている という意味でしょうか?
頼むから訊く前に試してくれ
682 :
680 :2005/07/05(火) 05:46:53 ID:???
試した後でした。失礼しました。
はあ?
なあ、そろそろageない?
685 :
nobodyさん :2005/07/06(水) 11:33:27 ID:FWp4IWEU
質問です。よろしくお願いします。 aaaaのデータベースのレコードの情報6行分をハッシュbbbbに入れて、 その後ハッシュの配列?ccccに入れるプログラムを作りたいのですが、 期待する結果が出てくれず困っています。 test01の結果は、普通に6行分表示されるのでOKなのですが、 test02の結果は、6行目のレコードの情報が6回表示されてしまいます。 なぜ最後の6行目の情報だけが6回入ってしまうのでしょうか?よろしくお願いします。
686 :
プログラム :2005/07/06(水) 11:34:05 ID:FWp4IWEU
※@$aaaaにはデータベースのレコード6行分が間違いなく入っています。 my @cccc; my %bbbb; foreach(@$aaaa){ $bbbb{'1111'} = $_->{'1111'}; $bbbb{'2222'} = $_->{'2222'}; $bbbb{'3333'} = $_->{'3333'}; #%bbbbのテスト表示(test01) my $key; foreach $key(keys(%bbbb)){ print "キー:".$key."\n<BR>"; print "値:".$bbbb{$key}."<BR><BR>\n"; } push(@cccc,\%bbbb); } #$@ccccのテスト表示(test02) my $key; my $value; my $j; for($j=0;$j<@cccc;$j++){ while(($key,$value) = each(%{$cccc[$j]})){ print "キー = ".$key."<BR>\n"; print "値 = ".$value."<BR><BR>\n"; } }
%bbbbはループの度に上書きされてるよね。 pushしたリファレンスは全部同じ一つの%bbbbを参照してる。 中身は最後に上書きされた六行目。
拡張子からサーバーに登録済みの MIME タイプを引きたいのですが どうすればいいのか見当もつきません。 例えば '.jpg' から 'image/jpeg' を得たいということです。 インターネットサービスマネージャのコンピュータのプロパティの コンピュータ MIME マップをクリックして出てくるリストです。 サーバーは Windows 2000 Server SP4 上の IIS 5.0 (.NET なし) で Active Perl 5.8.4 Build 810 のようです。 何かいい方法があればご教授ください。どうぞよろしくお願いします。
>>689 ありがとうございます。
しかしながら、いずれも私が欲しいリストとは異なるようです。
A は非常に近いものが得られますが、OS の MIME タイプと
IIS のマスタプロパティに設定された MIME タイプは違います。
IIS ではルート (仮想サーバー) 以下のフォルダにも追加できますが、
それはないようでした。
IIS の MIME タイプは %SystemRoot%\system32\inetsrv\MetaBase.bin
に保存されることはわかったんですが、中身の形式がわからないので
直接設定を読むことはあきらめ、ListBox から抜いたものを手作業で
ファイルにして使うことにします。
滅多に変更する人はいないので、実用上の問題はないと思います。
>>691 興味深いですが、私のスキルではすぐに理解できません。
実はかなり初心者で、COM とか ActiveX 関係はさっぱりです。
とりあえず専用プログラムで ListBox のウィンドウから取り出してもらうと
いうことで落ち着きましたので、もう少し勉強してから考えてみます。
693 :
nobodyさん :2005/07/08(金) 15:51:55 ID:8f5N4Odz
えーと、下記のようなプログラムを作ったとき、 $namae = "100"; $test = "test3.txt"; open(TEST,"<$test"); print "Content-type: text/html\n\n"; while(<TEST>) { print; } test3.txtの中身 $namae プログラムを動かしてみると、ブラウザに表示されるのは $namae っていう文字になってしまいます。 これを、 100 と表示させたいのですが、どうすればいいのでしょうか・・・
>>693 eval
と言いたいところだが、 test3.txt の中身をいたずらされると怖いので、こんな感じで。
$namae = "100";
%data = ('namae' => $namae);
$test = "test3.txt";
open(TEST,"<$test");
print "Content-type: text/html\n\n";
while(<TEST>) {
s/\$(\w+)/$data{$1}/g;
print;
}
695 :
693 :2005/07/08(金) 21:16:45 ID:nSk2Gtk0
>>694 ありがとうございます。さっそく帰ったら試して見ます。
text3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
696 :
693 :2005/07/08(金) 21:16:59 ID:nSk2Gtk0
>>694 ありがとうございます。さっそく帰ったら試して見ます。
test3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
>>695 そうそう、こんな感じで。
$omae = "200";
%data = ('namae' => $namae, 'omae' => $omae);
# あとは同じ
698 :
693 :2005/07/09(土) 02:20:01 ID:Kb/ss4Wf
>>697 ありがとうございます!
無事に動きました。
あとは、これを理解して、自分の物にします。
どうもありがとうございました。
<どうでもいいこと>左辺値のクォート要らない</どうでもいいこと>
>>699 <どうでもいこと>クォートがいらないのは"=>演算子の"左辺値が"英数字のみで構成されているとき"のみ</どうでもいいこと>
# s/(英数字のみ)/アンダーバーと$1かハイフンから始まるアンダーバーと$1/;
use encoding
まじレスすると=>の左辺値を文字列として解釈してくれるパターンこうなんだけどね。 /^-?[a-zA-Z_]+\w*$/ 数字で始まったり、先頭のマイナスの直後が数字だったりすると数値として解釈される。 さらにその後がアルファベットだったりすると構文エラーになる。 ハッシュの要素参照の{}も同じだね。 構文エラーになる分には気が付くからいいけど、01=>'a'とか、0_2=>'b'とか、-03=>'c'とかするとはまるよ。
705 :
502 :2005/07/10(日) 09:22:13 ID:???
ハッシュのキー、変数から取り込むときは、日本語でもクオートで 囲まないでもできますけど、自動でクオートしてくれてるってこと? while(<>){ $hash{(split[0])} = (split)[1]; ... なんて。
>>502 クォートされてないから変数の値がつかわれるんだRO。
707 :
502 :2005/07/10(日) 17:54:56 ID:???
>>706 そうですね。よく考えてみると疑問に思うほどのことはなかったか。
ん・・・
>>699 よくこのツッコミ見かけるのだが、クォートすると何か不具合でも起こるの?
まったく問題ない。
むしろクォートして欲しい
だが拒否する
宗教論にしかならないから(Perlゆえことさら)もうやめとけ。
なんでだよ。コーディングスタイル上の重要なポイントにかんする議論だろ。
TMTOWTDI
荒らしたいだけの奴がいますな。 スルーが吉。 一人二役以上で自演して荒れてるように見せるかもしれないけど、 全部スルーするのが吉。
717 :
nobodyさん :2005/07/14(木) 11:35:37 ID:0L4aMOkE
719 :
717 :2005/07/14(木) 12:35:19 ID:???
720 :
nobodyさん :2005/07/15(金) 08:49:12 ID:cv7TvBaQ
歴史上一度も質問されたことのないコーディングについての普通のレベルの質問って何かありますか?
perl勉強中のものです。 簡単なシュミレータを作ってCGIとして公開したいと思っているのですが 一時間に一回程度のペースでクライアントのアクセスのあるなしにかかわらず perlで更新させるにはどう書けばよいでしょうか どなたか詳しい方ご教授お願いします。
>>721 とりあえずクローンタブとか調べた方が良いと思われ
配列に収められたハッシュリファレンスの特定キーの値で重複を削除したいのですが、 どーすりゃいいですか。
725 :
723 :2005/07/15(金) 14:25:42 ID:???
$hoge={ url=>'http〜', title=>'うんたら', time=>11212161, }; みたいなのが詰まっている配列mogeがありまして、 urlの値でいくつか重複がある(のを区別できる)ようなので、 それ含む$moge[m]を削除したいのです。 (つまり $moge[n]{url} と $moge[m]{url} が同じときに $moge[m]を削除したい) grepを使うんでしょうが、右辺をどうやればいいのかわからないのです。
>>725 @in_array = (
{url=>'
http://hoge.hoge1/ ',title=>'うんたら1',time=>1111111}, #<--重複
{url=>'
http://hoge.hoge2/ ',title=>'うんたら2',time=>1111122},
{url=>'
http://hoge.hoge1/ ',title=>'うんたら4',time=>1112222}, #<--重複
{url=>'
http://hoge.hoge3/ ',title=>'うんたら3',time=>1112332},
);
#順番が入れ代わってもいい場合かつ後入優先
$tmp_hash{$_->{url}} = $_ for @in_array;
@out_array = values %tmp_hash;
#順番が入れ代わってもいい場合かつ先入優先
$tmp_hash{$_->{url}} = $_ for reverse @in_array;
@out_array = values %tmp_hash;
#順番を入れかえない場合後入優先
$tmp_hash{$_->{url}} = [$_,$i++] for @in_array;
@out_array = map{$_->[0]} sort {$a->[1] cmp $b->[1]} values %tmp_hash;
#順番を入れかえない場合先入優先
$tmp_hash{$_->{url}} = [$_,$i++] for reverse @in_array;
@out_array = map{$_->[0]} sort {$b->[1] cmp $a->[1]} values %tmp_hash;
729 :
723 :2005/07/15(金) 15:24:57 ID:???
>>725-726 おおお、ありがとう!
つまりurlの値をキー名にしたハッシュを作って、値のリストを得るのか!
726のほうは725のをコンパクトにしたものと見ていいのかな。
++のところで何が起きているのかよくわかりませんが。
>>729 1回でも出てきたら値が1以上なので真になる。
!がついてるので2回目以降は偽。
クールっつーか、イディオムだろ。
>>7 のPerlメモくらい読めよ。
次のような場合、本当は、100を表示させたいのですが10が表示されてしまいます。 testサブルーチンでmyを付け忘れているのですがエラーも警告もでません。 これを回避するためにはどうのような記述をしたらいいのでしょう? use warnings; use strict; my $x = 100; test(); print "Content-Type: text/html\n\n"; print $x; sub test{ $x = 10; }
>>732 レキシカルスコープの有効範囲についてよく勉強することを
薦めるが、この場合最初のmy $xの有効範囲はファイルの終わり
までになるので、testサブルーチンの中からも見えてしまう。
回避するための記述の仕方はいろいろあるんじゃないかと思う
が、オレはmainサブルーチンを作ることにしてるな。これなら
testサブルーチンでエラーになるはず。
use warnings;
use strict;
main();
exit;
sub main {
my $x = 100;
test();
print "Content-Type: text/html\n\n";
print $x;
}
sub test{
$x = 10;
}
自分は一番上に my 書くと、サブルーチン内ではクロージャみたいに扱われる、って解釈してる。
>>733 わざわざサブルーチン作らんでも。
use warnings;
use strict;
{
my $x = 100;
test();
print "Content-Type: text/html\n\n";
print $x;
}
sub test{
$x = 10;
}
で逝ける。
>>733 >>734 なるほど、サブルーチンにしろブロックにしろ
メインルーチンをブロックに押し込めて
メインルーチンとサブルーチンのスコープを外すわけですね。
一瞬、ブロックを外れたmyは、use strictの場合
警告だしてもいいんじゃないのかなとか思ったんですが
>>733-734 のような書き方をすれば
1つのソースファイル内のみで定義されているサブルーチン間で
共通の変数を使いたいときにブロックの外でmyを使えば
ourみたいに他のソースファイルに影響を与えないわけですね。
てかPerl、奥深すぎ。
わかりました、ありがとうございました。
簡単なデータベースをperlで書こうと思っているのですが 生産地、商品、価格のカテゴリーがあるとして ○生産地フォルダ→商品ファイル→価格 という方式と ○生産地ファイル→商品リスト→価格 という方式と ○生産地リスト→商品+タグ+価格でデータ取得時にタグを取るプログラムを書く方式 の3つの方法があるとしてどれくらい負荷が違うものなのですか? 私がやりたいのはもう少しだけ複雑なデータなので大差が無いならわかりやすい一番上の方式をとりたいです。 ご教授よろしくお願いします。
>>735 > ourみたいに他のソースファイルに影響を
our は影響与えちゃうよw
Warning: Use of "our みたいに" is ambiguous at
>>735 line 10.
ourは他のファイルには影響しないよ。 varsと違って、チェック機構そのものはレキシカルスコープをもつから。
そういや、ハッシュのキーでさ、お作法として、 アンダースコアから始まるのはプライベート、とかあるけど、 ハイフンから始まるのは何か意味ってあるの?
HTMLへ記述した次のリンクがうまく動作しないのです。 <a href="$script?mode=help&no=$no>ほげ</a> $scriptはスクリプトURLが入ります。→OK mode=helpはhelpモードへ入ります。→OK しかし&以下、no=$noがうまく動作しません。 $noは任意の数字が入ります。そして、それを・・・ print "<form method='$method' action='$script' name=help_form>"; print "<input type=hidden name=no value='$in{'no'}'>"; この$in{'no'}'へ入れたいのですが、動かしてみるとvalue=''になってしまい 数値が入力されません。 どうすれば動作するようになるでしょうか・ #リンクの書き方??
シングルクォート ダブルクォート
>>742 2行目をコピペして以下のように$in{'no'}に
値を入れて実行すると
$in{'no'} = 100;
print "<input type=hidden name=no value='$in{'no'}'>";
結果は
<input type=hidden name=no value='100'>
となって正常に見えるので、間違ってるのはここではないな。
$in{'no'}に値はちゃんと入ってるか?
value=''ってことは$in{'no'}が空ってことだろ なぜ空なのかはエスパーじゃないからわからない
>>742 <a href="$script?mode=help\&no=$no">ほげ</a>
にしてみては?
下の文は no=$no が機能してないから空なんじゃないの?
747 :
746 :2005/07/20(水) 21:04:09 ID:???
失礼、実態参照されてしまった。 <a href="$script?mode=help\&no=$no">ほげ</a>
748 :
742 :2005/07/20(水) 22:26:23 ID:???
>>743 シングルクオートをダブルクオートにしても、クオートなしにしても、
リンクのno=$noが入ってこない。valueが空なのです。
>>746 試してみます。
749 :
nobodyさん :2005/07/20(水) 22:30:25 ID:8r7NrGN/
CGIのBBSを作っています。 print で <img> を書くと Internal Server Errorになる気がします。 何か対処方法はありますか?
あきらめる
751 :
742 :2005/07/20(水) 22:31:58 ID:???
>>746 アンカータグの中の$noは、スクリプトの中から取得した数字で
そこはちゃんと数字が入っています。
だから本当は、このスクリプトを動かすと、
<a href="〜cgi?mode=help&1">クリックすべし</a>
という形になります。で、&以下の1の部分が、リンクタグをクリックした
先のフォームの中の
print "<input type=hidden name=no value='$in{'no'}'>";
ここに入る・・・予定だったのに入らない。
フォームボタンなんかだったら$FORM{'no'}とするところですが
752 :
742 :2005/07/20(水) 22:33:10 ID:???
>>749 それは気のせいです。別のどこかを間違ってます。
753 :
742 :2005/07/20(水) 22:36:12 ID:???
連続投稿で申し訳ない。
>>746 ダメでした・・・
もう一回スクリプト眺めてみます。
おまいの言ってる%inと%FORMの違いは何よ
755 :
742 :2005/07/20(水) 22:54:20 ID:???
>>754 正直、よくわかりません(^^;
<form〜>を使ってれば$FORM〜になるという理解。
#それでも$inになってることもあるので自信は0%。
756 :
742 :2005/07/20(水) 22:58:28 ID:???
$FORM{'no'}にしたところ動作しました。 ・・・なんでだろう。 ぐぐりの旅へイッテキマス。 さんきゅーでした>ALL
757 :
749 :2005/07/20(水) 23:07:02 ID:???
気のせいでした。全角スペースとか@とかでした。
君は get と post の違いから勉強するべきだ。
759 :
758 :2005/07/20(水) 23:08:25 ID:???
>>742 てーか perl は PHPみたいに勝手に %FORM とか %in とかに値が設定されたりしないから。
すげぇがっくりきた…。
ほぼ丸一日かけてそんなオチか・・・。
763 :
nobodyさん :2005/07/21(木) 19:16:23 ID:00deyUp9
perlを覚えたくてこのスレに来ました。 初心者向けのperlの本を買って、カウンタや掲示板が作れる事は分かったのですが、そういう類のものは別に作りたくありません。 というか、perlを覚えるとどんな便利な事があるのか 本を読んでもいまいちピンときません。でも覚えたいです。 皆さんは「あぁ、perlを覚えてよかったな〜」と思ったのはどんな時ですか? また、最も簡単にその気分を味わう方法があったら教えてください。
昔っから夏になると掲示板でアンケート取りたがるのが出るんだよな。
⊂二二二( ^ω^)二⊃ブーン
>>763 質問には答えないが、「初めてのPerl」を勧める。
>>763 Perl は手段の一つであり、目的がないのに覚えても無駄。
768 :
nobodyさん :2005/07/22(金) 12:55:10 ID:Nv8MLct4
指定時間に起動するCGIを作成したいのですが、 どのように作れば良いかご存知でしょうか 『1時間に一度データを集計し、その結果によってデータベースを作成。 その結果をあらかじめ登録してあったメールアドレスに転送する』 というものを作成したいのです。 メールアドレスへの転送や、集計などは出来ているので 『1時間に1度CGIを起動する方法』を教えてください。 よろしくお願いします
1時間ごとにそのCGIにアクセスするスクリプトを書いて、 タスクスケジューラなりcronなりに登録する。以上。
寝ろ!どっとしーじーあい #パールのパス 無限ループ{ &ここで集計してメール; 寝る(参千六百秒); } テストするには ぱーる 寝ろ!どっとしーじーあい & で起動。
なんで CGI でやらなあかんのやろ?
772 :
nobodyさん :2005/07/22(金) 21:21:31 ID:zirnRNb/
超アホな質問でごめんなさい。 BBSを晒しまくるアホがいるので、ダミーのCGIを置きたいのです。 で、その内容なのですが、 #!/usr/bin/perl print <<"_HTML_"; HTMLの案内文章 _HTML_ と、たったこれだけです。 サーバーにアップするとエラーになります。 パーミッションは755にしました。 ちゃんとアスキーモードで転送しています。 コードがおかしいのでしょうか?すみませんが助力お願いします。
現在、下記のように全角ひらがな、カタカナを許容しているのですが(このソース自体 怪しいかもしれませんが)、これに「全角、半角スペース」を追加する場合、「|$nobashi」 のあとに「|$space」といったものを追加すれば問題ございませんでしょうか。 また、スペースのコードを教えていただけますと幸いです。 $eucpre = qr{(?<!\x8F)}; $eucpost = qr{ (?= (?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて (?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端 ) }x; $hiragana = '\xA4[\xA1-\xF3]'; # ぁ〜ん $katakana = '\xA5[\xA1-\xF6]'; # ァ〜ヶ $kanji = '[\xB0-\xFE][\xA1-\xFE]'; # 漢字(実際に割り当てのない領域も有るが問題はない) $nobashi = '\xA1[\xBC\xBD\xC1]'; # ー−〜 if($name !~ m/^$eucpre(?:$hiragana|$katakana|$kanji|$nobashi)+$eucpost$/){}
>772 ヒント。 えーとね、ブラウザに表示する内容はそれだけなんだけど、 その前にまずその内容が「どういったものか」をブラウザに伝える必要があるのだよ。
776 :
nobodyさん :2005/07/22(金) 21:41:20 ID:zirnRNb/
>>773 指摘ありがとうございます。
URL、よく読んでみます。
>>775 さん
ヒントありがとうございます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
とかじゃ……ないですよね?
他のスクリプトがどうやっているかよく見てみます。
パールなんかやめとけ、 pHPがずっといいぞ。 二日で理解できた。
778 :
775 :2005/07/22(金) 21:53:12 ID:???
>776 ><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> >とかじゃ……ないですよね? じゃないっす。 > 他のスクリプトがどうやっているかよく見てみます。 うむ、これは非常にいい心がけだ。 いくつかのスクリプトでhtml出力(とくに最初のヘッダあたり)をしてる部分を 眺めてみれば、すぐ見当がつくと思うぞ。ガンバレ。
PHPならヘッダも自動で出してくれるから
>>772 みたいに悩まずにすむ
780 :
772 :2005/07/22(金) 22:02:16 ID:???
判明しました!
print "Content-type: text/html\n";
これですね!
>>778 さらなるアドバイスありがとうございました。
本当に助かりました。
772がちょっとかわいい。
にげr(ry
テキストファイルの任意の行を取り出すのはどうすればよいですか?
>>784 #!/usr/local/bin/perl -w
# usage: perl script file line_num
use strict;
my($file, $target) = @ARGV;
-f $file || die "No such file: $file";
open FILE, '<' . $file or die $!;
my $line;
do { $line = <FILE> } until $. == $target;
close FILE;
print $line;
__END__
HTML文書を書くプログラムを作っていてサブルーチンで表を書かせようとしたのですが、 $table = '<table>'を読み込んでくれず、空白になっています。 $table = '< table>'なら読み込んでくれるしまた別の箇所なら$table='<table>'を読み込んでくれます。 print "Content-type: text/html\n\n";も最初に記述しています。 タグを消すようなサブルーチンも入れておらず頭を抱えています。 原因が分かず、変な質問文ですが考えられる原因はどういったものがあるでしょうか?
$table = '<table>'; $table = ''<tr><td>めいーん</td></tr></table>'; ↑上書きしている
>>787 さん
sub table {
$table = '<table>';
$nottable = '< table>';
print $table;
print $nottable;
}
の結果が< table>のみなんです。
>>788 そうか?うちでは、
$ perl
sub table {
$table = '<table>';
$nottable = '< table>';
print $table;
print $nottable;
}
&table();
<table>< table>
だけどな。
>>789 さん
上のサブルーチンだけを別のファイルに移して書くと結果はそうなるのですが
そのファイルを今書いてるやつで書くとそうなるので訳が分からないのです・・・
タグを消すプログラムなんて入れてないし別のファイルを参照もしてないのですが・・・
<table>はブラウザ表記されない、ということでperlとしては出力してます。 説明足らなくてすみません。
>>791 何かとんでもない勘違いをしている希ガス。
思ったとおりに動かないように、最低限までコード削って晒せ。
>>792 自己解決しました。原因は#の消し忘れです。
つまらないミスでお騒がせして済みませんでした。
頭の悪い人が大量発生するスレでつね。
でもまあ、グローバル変数を多様すると、ポインタが衝突するのか知らないけど、変なことが起きた経験はあるよ。 とりあえず use strict; と perl -w しておけ、って感じ。
>>795 おいこれ大問題じゃねーか perl は糞だな
よくこんな糞実装使ってられるなバカじゃねーのか
はい、バカです。だから、使う。
変数の名前の付け方をちゃんと考えてやっておけばいいだけのこと
何も検証できないスキルのくせに、でしゃばって rss なんか使おうとしている点が問題。
802 :
801 :2005/07/24(日) 08:48:27 ID:???
スマソ いまやってみたらxrea755でも動くな。 モジュールも入ってるし。 恐らくdataディレクトリとか作ってないんだろ。
馬鹿は放っておけって。
ログみれよ
.htaccessで AddType cgi-script-debug .cgi これでデバッグモード スペルは違う鴨
806 :
799 :2005/07/24(日) 19:04:15 ID:???
チェックしたところこのような文がでました Can't locate XML/RSS.pm in @INC (@INC contains: ./mylib /usr/lib/perl5/5.00503/i686-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i686-linux /usr/lib/perl5/site_perl/5.005 .) at tmp.pl line 6. BEGIN failed--compilation aborted at tmp.pl line 6. dataディレクトリは作ってあります モジュールがないってことなんでしょうか? でもxreaではインストールしてあるみたいですが。
うんこ
>xreaではインストールしてあるみたいですが。 この根拠は?
わかりましたやってみます。サンクスコ
おまえらやさしいな
use strictで書いています。 local ($hogehoge , %hoge2); というふうに、local宣言をしても、有効範囲の宣言がされていないぞ (゚Д゚)ゴルァと言われてしまうのですが、localを使うにはstrictをあきらめ なければいけないのでしょうか? 尚、my ($hogehoge ,%hoge2);だとうまくいきます。
localとmyの違いはわかってんのか?
ajaxを用いてある程度インタラクティブなweb telnetみたいな物を作りたいのですが 持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを 組み合わせるような方法がベターなのでしょうか。 mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは 限らないので無理そうです。 listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり する事は出来ますか?
ヒント:セッション管理
J-PHONE時代の端末等、Basic認証に対応していないものを なんとか通過させたく、用意したフォームからフォームから Basic認証情報を入力させて、環境変数のAUTH_USER、 AUTH_PASSWORDを強制的にセットさせるようなスクリプトを 考えております。 環境変数をCGI側で設定してBasic認証領域内にアクセスさせる ような仕組みは可能でしょうか。 もしも可能であれば、ご教示いただきたく思っております。 まとまりのない文章ですみません。
821 :
nobodyさん :2005/07/26(火) 16:42:49 ID:EJMHsz5R
@array = (0..9); $hara =1; while ( 1 ){ for ( $i = 1; $i <= 3; $i++ ) { $index0= rand @array; $index1= rand @array; $index2= rand @array; my $tmp0=$array[$index0]; my $tmp1=$array[$index1]; my $tmp2=$array[$index2]; $shibi0 = $tmp0; $shibi1 = $tmp1; $shibi2 = $tmp2; } if( $shibi0 != $shibi1 && $shibi0 != $shibi2 && $shibi1 != $shibi2 && $hara != $shibi0 && $hara != $shibi1 && $hara != $shibi2 ){last;} } 0〜9の中から3つの数字をランダムで選びだし、 重複せず、かつ$haraに代入されている数字とは異なる物が3つ揃った時に ループを抜けるというスクリプトです。 これで動作はするのですが、あまりにも原始的というか もう少しスマートなやり方だと、どういう風に組めるでしょうか? 自分の頭だとこれでいっぱいいっぱいでした。
>>821 過去ログで似たのでてきた気がする。 どこだかは知らないけど。
まあ、取得した値の要素を、一度配列から抜くとか、ハッシュでフラグたてたりしたら、絶対重複しないと思うけど?
>>821 の $shibi0-2 を出したいだけじゃなかったら意味ないけど、例えば
my @array = (0 .. 9);
my @shibi = ();
my %flag = ( 1 => 1 ); #
>>821 の $hara の "1"
for (my $i = 0; $i < 3; $i++) {
my $tmp = $array[ rand @array ];
redo if (exists $flag{$tmp});
$flag{$tmp} = 1;
push (@shibi, $tmp);
}
print @shibi;
>821 標準モジュールのList::Util使ってこういうのも。 use List::Util 'shuffle'; @array = (0..9); $hara = 1; ($shibi1, $shibi2, $shibi3) = splice @{[shuffle grep { $_ != $hara } @array]}, 0, 3;
824 :
821 :2005/07/26(火) 17:18:07 ID:???
補足なんですが、上のスクリプト、このセットを×5繰り返します @array( 0..50 )とあるとしたら 0〜10、11〜20、21〜40、41〜45、46〜50それぞれ5セットで上のスクリプトを繰り返して セット1からは$shibi0〜$shibi2、セット2は$shibi3〜$shibi5のそれぞれ3コ セット3から$shibi6〜$shibi9の4コ、セット4と5は$shibi10、$shibi11の1つずつ セットごとに、合計12コの変数を・・・これもforで繰り返させる方法があるんでしょうか?
あるよ。
つーか何が"補足"だよ。"付け足し"じゃねーか。
>>822 や
>>823 使って、考えればできるだろ。
付け足すなら考えて試してから書けよな。
まあ、答えるなら、そのセットと繰り返しを関連付ければいいだけ。
>>822 で言えば、
@hoge = (
{ array=>[0..10], times=>3 },
・・・
[ array=>[46..50], times=>1 ],
);
とかやって、
for (my $h = 0; $h < @hoge; $h++) {
my $set = $hoge[$h];
# ここから
>>822 のソースを参考
my @array = @{ $set->{array} };
# 中略
for (my $i = 0; $i < $set->{times}; $i++) {
# 以下略
って置き換えたりするだけだべ。
細かいところはもう知らん。
まさか宿題じゃないだろうな・・
827 :
nobodyさん :2005/07/26(火) 20:37:18 ID:W0GVg4kD
掲示板の本文中のURL表記の処理について質問です $value とした本文中のURL表記を正規表現で拾って自動リンクさせているのですが 1.この中に自分のサーバ(プロバイダ)内のURLはそのままHTMLタグでリンク、 2.外部のURLは一旦別のcgiに「別のcgi?x=URL」として送るHTMLタグにしたい 3.さらに、「=」がある場合は別変換してから「別のcgi?x=URL」とする必要があると気づきました これまで、1.2.まではifで分けてやっていたのですが、複数のURLがあると 当然ですが一緒の条件内に組み込まれてしまいます $value~s//g ; を複数並べることで正規表現でできるでしょうか? 本文$valueを分割して一度配列に入れ、1行ずつ処理させる方法しかないとすれば、 URLがあるごとにsplitするにはどうしたらよいでしょうか?
>>827 言いたいことがよくわからんのだが。
具体例を挙げれ。
よくあるこういうのです 投稿記事中にURLがあった場合にhtmlのリンクタグを書きます $value =~ s/(http\:[\w\.\~\-\/\?\+\=\:\@\%\;\#;\&\d]+)/<a href=$1 target=_blank>$1<\/a\>/g; $value =~ s/(http\:[\w\.\~\-\/\?\+\=\:\@\%\;\#;\&\d]+)/<a href=..\/tx.cgi\?tx=$1 target=_blank>$1<\/a>/g; 2行目の転送でURL中に「=」があると、tx.cgiで誤動作がでるので さらに「=」→「hidarimigi」などに変換して転送しなければならなかったのです 今回は改行の<br>で区切り、配列に入れ、 @NewValue = split(/<br>/,$value); 一行ずつ取り出して、If分岐して3つ以上の分類作業しました しかし、一行に2つ違うURLがあると同じタグ表記をしてしまいます なんとか自己解決はしましたが、 今後のため、もしか、もう少しクールな方法があったらお知らせください
言い忘れました、分ける理由はreferer対策です
どういう入力があって、 それをどういう形で出力したいのか がイマイチわからない
urlエスケープしろよ
hidarimigi...
834 :
821 :2005/07/27(水) 08:41:51 ID:???
>824はリロードせずに書き込んでしまいました 鯖重くて昨日は見れなかったので、これから試してみます レスありがとうございました。 >826 違いますよ
まさか href="$1" とすればいいだけなんじゃ…。 だとしたらアホすぎる…。
>>829 エスケープしすぎマロスwww
> 一行に2つ違うURLがあると同じタグ表記をしてしまいます
これの意味がよくわからんが、最短一致が抜けてるとかそういう問題かな?
838 :
837 :2005/07/27(水) 16:39:37 ID:???
$と@修正と[_a-zA-Z0-9]省略 [-_.\!~*'()a-zA-Z0-9;/?:@&=+$,%#] ↓ [-.\!~*'()\w;/?:\@&=+\$,%#]
840 :
nobodyさん :2005/07/27(水) 18:08:50 ID:5H9/gz8d
>>836 一行ごとに作業させたので、自ドメインと違うのが同じ行にあると
同じ分類として処理されてしまうということです
>>837 >>838 有り難うございます
正規表現からサブルーチンを呼び出すことができるとは
ちょっと頑張って理解してみます
841 :
nobodyさん :2005/07/27(水) 18:11:03 ID:5H9/gz8d
>>839 それも参考にします、有り難うございました
842 :
nobodyさん :2005/07/28(木) 12:09:05 ID:nWZS31ut
配列「@HAIRETSU」の全ての要素「1 2 3 4 5 6 7 8」の前後に それぞれ特定の文字列「mae」「ato」付けて「mae1ato mae2ato mae3ato ...」 としたいんですが、 $A = '',1,2,3,4,5,6,7,8,; $A =~s/,/ato,mae/g; @HAIRETSU = split(/,/,$A); pop(@HAIRETSU); shift(@HAIRETSU); こんな感じでやるのがベスト・・・なわけないと思いつつもどうすべきか分かりません。 何か助言あればお願いします。
???よく分からんがこういう事か? foreach (@HAIRETU) { $_ = 'mae' . $_ . 'ato'; }
>>843 おぉ・・・ずばりそういうことです。
稚拙な落書きを読んでもらった上にスマートな回答
本当にありがとうございました。もっとベンキョしてきます。
@HAIRETSU = map { 'mae' . $_ . 'ato' } @HAIRETSU ってのもある。
>>845 といっても効率の面では
>>843 に軍配が上がるがな。
新しい配列を作りたいなら問答無用でmapだが。
847 :
842 :2005/07/28(木) 16:08:55 ID:???
>>845 >>846 なるほどなるほど、勉強になります。
言われてみたり、本読んだりしたら「あぁ、そっか」と分かるんですけど
白紙の状態から組むとなると、なかなかひらめかず妙な文字列が…という感じです。
それだけまだ理解が足りていないということだと思うので精進精進です。
ありがとうございました。
848 :
nobodyさん :2005/07/29(金) 17:12:28 ID:DFTdnFF9
初歩的な質問で恐縮ですが、サブルーチンに2つの配列を渡しすには どのようにしたら良いでしょうか? 連想配列 UserParam{hoge}と通常の配列@Paraparaを同時に渡そうと しております。 以下のように1つだけのときはうまくいきました。 &xxx(%Param); sub xxx local (%Param) = @_ で1とつめはうまくいきました。 が、2つ渡すと、1つ目の配列に入ってしまうようでうまくいきません。 &xxx(%Param,*Parapara); sub xxx local (%Param) = @_ local (*Parapara) = @_ 宣言方法がいまいちわかりませんので、教えていただければ幸いです。 参考になるサイトもありましたらお教えください。
普通に入門書買って読むか、CPAN にあるコードを読むか、 どちらかしか選択できないでしょうね。
リファレンス
851 :
848 :2005/07/29(金) 17:24:38 ID:???
困ってるんだから教えてください! あなたたちだって最初からわかってたわけではないんでしょ?
>848 sub xxx(\@\@) { my ($array_ref_1, $array_ref_2) = @_; } これでわからないなら駱駝本でも読んどけ。つーかこんな基本的なことで質問するな
853 :
nobodyさん :2005/07/29(金) 17:43:50 ID:DFTdnFF9
>>852 わかりました。
もう少し勉強して出直します。
出直さなくていいよ。
>>852 基本的なことって、ここ初心者スレだしw
まあ
>>850 で十分だとは思うが。
>>848 おまいは最低でもググッてから質問しろ。
「Perl サブルーチン 2つの配列」とかいくらでも調べようはあるだろ。
便乗質問です。 下記のようにサブルーチンに1個以上の配列のリファレンスを配列の形式で受け渡したいのですが プロトタイプをどのように記述したらよいのですか。 hoge(); #引き数エラーにしたい。 hoge(@fuga1); #@fuga1のリファレンスを渡したい。 hoge(@fuga1,@fuga2); #@fuga1,@fuga2のリファレンスを渡したい。 hoge(@fuga1,@fuga2,...); #引き数として渡した配列のリファレンスを渡したい。 sub hoge(\@;\@\@); みたいなプロトタイプをサブルーチンを実行させる以前に宣言しておけば いいのはわかるのですが、渡す配列変数の個数が決まっていない場合 どのように記述すればいいのかがわかりません。どうぞよろしくお願いします。 なお、プロトタイプ宣言せずに直接配列に参照演算子 "\" を使って代入すればいいのは分かっていますが あえてプロトタイプでお願いいたします。
>>856 任意の個数をすっきり書く方法は用意されてないと思うが、
実用上は
sub hoge(\@;\@;\@;....)
の;\@を十分たくさん書いておけばいいんじゃないのかね。
美しくはないが。
>>857 できる方法があるのなら知っておきたいというだけです。
たとえば、各配列の要素の平均を求めてその総和を求める関数が欲しいとき
$sum = avr_sum @a1,@a2,@a3,@4;
とか書けたらいいなと思っただけです。
まあ、こう書けば代用できますけどね。
$sum = avr_sum \(@a1,@a2,@a3,@a4);
>>858 やっぱりそれしか方法がないですかねぇ。
>>859 それなら
sub hoge (@)
で十分だろ。
>>860 >各配列の要素の平均を求めてその総和を求める
@a1 = (3,4,5);
@a2 = (5,6);
@a3 = (3,5,6,7);
@a4 = (3,2,3);
$sum = (3+4+5)/3+(5+6)/2+(3+5+6+7)/4+(3+2+3)/3
こういうことだから、十分じゃないよ。
862 :
860 :2005/07/29(金) 23:44:40 ID:???
>>861 スマン。平均ってのを読み飛ばしてた。
まあでもプロトタイプにこだわらなくてもいくらでも方法があるからいいじゃないかと逃げ。
与えられたURLのソースを取り込むにはどうすればよいですか?
シンプルなの use LWP::Simple; $content = get($url);
(;・∀・)また、騙されたの?
CGI.pmを用いてcgiを作っています。 end_formはformの閉じタグを生成するはずですが、空のdivも同時に生成してしまいます。 これを生成しないようにするにはどう書いたらよいでしょうか?
870 :
nobodyさん :2005/08/02(火) 19:16:16 ID:+vXBtmax
すいません、バカなことを聞くかもしれないですが、 CGIのデバッグをWinのローカルで行う方法というのはありますか?
Apache 入れるなりすればいいんです
ActivePerl も
>>871 ありがとうございます。
Apache for Win32というのを入れればいいんでしょうか?
これは入れると自宅のPCがWebサーバーになってしまったりするんでしょうか?
世界に公開されてしまうのですか?
>>874 確かにそうですね。ありがとうございました。
ワロスw
877 :
nobodyさん :2005/08/03(水) 09:27:29 ID:2+TF3q2O
おっおいっ!
CGI.pmを使ってCGIを作っているのですが、 use warnings,use strictしてるときパラメータを受け取った変数を条件式に使うとき わざわざdefinedしないといけないのが面倒です。。何か良い方法があったら教えて頂けないでしょうか?
use warningsをコメントアウトする。
未定義なものはロジックへ流さない。基本だ。 手抜きしちゃいかんよ。
ま、俺はそれが嫌だから、CGIパラメータ処理モジュールを自作して使ってるわけだが。 CGI.pmより軽いし、超快適。
はいはい。
CGI::Lite
CGI.pmの質問ばっかだな
>>879 の意味が分からないのは私だけか。
use strict,warnings下でCGI.pmを使っているけど、問題が起きたことはない。
>>886 たとえばチェックボックスがチェックされなかった
ときのように、あるパラメタがそもそも送られてこないと
スカラーコンテキストのparamはundef返すので、
my $hoge = $query->param('hoge');
if ($hoge == 1) { ... }
とか書くと、use warnings下では Use of uninitialized value in 〜
が出るとかそういう話。もちろんundef返る可能性があるのに
手を抜いてるのがいけない。
889 :
886 :2005/08/03(水) 20:24:57 ID:???
my $hoge = $query->param('hoge') || ''; って書かないか?
それがめんどいって話なんじゃ?
手抜き(・A・)イクナイ!!
どーしても解決できないエラーがあるので教えていただけないでしょうか。 CGI::Session を使用していて perl -w で実行すると (in cleanup) Can't connect to data source , no database driver specified and DBI_DSN env var not set at /usr/lib/perl5/site_perl/5.8.3/CGI/Session/MySQL.pm line 131 というエラーが出てしまいます。 どのような原因なのでしょうか・・・
>>892 Can't connect to data source
no database driver specified
DBI_DSN env var not set
>>890 いやdefined云々いってるから知らないんじゃないか?
今までphp使いでこんどperlでもと思ったんですが、 正規表現と文字列変換で鼻血でそうです。 PHP+mysqlでWEBフォームくらい作れるんですが、 今まで両方とも初見の情報です。 とりあえず基本だから、ということでガリガリ覚えようとしてるんですが、 これ、どんくらいの頻度で使う知識なんですか? もしすげぇ複雑だけど、ぜんぜん使わないよそこ、みたいなあれだったら悲しい・・・
>>892 DBIがインストールされてないというエラーと思われ
windows環境という前提でいうと、
1.activeperlインスト
2.windowsのコマンドライン(cmd)からinstall DBI
3.windowsのコマンドライン(cmd)からinstall DBD-mysql
でDBIが入る。
>>895 俺はよく使うけど、使うときに調べればそれで十分だと思う。
けど、正規表現は面白くて好き。オライリーの詳細正規表現お薦め。
899 :
nobodyさん :2005/08/04(木) 15:54:47 ID:Ako7Yv7q
>>898 なるほど!
ちょっと安心しました。
オライリーってあの表紙が動物園みたいなやつですよね。
自分もネズミが表紙のperl本持ってます。
4000(これ、書式は%4dですかw)円は高かった・・
正規表現で一冊できちゃうとは・・・
今度探してゲットします。
ありがとうございます。
900 :
892 :2005/08/04(木) 20:46:43 ID:???
>>896 レスサンクス。
DBI入ってるみたいです。SSHで確認しました。
phpMyAdminから見るとセッションのデータをちゃんとMySQLに入れてて
取得も出来ています。
-wオプションをつけなければなにも問題なくうごいてるので
どうしてこんなエラーになるのかまったくわからなくって・・・
↓こんな感じのモジュール組んでます
901 :
892 :2005/08/04(木) 20:48:26 ID:???
package Lib::Auth; use strict; use CGI::Session qw/-ip-match/; use DBI; use CGI qw/:standard/; use vars qw($dbh $session); sub new { my $pkg = shift; bless{ userid => undef },$pkg; } sub GetID { my $self = shift; my $sid = shift; $dbh = DBI->connect('DBI:mysql:+++:localhost', '+++', '********') or die "DBI connect不可\n"; $session = new CGI::Session("driver:MySQL", $sid, {Handle=>$dbh}); if($session->param("userid")) { $self->{userid} = $session->param("userid"); } else { $session->delete(); $self->{userid} = "guest"; } return $self->{userid}; }
cgiでクエリを$form{$key}=$valueの形式でハッシュに格納する部分って %form = $query =~ /([^=&]+)=([^=&]+)/g; この1行でも問題ありませんか?
>>902 デコードとかはあとでやればいいとしても、一般には
keyが重複することがあるからだめだろうな。
>>902 hoge=aaa&hage=bbb=ccc のときとか bbb=ccc が取れない
世の中で配布されているCGIのソースを読んでみても use strictしているソースを見たことがないのですが use strictするメリットって何なんでしょうか
作っているときはuse strictするけど、配布時には外すよ。
ないよ 全部perl信者の妄想だから
>>905 意図しない変数の使用をチェックしてくれる
意図しない裸のワードの使用をチェックしてくれる
意図しないシンボリックリファレンスの使用をチェックしてくれる
特に変数チェックは超重要。今やuse strictしないとコードがかけません。
> 世の中で配布されているCGIのソースを読んでみても 頭の悪い人たちが書いたコードでつか?
公開する時には大概削除してるでしょ。
ttp://www.kent-web.com/ たとえばここなんか有名ですが
ここのスクリプトはuse strictが無いので
勝手に記述して実行すると完全に就職されていないグローバル変数エラーが
山ほど出てきます
他にもアップローダで一番よく使われているなずるぼんアップローダや
あっぷっぷも勝手にusestrict記述して実行すると
山ほどエラーが出てきます
そこが諸悪の根源
>>911 漏れもKヨNTでperlを習った口だ。
だが、そのせいで社会復帰がままならない。
KヨNTのスクリプトは今すぐ捨てろ!
全部捨てろ!
そして、奴の事はもう思い出すな。
普通にセキュリティホールがあるぞ、KENTのしじあい。パス系とか。。
>>911 一般人にはuse strictなんて関係ないし、
少しぐらいバグがあっても、文句言いつつ使い続けたりするだろうし。
世の中ってそんなもん。
>>915 己の成長を望まないのならそれでも良いかも知れん。
use strict; を使うことが付加価値を持つということになる時代でつか?
そこでRubyですよ
とりあえずスコープに注意して全部myしたら動きましたがこれで良いですか? localはダメですよね?
>>906 それはチェックコストを抑えるため?
CPANで配布されている多くのコードはuse strictしたままだよね。
私も仕事ではつけたままにしてます。
先頭に#が付加されてしまう事が多いですが。
921 :
906 :2005/08/07(日) 14:54:03 ID:???
エラー&警告を報告してくれる酔狂なユーザーはいないから外す。 仕事なら付けたままのほうが良いかと。
で、use strict; って、何の意味があるの?
使うよ、厳密に
一種の「保証」だと考えればいい。
925 :
nobodyさん :2005/08/07(日) 18:37:02 ID:IqAoEAkr
ブログからRSSを取得してPerlで解析して、jsを出力し、 エントリー概要をhtmlに表示するスクリプトなのですが open OUTPUT, ">./data/rss.js"; foreach my $item ( @{$rss->{'items'}} ) { print OUTPUT<<TEXT; document.write('<a href="$item->{'link'}" target="blank">$item->{'title'}</a>'); TEXT } そのブログのエントリー名にシングルクォートが使われると document.write(' ');でかこんでる部分が、シングルクォートの中に シングルクォートが入ってhtmlに出力されなくなります。 その問題を解決するにはどういったスクリプトを書けばよいでしょうか? どうぞヨロシクお願いいたしますm(_ _)m
\
>>925 s/\\/\\\\/g;
s/'/\\'/g;
print q||; とかで囲むとだめ? つーか、そういうウンコなの同居させるなら TT とか使えよ。
XSSバリバリになりそうだね。
どこらへんが XSS?
931 :
nobodyさん :2005/08/07(日) 22:40:40 ID:lD997J78
strict下でも$item->{title}とかって書けるよ〜。 と、本題と全く関係ないレスを誇らしげにしてみる。
932 :
nobodyさん :2005/08/08(月) 01:19:14 ID:t9fLm/wi
教えて下さい。 初めてサブルーチンを使ったプログラムを作ったのですが、以下のエラーがでます。 syntax error at C:/Apache2/htdocs/login.cgi line 225, at EOF 225行目には_END_しかないのですが、何がいけないのでしょうか?
>932 おそらく225行目より前で何か間違えてる。それより前の部分よくチェックしてみるといいかも知れない
まさか _END_ __END__
>>932 の書いてる 「 _END_ 」 の 「 _ 」 が全角記号のアンダーバーな件について。
ifとかforの括弧の閉じ忘れだとおもふ
こういうときこそ use strict;
こういうのにuse stirict;は有効じゃないんだよパパ
その辺は趣味ってことで
パパ、意味が分からないよ
Template-Toolkitをコンパイルする時にAppConfigが必要になりますが AppConfigは@INCの中にないディレクトリ[/home/hoge/module]にインストールされているとします。 perl Makefile.PL --libs="/home/hoge/module" のような感じで指定出来れば問題なくコンパイル出来るのですが そのようなオプションはありますでしょうか?
perl 5.8.6 なんですが require './cgi-lib.pl'; require './jcode.pl'; って動かないんですか? モジュール使わないとダメ?
(゚Д゚ )ハァ?
ダウンロード数を計測するスクリプトを書いているのですが、計測後、ファイルをダウンロードのダイアログを出したいのですが、 IEやFirefoxのポップアップ抑制機能にじゃまされないで出すようにするにはどのようにすればよいのでしょうか? vectorなどのサイトではちゃんとダウンロードできるので、何かやり方がありそうなのですが・・・。
>>941 だまって @INC 増やせ。
>>942 動くよ。 スクリプトと同じフォルダに設置しれば?
>>944 zip とかならポップアップしなくても普通にページ移動 (location) すればページ切り替わらずにダウンロード画面になることを知らないのか?
そゆことで、Content-Type がしっかり (ダウンロードされるように) してれば、そのように動く。
> 〜になることを知らないのか? まともな会話の仕方を知らないのか?
>>944 ダウンロードダイアログとポップアップ抑制は関係ないから。
ヘッダとしてContent-Dispositionを出力してみるよろし。
Content-TypeとContent-Lengthも合わせて出力することをおすすめする。
>>944 CGI でしこしこデータを吐いてもいいんだけど、サイズが大きいと色々問題が
出てくるので Location で飛ばす方がいいと思うぞ。
警告なしに飛ばすには色々条件がある。
・Location は必ず HTTP ヘッダで吐く。HTML の <meta> は駄目。
・Location よりも前に Status: 303 See Other を吐く。
メソッドが POST でなければ 302 Found も可。302 の方が対応ブラウザが多い。
これは現在のメソッドに関係なく Location を GET で回収しろという意味。
・Location には絶対 URI を指定する。
さらにこの URI のホスト部分と $ENV{'HTTP_HOST'} は一致させる。
IP アドレスでのリクエストとかもあり得るので必ずチェックすること。
・メソッドが HEAD ならボディは吐かない。
それ以外なら Location へのリンク (<a>) を含む HTML を吐く。
これらが満たせない場合は <form> でのリクエストはあきらめるしかない。
<a> で CGI にリンクすれば回避できるけど、検索エンジンに侵されるのでそのつもりで。
949 :
942 :2005/08/08(月) 23:45:57 ID:???
>>945 回答thx
落としたつもりになってただけで、
ライブラリの中身が空だった・・・orz
950 :
nobodyさん :2005/08/09(火) 00:23:13 ID:pZHbukIk
CGIの本に載ってたやつだけど #! c:/perl/bin/perl print "Content-type: text/plain\n\n"; print "Hello Perl !"; これって普通ならブラウザー画面に文字が表示されるはずなのに 何故か実行するとファイルダウンロードになるのですが 何故でしょうか
952 :
nobodyさん :2005/08/09(火) 00:30:11 ID:pZHbukIk
apache conf
954 :
nobodyさん :2005/08/09(火) 00:33:03 ID:pZHbukIk
あと借りたサーバーにもあげてみたのですが やはりファイルダウンロードになりました レンタルサーバーのほうは何故か不安定で、ローカルだと表示できるものが、 表示できたり出来なかったりします パーミッションやパス、その他設定はちゃんとしてるはずなのに
955 :
nobodyさん :2005/08/09(火) 00:39:46 ID:pZHbukIk
>>953 コンフファイルもソースも付属CDのを使ってるから
間違ってるとは考えにくい
>>950 IE は text/plain をダウンロードしたりしなかったりするよな。
text/html のが確実よ。
パスが通ってないだけなんじゃね?
他のブラウザで試せ。
Perlで入力にa[1],a[2],. . . という風な入力を受け取ることってできますか? $i=1; while($in{'a[$i]'}){ print OUT "$in{'a[$i]'}\n"; $i++; } print $in{'a[1]'}; という風にやってみたんですけど中に何もはいってませんでした
>>959 シングルクォートで囲ってるからじゃね?
$in{"a$i"}
961 :
960 :2005/08/09(火) 18:31:23 ID:???
いや、違うわ。 $in{'a[1]'}ってハッシュの中の配列?リファレンス使う方がいいかもよ。
>>959 PHPとかで <input name="a[1]"> とされてる a[1]?
なんで流用してるのか知らないけど、クエリを%inに格納してないんじゃないの?
いつもplainテキストでも print "Content-type: text/html\n\n<pre>\n"; てやってるよ サーバ云々よりもブラウザの問題
<pre> より <xmp> がよろしくなくって?
そんなIE独自仕様なタグは。
xmpはHTML4.0以降の仕様にはないがIEの独自仕様ではないぞ。 現在もほとんどのブラウザが対応してる。
<plaintext> <textplain>とかもあるよ
なんだまだやってたのか。
>>950 それをダウンロードしてエディタで開いて中身を貼れ
969 :
nobodyさん :2005/08/10(水) 20:44:59 ID:yT5SVbbL
970 :
nobodyさん :2005/08/10(水) 21:45:46 ID:oTWuci57
質問させて下さい。 ログイン画面(ID、パスワード入力フォーム)があって、一度ログインしたら その後どのページに行ってもログイン済みという認識をさせたいのですが、各ペ ージでフォームデータ(標準入力)を取得し、ID、パスワードがあるかという 判断をするやり方で良いのでしょうか? また、フォームデータ(標準入力)はいつまで保存されているのでしょうか?ど んどん次のページに行っても残っているものなのでしょうか?
>>970 保存するようにしてれば保存される。
それにコーディングに関係ないぞなもし。
cookieとかセッション管理とか調べてください。
BASIC認証がお望みのモノに近いけど、なんか勘違いしてるっぽいな。 CGIだとセッションIDを仕込んで、毎回チェックするだけなんだけどね。 仕込み先はCookie、URL、フォーム。なんだっていい。 セッション管理でぐぐるに一票。
ある複数のperlモジュールを必要とするCGIを動かそうとするとき、 必要とするモジュールの一部が使用中のレンタルサーバーに用意されていない場合、 CGI内に、 use lib = "/home/hogehoge/lib" と記述してやると、 /home/hogehoge/lib 内に、サーバーにすでにある モジュールもないモジュールもすべて用意しなければならなくなるのでしょうか?
実験してみればわかるのでは?
>>969 ちゃんと実行されてんじゃん。
たまたま君の使ってるブラウザ(環境)がtext/plainなデータをダウンロードするようにしているだけ。
text/plainを表示するようなブラウザだったら表示される。
976 :
nobodyさん :2005/08/11(木) 07:59:40 ID:emP9NQBR
質問があります。 配布スクリクトでPerl::Authを使うのでインストールしたら Fatal error: Cannot redeclare class auth in /web/....../lib/pear/Auth/Auth.php on line ○○ というエラーが出ました。 過去ログとか読むと、authが二重宣言しているためにエラーが出ているところまで分かったのですが、 これの回避方法とかあるのでしょうか? 該当部分(auth)を別な名前に書き換えるのも、色々な場所で使われていて大変そうですし、 他の何と重複しているのか分からないのですが…。
何をおっしゃりたいのか、情報が少なすぎて、さっぱりわからない点について。
>>977 えー
redeclare再宣言する必要がどこにあるか
わからんと、答えようがないんですが
> pear/Auth/Auth.php ここはperlスレなんだが。
いや突っ込むところはそこじゃなくて 977の質問はPHPのPEAR::Authについて のものだというところかと... 質問者の脳内でPEARがPerlに置き換わっ てるようだが激しくスレ違い。
982 :
977 :2005/08/11(木) 13:21:03 ID:???
>981 勝手に脳内変換してました…。PEAR→Perl スレ違いorz...
983 :
nobodyさん :2005/08/11(木) 19:28:28 ID:OSKViUMD
フォームのhiddenで渡した情報はいつクリアされるのですか? (ブラウザのウィンドを閉じるまでは残っているのでしょうか?) 各ページでhiddenの受け渡しによるログインのセッション管理を行おう としていますが、途中にHTMLページがある場合、 a.cgi → b.html → c.cgi a.cgiで渡したhiddenの情報を、c.cgiで受け取ることはできるのでしょう か?それとももう消えてしまっているのでしょうか? もしくは、HTMLでもhidden情報を渡すことはできるのでしょうか? 素人なのでアホな質問をしていたらすいません。
アホな質問だから多分よくわかってないんだろうけど、Cookie でも使えば?
---------------------------- #!/usr/local/bin/perl $view = "画像フルパス.jpg"; print "Content-type: image/jpeg\n\n"; open IMG,"$view"; binmode (IMG); print <IMG>; close (IMG); exit; --------------------- アクセスカウンタみたいに<img src="xx.cgi"> って感じで画像を呼びたいんだけど、 この後処理を付け足して条件分岐で表示される画像が変わるという感じのを作りたいんですが 最初のとりあえず決まった画像を表示させる段階でつまづいています なにか分かれば教えて頂けますか?
>>983 a.cgiでb.htmlを出力する際にhidden情報も書き込ねば、c.cgiが受け取れる。
でも、セッションならcookieでやる方がいいよ。
GETメソッドで変遷すると、hidden情報がアドレス部分に含まれちゃうから。
>>985 Windowsなら
binmode(STDOUT);
が要るけど。
# print <IMG>は勘弁してほしい。
勘弁して欲しいとはどういう意味なんですか? 構文的にマズイのであれば よくわかってないので是非教えてください
989 :
973 :2005/08/11(木) 21:29:11 ID:???
>976 そこのところを具体的にご教示ねがえないでしょうか? ちなみに、telnetもshhも使えないサーバーをつかってます。 なにとぞよろしくお願いします。
>>988 山形括弧は行ごとに処理を行うので、
バイナリモードで使うのは気持ちが悪いということ。
# 巨大ファイルを使わない限り気分的な問題だけど、どこかに落とし穴があるかも知れず。
>>985 のコード動いたよ。(FreeBSD+Perl5.8.7)
991 :
nobodyさん :2005/08/11(木) 21:38:14 ID:X0+Sv8OM
初心者のソースって動けばいいってオーラがぷんぷんだよな 処理が重くなるとかメモリの節約とか全然考えてない
992 :
995 :2005/08/11(木) 22:11:22 ID:???
>>990 動きますか・・・・
うーん他のCGIは動くのに
何か簡単なミスな気がしてきたけどわからない
$view = "画像フルパス.jpg";
ってのが
http:// からのアドレスで書いてることに 3000点。
ってか
>>995 も大変だな。
↓↓
994 :
995 :2005/08/12(金) 00:55:40 ID:???
>993 まさにその通りでした^^; しかも995…orz 993には3000点が加算されます。 なんでこんなミスすんだろ 思いこむとこんなミスにも気づかないものねぇ
うはwww当たったwwwww 次スレまだー?(・∀・ )っ/i_i⌒☆チンチン
埋め
梅
にはは。久しぶりにせん!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。