Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0794nobodyさん
2005/07/23(土) 20:12:58ID:???0795nobodyさん
2005/07/23(土) 20:21:46ID:???とりあえず use strict; と perl -w しておけ、って感じ。
0797nobodyさん
2005/07/23(土) 23:17:28ID:???0798nobodyさん
2005/07/24(日) 00:37:08ID:???0799nobodyさん
2005/07/24(日) 06:19:52ID:???ttp://allabout.co.jp/career/cgiperl/closeup/CU20050131A/index4.htm
500エラーがでますた。
鯖はxrea パ−ミッションは755
どのへんが問題でしょうか?
0800nobodyさん
2005/07/24(日) 07:27:11ID:???0802801
2005/07/24(日) 08:48:27ID:???モジュールも入ってるし。
恐らくdataディレクトリとか作ってないんだろ。
0803nobodyさん
2005/07/24(日) 08:51:23ID:???0804nobodyさん
2005/07/24(日) 12:28:38ID:???0805nobodyさん
2005/07/24(日) 18:07:55ID:???AddType cgi-script-debug .cgi
これでデバッグモード
スペルは違う鴨
0806799
2005/07/24(日) 19:04:15ID:???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ではインストールしてあるみたいですが。
0807nobodyさん
2005/07/24(日) 20:16:20ID:???0808nobodyさん
2005/07/24(日) 21:14:47ID:???この根拠は?
0809nobodyさん
2005/07/24(日) 21:24:43ID:???ttp://sb.xrea.com/showthread.php?t=9748
0810nobodyさん
2005/07/24(日) 21:42:23ID:???799 の使っているサーバは s151 なのか? s151 には Perl 5.8.7 が
入っている筈だが、何故 @INC には 5.005 のディレクトリしか無いんだ?
http://www.s151.xrea.com/server_info.cgi
XML::RSS は Pure Perl な一ファイルのモジュールなんだから、
無ければ自分のスペースに置いて use lib すればよかろうに。
http://search.cpan.org/~kellan/XML-RSS-1.05/
スレ違いな話題なんでこれ以上続けたいなら下のスレへでも行ってくれ。
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0811nobodyさん
2005/07/24(日) 21:56:39ID:???0812nobodyさん
2005/07/24(日) 22:08:41ID:???0814nobodyさん
2005/07/25(月) 03:28:32ID:???ここの 318 書いた俺の方が勝ち組
0815nobodyさん
2005/07/25(月) 15:03:30ID:???local ($hogehoge , %hoge2);
というふうに、local宣言をしても、有効範囲の宣言がされていないぞ
(゚Д゚)ゴルァと言われてしまうのですが、localを使うにはstrictをあきらめ
なければいけないのでしょうか?
尚、my ($hogehoge ,%hoge2);だとうまくいきます。
0816nobodyさん
2005/07/25(月) 15:22:26ID:???0817nobodyさん
2005/07/25(月) 15:28:18ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq7.html#What_s_the_difference_between_dy
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html
0818nobodyさん
2005/07/26(火) 01:51:12ID:???持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする
デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを
組み合わせるような方法がベターなのでしょうか。
mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは
限らないので無理そうです。
listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり
する事は出来ますか?
0819nobodyさん
2005/07/26(火) 01:54:16ID:???0820nobodyさん
2005/07/26(火) 03:48:28ID:???なんとか通過させたく、用意したフォームからフォームから
Basic認証情報を入力させて、環境変数のAUTH_USER、
AUTH_PASSWORDを強制的にセットさせるようなスクリプトを
考えております。
環境変数をCGI側で設定してBasic認証領域内にアクセスさせる
ような仕組みは可能でしょうか。
もしも可能であれば、ご教示いただきたく思っております。
まとまりのない文章ですみません。
0821nobodyさん
2005/07/26(火) 16:42:49ID:EJMHsz5R$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つ揃った時に
ループを抜けるというスクリプトです。
これで動作はするのですが、あまりにも原始的というか
もう少しスマートなやり方だと、どういう風に組めるでしょうか?
自分の頭だとこれでいっぱいいっぱいでした。
0822nobodyさん
2005/07/26(火) 17:06:05ID:???過去ログで似たのでてきた気がする。 どこだかは知らないけど。
まあ、取得した値の要素を、一度配列から抜くとか、ハッシュでフラグたてたりしたら、絶対重複しないと思うけど?
>>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;
0823nobodyさん
2005/07/26(火) 17:17:17ID:???標準モジュールのList::Util使ってこういうのも。
use List::Util 'shuffle';
@array = (0..9);
$hara = 1;
($shibi1, $shibi2, $shibi3) = splice @{[shuffle grep { $_ != $hara } @array]}, 0, 3;
0824821
2005/07/26(火) 17:18:07ID:???@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で繰り返させる方法があるんでしょうか?
0825nobodyさん
2005/07/26(火) 18:20:53ID:???つーか何が"補足"だよ。"付け足し"じゃねーか。
>>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++) {
# 以下略
って置き換えたりするだけだべ。
細かいところはもう知らん。
0826nobodyさん
2005/07/26(火) 19:07:57ID:???0827nobodyさん
2005/07/26(火) 20:37:18ID:W0GVg4kD$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するにはどうしたらよいでしょうか?
0829nobodyさん
2005/07/27(水) 01:21:21ID:???投稿記事中に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があると同じタグ表記をしてしまいます
なんとか自己解決はしましたが、
今後のため、もしか、もう少しクールな方法があったらお知らせください
0830nobodyさん
2005/07/27(水) 01:24:03ID:???0831nobodyさん
2005/07/27(水) 01:38:24ID:???それをどういう形で出力したいのか
がイマイチわからない
0832nobodyさん
2005/07/27(水) 01:52:15ID:???0833nobodyさん
2005/07/27(水) 02:29:27ID:???0834821
2005/07/27(水) 08:41:51ID:???鯖重くて昨日は見れなかったので、これから試してみます
レスありがとうございました。
>826
違いますよ
0835nobodyさん
2005/07/27(水) 13:04:59ID:???だとしたらアホすぎる…。
0836nobodyさん
2005/07/27(水) 13:16:24ID:???エスケープしすぎマロスwww
> 一行に2つ違うURLがあると同じタグ表記をしてしまいます
これの意味がよくわからんが、最短一致が抜けてるとかそういう問題かな?
0837nobodyさん
2005/07/27(水) 16:31:30ID:???$value = "http://yahoo.com/ http://mydomain/ http://pc8.2ch.net/test/read.cgi?bbs=php&key=1116970588&st=829&to=829&nofirst=true";
$value =~ s!(s?https?://[-_.\!~*'()a-zA-Z0-9;/?:@&=+$,%#]+)!'<a href="'.($1=~m|^http://mydomain.+$|?'':'../tx.cgi?').$&.'" target="_blank">'!eg;
print $value;
・要するに eg オプションつけて s/(略)/make_anchor_tag($1)/eg; のようにサブルーチン呼び出してその中でif文使えばURL1個ごとの振り分けができる。
・tx.cgi?http://... のようにすれば $ENV{'QUERY_STRING'} から読み出すだけなので楽。
0838837
2005/07/27(水) 16:39:37ID:???[-_.\!~*'()a-zA-Z0-9;/?:@&=+$,%#]
↓
[-.\!~*'()\w;/?:\@&=+\$,%#]
0839nobodyさん
2005/07/27(水) 17:55:59ID:???http://hoge.com/hoge.cgi?
key=123&url=http://foo.com/foo.cgi?key=456&value=789
とかあった場合に、スクリプト内で
url=http://foo.com/foo.cgi?key=456&value=789
が & と = のせいで、正しくとれないのでどうすれば、って話だったんじゃねーの?
だから、>>832 の言ったように、
http://foo.com/foo.cgi?key=456&value=789
の部分を URLエンコード (英数字以外を %** 形式に) すればいい、ってゆー。
0840nobodyさん
2005/07/27(水) 18:08:50ID:5H9/gz8d一行ごとに作業させたので、自ドメインと違うのが同じ行にあると
同じ分類として処理されてしまうということです
>>837 >>838
有り難うございます
正規表現からサブルーチンを呼び出すことができるとは
ちょっと頑張って理解してみます
0841nobodyさん
2005/07/27(水) 18:11:03ID:5H9/gz8dそれも参考にします、有り難うございました
0842nobodyさん
2005/07/28(木) 12:09:05ID:nWZS31utそれぞれ特定の文字列「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);
こんな感じでやるのがベスト・・・なわけないと思いつつもどうすべきか分かりません。
何か助言あればお願いします。
0843nobodyさん
2005/07/28(木) 12:12:25ID:???foreach (@HAIRETU) { $_ = 'mae' . $_ . 'ato'; }
0844nobodyさん
2005/07/28(木) 12:29:08ID:???おぉ・・・ずばりそういうことです。
稚拙な落書きを読んでもらった上にスマートな回答
本当にありがとうございました。もっとベンキョしてきます。
0845nobodyさん
2005/07/28(木) 14:18:32ID:???ってのもある。
0847842
2005/07/28(木) 16:08:55ID:???>>846
なるほどなるほど、勉強になります。
言われてみたり、本読んだりしたら「あぁ、そっか」と分かるんですけど
白紙の状態から組むとなると、なかなかひらめかず妙な文字列が…という感じです。
それだけまだ理解が足りていないということだと思うので精進精進です。
ありがとうございました。
0848nobodyさん
2005/07/29(金) 17:12:28ID:DFTdnFF9どのようにしたら良いでしょうか?
連想配列 UserParam{hoge}と通常の配列@Paraparaを同時に渡そうと
しております。
以下のように1つだけのときはうまくいきました。
&xxx(%Param);
sub xxx
local (%Param) = @_
で1とつめはうまくいきました。
が、2つ渡すと、1つ目の配列に入ってしまうようでうまくいきません。
&xxx(%Param,*Parapara);
sub xxx
local (%Param) = @_
local (*Parapara) = @_
宣言方法がいまいちわかりませんので、教えていただければ幸いです。
参考になるサイトもありましたらお教えください。
0849nobodyさん
2005/07/29(金) 17:15:16ID:???どちらかしか選択できないでしょうね。
0850nobodyさん
2005/07/29(金) 17:17:25ID:???0851848
2005/07/29(金) 17:24:38ID:???あなたたちだって最初からわかってたわけではないんでしょ?
0852nobodyさん
2005/07/29(金) 17:31:06ID:???sub xxx(\@\@) {
my ($array_ref_1, $array_ref_2) = @_;
}
これでわからないなら駱駝本でも読んどけ。つーかこんな基本的なことで質問するな
0853nobodyさん
2005/07/29(金) 17:43:50ID:DFTdnFF9わかりました。
もう少し勉強して出直します。
0854nobodyさん
2005/07/29(金) 18:18:51ID:???0855nobodyさん
2005/07/29(金) 20:10:25ID:???基本的なことって、ここ初心者スレだしw
まあ>>850で十分だとは思うが。
>>848
おまいは最低でもググッてから質問しろ。
「Perl サブルーチン 2つの配列」とかいくらでも調べようはあるだろ。
0856nobodyさん
2005/07/29(金) 20:33:41ID:???下記のようにサブルーチンに1個以上の配列のリファレンスを配列の形式で受け渡したいのですが
プロトタイプをどのように記述したらよいのですか。
hoge(); #引き数エラーにしたい。
hoge(@fuga1); #@fuga1のリファレンスを渡したい。
hoge(@fuga1,@fuga2); #@fuga1,@fuga2のリファレンスを渡したい。
hoge(@fuga1,@fuga2,...); #引き数として渡した配列のリファレンスを渡したい。
sub hoge(\@;\@\@); みたいなプロトタイプをサブルーチンを実行させる以前に宣言しておけば
いいのはわかるのですが、渡す配列変数の個数が決まっていない場合
どのように記述すればいいのかがわかりません。どうぞよろしくお願いします。
なお、プロトタイプ宣言せずに直接配列に参照演算子 "\" を使って代入すればいいのは分かっていますが
あえてプロトタイプでお願いいたします。
0858nobodyさん
2005/07/29(金) 21:08:26ID:???任意の個数をすっきり書く方法は用意されてないと思うが、
実用上は
sub hoge(\@;\@;\@;....)
の;\@を十分たくさん書いておけばいいんじゃないのかね。
美しくはないが。
0859nobodyさん
2005/07/29(金) 21:37:08ID:???できる方法があるのなら知っておきたいというだけです。
たとえば、各配列の要素の平均を求めてその総和を求める関数が欲しいとき
$sum = avr_sum @a1,@a2,@a3,@4;
とか書けたらいいなと思っただけです。
まあ、こう書けば代用できますけどね。
$sum = avr_sum \(@a1,@a2,@a3,@a4);
>>858
やっぱりそれしか方法がないですかねぇ。
0861nobodyさん
2005/07/29(金) 23:29:26ID:???>各配列の要素の平均を求めてその総和を求める
@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
こういうことだから、十分じゃないよ。
0862860
2005/07/29(金) 23:44:40ID:???スマン。平均ってのを読み飛ばしてた。
まあでもプロトタイプにこだわらなくてもいくらでも方法があるからいいじゃないかと逃げ。
0863nobodyさん
2005/07/30(土) 00:24:25ID:???0864nobodyさん
2005/07/30(土) 00:30:00ID:???use LWP::Simple;
$content = get($url);
0865nobodyさん
2005/07/30(土) 00:58:41ID:???use LWP;
$content = LWP::UserAgent->new()->request(HTTP::Request->new(GET=>$url,HTTP::Headers->new()))->content();
0866nobodyさん
2005/07/30(土) 21:06:51ID:???http://pc8.2ch.net/test/read.cgi/php/1060009605/345-
にて 2ch 発の技術書企画が進行中です。
主に Web 開発・運営に付いてのノウハウが集められる予定です。
興味のある方・我こそはと思う方は一度覗いてみてください。
0867nobodyさん
2005/07/30(土) 21:20:13ID:???0868nobodyさん
2005/08/02(火) 12:03:21ID:???end_formはformの閉じタグを生成するはずですが、空のdivも同時に生成してしまいます。
これを生成しないようにするにはどう書いたらよいでしょうか?
0869nobodyさん
2005/08/02(火) 12:41:54ID:???ttp://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
use CGI qw(-nosticky);
0870nobodyさん
2005/08/02(火) 19:16:16ID:+vXBtmaxCGIのデバッグをWinのローカルで行う方法というのはありますか?
0871nobodyさん
2005/08/02(火) 19:17:21ID:???0872nobodyさん
2005/08/02(火) 19:23:44ID:???0873nobodyさん
2005/08/02(火) 19:24:40ID:???ありがとうございます。
Apache for Win32というのを入れればいいんでしょうか?
これは入れると自宅のPCがWebサーバーになってしまったりするんでしょうか?
世界に公開されてしまうのですか?
0876nobodyさん
2005/08/02(火) 20:32:29ID:???0877nobodyさん
2005/08/03(水) 09:27:29ID:2+TF3q2O0879nobodyさん
2005/08/03(水) 11:20:50ID:???use warnings,use strictしてるときパラメータを受け取った変数を条件式に使うとき
わざわざdefinedしないといけないのが面倒です。。何か良い方法があったら教えて頂けないでしょうか?
0880nobodyさん
2005/08/03(水) 12:52:24ID:???0881nobodyさん
2005/08/03(水) 13:15:56ID:???手抜きしちゃいかんよ。
0882nobodyさん
2005/08/03(水) 14:13:16ID:???CGI.pmより軽いし、超快適。
0883nobodyさん
2005/08/03(水) 15:25:05ID:???0884nobodyさん
2005/08/03(水) 15:30:17ID:???0885nobodyさん
2005/08/03(水) 17:04:37ID:???0886nobodyさん
2005/08/03(水) 19:50:20ID:???use strict,warnings下でCGI.pmを使っているけど、問題が起きたことはない。
0888nobodyさん
2005/08/03(水) 20:17:15ID:???たとえばチェックボックスがチェックされなかった
ときのように、あるパラメタがそもそも送られてこないと
スカラーコンテキストのparamはundef返すので、
my $hoge = $query->param('hoge');
if ($hoge == 1) { ... }
とか書くと、use warnings下では Use of uninitialized value in 〜
が出るとかそういう話。もちろんundef返る可能性があるのに
手を抜いてるのがいけない。
0889886
2005/08/03(水) 20:24:57ID:???って書かないか?
0890nobodyさん
2005/08/03(水) 20:46:12ID:???0891nobodyさん
2005/08/03(水) 23:09:39ID:???0892nobodyさん
2005/08/04(木) 00:47:52ID:???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
というエラーが出てしまいます。
どのような原因なのでしょうか・・・
■ このスレッドは過去ログ倉庫に格納されています