トップページ⇒php
1001コメント366KB

Perlコーディング初心者質問スレ Part 42

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2005/05/25(水) 06:36:28ID:PVpWgcdf
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0830nobodyさん2005/07/27(水) 01:24:03ID:???
言い忘れました、分ける理由はreferer対策です
0831nobodyさん2005/07/27(水) 01:38:24ID:???
どういう入力があって、
それをどういう形で出力したいのか
がイマイチわからない
0832nobodyさん2005/07/27(水) 01:52:15ID:???
urlエスケープしろよ
0833nobodyさん2005/07/27(水) 02:29:27ID:???
hidarimigi...
08348212005/07/27(水) 08:41:51ID:???
>824はリロードせずに書き込んでしまいました
鯖重くて昨日は見れなかったので、これから試してみます
レスありがとうございました。

>826
違いますよ
0835nobodyさん2005/07/27(水) 13:04:59ID:???
まさか href="$1" とすればいいだけなんじゃ…。

だとしたらアホすぎる…。
0836nobodyさん2005/07/27(水) 13:16:24ID:???
>>829
エスケープしすぎマロスwww

> 一行に2つ違うURLがあると同じタグ表記をしてしまいます
これの意味がよくわからんが、最短一致が抜けてるとかそういう問題かな?
0837nobodyさん2005/07/27(水) 16:31:30ID:???
>>829
$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'} から読み出すだけなので楽。
08388372005/07/27(水) 16:39:37ID:???
$と@修正と[_a-zA-Z0-9]省略
[-_.\!~*'()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
>>836
一行ごとに作業させたので、自ドメインと違うのが同じ行にあると
同じ分類として処理されてしまうということです

>>837 >>838
有り難うございます
正規表現からサブルーチンを呼び出すことができるとは
ちょっと頑張って理解してみます
0841nobodyさん2005/07/27(水) 18:11:03ID:5H9/gz8d
>>839
それも参考にします、有り難うございました
0842nobodyさん2005/07/28(木) 12:09:05ID: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);

こんな感じでやるのがベスト・・・なわけないと思いつつもどうすべきか分かりません。
何か助言あればお願いします。
0843nobodyさん2005/07/28(木) 12:12:25ID:???
???よく分からんがこういう事か?
foreach (@HAIRETU) { $_ = 'mae' . $_ . 'ato'; }
0844nobodyさん2005/07/28(木) 12:29:08ID:???
>>843
おぉ・・・ずばりそういうことです。
稚拙な落書きを読んでもらった上にスマートな回答
本当にありがとうございました。もっとベンキョしてきます。
0845nobodyさん2005/07/28(木) 14:18:32ID:???
@HAIRETSU = map { 'mae' . $_ . 'ato' } @HAIRETSU
ってのもある。
0846nobodyさん2005/07/28(木) 15:24:11ID:???
>>845
といっても効率の面では>>843に軍配が上がるがな。

新しい配列を作りたいなら問答無用でmapだが。
08478422005/07/28(木) 16:08:55ID:???
>>845
>>846
なるほどなるほど、勉強になります。
言われてみたり、本読んだりしたら「あぁ、そっか」と分かるんですけど
白紙の状態から組むとなると、なかなかひらめかず妙な文字列が…という感じです。
それだけまだ理解が足りていないということだと思うので精進精進です。
ありがとうございました。
0848nobodyさん2005/07/29(金) 17:12:28ID:DFTdnFF9
初歩的な質問で恐縮ですが、サブルーチンに2つの配列を渡しすには
どのようにしたら良いでしょうか?

連想配列 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:???
普通に入門書買って読むか、CPAN にあるコードを読むか、
どちらかしか選択できないでしょうね。
0850nobodyさん2005/07/29(金) 17:17:25ID:???
リファレンス
08518482005/07/29(金) 17:24:38ID:???
困ってるんだから教えてください!
あなたたちだって最初からわかってたわけではないんでしょ?
0852nobodyさん2005/07/29(金) 17:31:06ID:???
>848
sub xxx(\@\@) {
my ($array_ref_1, $array_ref_2) = @_;
}

これでわからないなら駱駝本でも読んどけ。つーかこんな基本的なことで質問するな
0853nobodyさん2005/07/29(金) 17:43:50ID:DFTdnFF9
>>852
わかりました。
もう少し勉強して出直します。
0854nobodyさん2005/07/29(金) 18:18:51ID:???
出直さなくていいよ。
0855nobodyさん2005/07/29(金) 20:10:25ID:???
>>852
基本的なことって、ここ初心者スレだし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(\@;\@\@); みたいなプロトタイプをサブルーチンを実行させる以前に宣言しておけば
いいのはわかるのですが、渡す配列変数の個数が決まっていない場合
どのように記述すればいいのかがわかりません。どうぞよろしくお願いします。

なお、プロトタイプ宣言せずに直接配列に参照演算子 "\" を使って代入すればいいのは分かっていますが
あえてプロトタイプでお願いいたします。
0857nobodyさん2005/07/29(金) 21:00:11ID:???
>>858
あえてそうする理由は?
0858nobodyさん2005/07/29(金) 21:08:26ID:???
>>856
任意の個数をすっきり書く方法は用意されてないと思うが、
実用上は
sub hoge(\@;\@;\@;....)
の;\@を十分たくさん書いておけばいいんじゃないのかね。
美しくはないが。

0859nobodyさん2005/07/29(金) 21:37:08ID:???
>>857
できる方法があるのなら知っておきたいというだけです。
たとえば、各配列の要素の平均を求めてその総和を求める関数が欲しいとき

$sum = avr_sum @a1,@a2,@a3,@4;

とか書けたらいいなと思っただけです。
まあ、こう書けば代用できますけどね。

$sum = avr_sum \(@a1,@a2,@a3,@a4);


>>858
やっぱりそれしか方法がないですかねぇ。
0860nobodyさん2005/07/29(金) 22:55:56ID:???
>>859
それなら
sub hoge (@)
で十分だろ。
0861nobodyさん2005/07/29(金) 23:29:26ID:???
>>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

こういうことだから、十分じゃないよ。
08628602005/07/29(金) 23:44:40ID:???
>>861
スマン。平均ってのを読み飛ばしてた。

まあでもプロトタイプにこだわらなくてもいくらでも方法があるからいいじゃないかと逃げ。
0863nobodyさん2005/07/30(土) 00:24:25ID:???
与えられたURLのソースを取り込むにはどうすればよいですか?
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:???
CGI.pmを用いてcgiを作っています。
end_formはformの閉じタグを生成するはずですが、空のdivも同時に生成してしまいます。
これを生成しないようにするにはどう書いたらよいでしょうか?
0869nobodyさん2005/08/02(火) 12:41:54ID:???
>>868
ttp://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod

use CGI qw(-nosticky);
0870nobodyさん2005/08/02(火) 19:16:16ID:+vXBtmax
すいません、バカなことを聞くかもしれないですが、
CGIのデバッグをWinのローカルで行う方法というのはありますか?
0871nobodyさん2005/08/02(火) 19:17:21ID:???
Apache 入れるなりすればいいんです
0872nobodyさん2005/08/02(火) 19:23:44ID:???
ActivePerl も
0873nobodyさん2005/08/02(火) 19:24:40ID:???
>>871
ありがとうございます。
Apache for Win32というのを入れればいいんでしょうか?
これは入れると自宅のPCがWebサーバーになってしまったりするんでしょうか?
世界に公開されてしまうのですか?
0874nobodyさん2005/08/02(火) 19:47:01ID:???
>>873
ケーブル抜けば無問題
0875nobodyさん2005/08/02(火) 20:25:41ID:???
>>874
確かにそうですね。ありがとうございました。
0876nobodyさん2005/08/02(火) 20:32:29ID:???
ワロスw
0877nobodyさん2005/08/03(水) 09:27:29ID:2+TF3q2O
おっおいっ!
0878nobodyさん2005/08/03(水) 09:32:04ID:???
>>877
何か?
0879nobodyさん2005/08/03(水) 11:20:50ID:???
CGI.pmを使ってCGIを作っているのですが、
use warnings,use strictしてるときパラメータを受け取った変数を条件式に使うとき
わざわざdefinedしないといけないのが面倒です。。何か良い方法があったら教えて頂けないでしょうか?
0880nobodyさん2005/08/03(水) 12:52:24ID:???
use warningsをコメントアウトする。
0881nobodyさん2005/08/03(水) 13:15:56ID:???
未定義なものはロジックへ流さない。基本だ。
手抜きしちゃいかんよ。
0882nobodyさん2005/08/03(水) 14:13:16ID:???
ま、俺はそれが嫌だから、CGIパラメータ処理モジュールを自作して使ってるわけだが。

CGI.pmより軽いし、超快適。
0883nobodyさん2005/08/03(水) 15:25:05ID:???
はいはい。
0884nobodyさん2005/08/03(水) 15:30:17ID:???
CGI::Lite
0885nobodyさん2005/08/03(水) 17:04:37ID:???
CGI.pmの質問ばっかだな
0886nobodyさん2005/08/03(水) 19:50:20ID:???
>>879の意味が分からないのは私だけか。
use strict,warnings下でCGI.pmを使っているけど、問題が起きたことはない。
0887nobodyさん2005/08/03(水) 20:04:55ID:???
>>886
お前だけ。
0888nobodyさん2005/08/03(水) 20:17:15ID:???
>>886
たとえばチェックボックスがチェックされなかった
ときのように、あるパラメタがそもそも送られてこないと
スカラーコンテキストのparamはundef返すので、

my $hoge = $query->param('hoge');
if ($hoge == 1) { ... }

とか書くと、use warnings下では Use of uninitialized value in 〜
が出るとかそういう話。もちろんundef返る可能性があるのに
手を抜いてるのがいけない。



08898862005/08/03(水) 20:24:57ID:???
my $hoge = $query->param('hoge') || '';
って書かないか?
0890nobodyさん2005/08/03(水) 20:46:12ID:???
それがめんどいって話なんじゃ?

0891nobodyさん2005/08/03(水) 23:09:39ID:???
手抜き(・A・)イクナイ!!
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
というエラーが出てしまいます。
どのような原因なのでしょうか・・・
0893nobodyさん2005/08/04(木) 01:44:38ID:???
>>892
Can't connect to data source

no database driver specified
DBI_DSN env var not set
0894nobodyさん2005/08/04(木) 06:15:02ID:???
>>890いやdefined云々いってるから知らないんじゃないか?
0895nobodyさん2005/08/04(木) 15:30:09ID:???
今までphp使いでこんどperlでもと思ったんですが、
正規表現と文字列変換で鼻血でそうです。
PHP+mysqlでWEBフォームくらい作れるんですが、
今まで両方とも初見の情報です。
とりあえず基本だから、ということでガリガリ覚えようとしてるんですが、
これ、どんくらいの頻度で使う知識なんですか?
もしすげぇ複雑だけど、ぜんぜん使わないよそこ、みたいなあれだったら悲しい・・・
0896nobodyさん2005/08/04(木) 15:32:53ID:???
>>892
DBIがインストールされてないというエラーと思われ
windows環境という前提でいうと、
1.activeperlインスト
2.windowsのコマンドライン(cmd)からinstall DBI
3.windowsのコマンドライン(cmd)からinstall DBD-mysql
でDBIが入る。
0897nobodyさん2005/08/04(木) 15:37:38ID:???
>>870
xammpもオススメ
0898nobodyさん2005/08/04(木) 15:42:39ID:???
>>895
俺はよく使うけど、使うときに調べればそれで十分だと思う。
けど、正規表現は面白くて好き。オライリーの詳細正規表現お薦め。
0899nobodyさん2005/08/04(木) 15:54:47ID:Ako7Yv7q
>>898
なるほど!
ちょっと安心しました。

オライリーってあの表紙が動物園みたいなやつですよね。
自分もネズミが表紙のperl本持ってます。
4000(これ、書式は%4dですかw)円は高かった・・
正規表現で一冊できちゃうとは・・・
今度探してゲットします。
ありがとうございます。
09008922005/08/04(木) 20:46:43ID:???
>>896
レスサンクス。
DBI入ってるみたいです。SSHで確認しました。
phpMyAdminから見るとセッションのデータをちゃんとMySQLに入れてて
取得も出来ています。
-wオプションをつけなければなにも問題なくうごいてるので
どうしてこんなエラーになるのかまったくわからなくって・・・
↓こんな感じのモジュール組んでます
09018922005/08/04(木) 20:48:26ID:???
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};
}
0902nobodyさん2005/08/05(金) 10:16:46ID:???
cgiでクエリを$form{$key}=$valueの形式でハッシュに格納する部分って
%form = $query =~ /([^=&]+)=([^=&]+)/g;
この1行でも問題ありませんか?
0903nobodyさん2005/08/05(金) 10:38:43ID:???
>>902
デコードとかはあとでやればいいとしても、一般には
keyが重複することがあるからだめだろうな。
0904nobodyさん2005/08/05(金) 11:12:57ID:???
>>902
hoge=aaa&hage=bbb=ccc のときとか bbb=ccc が取れない
0905nobodyさん2005/08/06(土) 08:08:56ID:???
世の中で配布されているCGIのソースを読んでみても
use strictしているソースを見たことがないのですが
use strictするメリットって何なんでしょうか
0906nobodyさん2005/08/06(土) 10:35:31ID:???
作っているときはuse strictするけど、配布時には外すよ。
0907nobodyさん2005/08/06(土) 10:38:17ID:???
ないよ
全部perl信者の妄想だから
0908nobodyさん2005/08/06(土) 11:50:04ID:???
>>905
意図しない変数の使用をチェックしてくれる
意図しない裸のワードの使用をチェックしてくれる
意図しないシンボリックリファレンスの使用をチェックしてくれる

特に変数チェックは超重要。今やuse strictしないとコードがかけません。
0909nobodyさん2005/08/06(土) 17:13:48ID:???
> 世の中で配布されているCGIのソースを読んでみても

頭の悪い人たちが書いたコードでつか?
0910nobodyさん2005/08/06(土) 19:40:45ID:???
公開する時には大概削除してるでしょ。
0911nobodyさん2005/08/06(土) 19:43:21ID:???
ttp://www.kent-web.com/
たとえばここなんか有名ですが
ここのスクリプトはuse strictが無いので
勝手に記述して実行すると完全に就職されていないグローバル変数エラーが
山ほど出てきます

他にもアップローダで一番よく使われているなずるぼんアップローダや
あっぷっぷも勝手にusestrict記述して実行すると
山ほどエラーが出てきます
0912nobodyさん2005/08/06(土) 19:55:08ID:???
そこが諸悪の根源
0913nobodyさん2005/08/06(土) 20:22:06ID:???
>>911
漏れもKヨNTでperlを習った口だ。
だが、そのせいで社会復帰がままならない。

KヨNTのスクリプトは今すぐ捨てろ!
全部捨てろ!
そして、奴の事はもう思い出すな。
0914nobodyさん2005/08/06(土) 20:25:07ID:???
普通にセキュリティホールがあるぞ、KENTのしじあい。パス系とか。。
0915nobodyさん2005/08/06(土) 21:16:56ID:???
>>911
一般人にはuse strictなんて関係ないし、
少しぐらいバグがあっても、文句言いつつ使い続けたりするだろうし。
世の中ってそんなもん。
0916nobodyさん2005/08/06(土) 21:55:53ID:???
>>915
己の成長を望まないのならそれでも良いかも知れん。
0917nobodyさん2005/08/06(土) 23:18:50ID:???
use strict; を使うことが付加価値を持つということになる時代でつか?
0918nobodyさん2005/08/07(日) 00:26:07ID:???
そこでRubyですよ
0919nobodyさん2005/08/07(日) 01:09:48ID:???
とりあえずスコープに注意して全部myしたら動きましたがこれで良いですか?
localはダメですよね?
0920nobodyさん2005/08/07(日) 02:34:49ID:???
>>906
それはチェックコストを抑えるため?
CPANで配布されている多くのコードはuse strictしたままだよね。
私も仕事ではつけたままにしてます。
先頭に#が付加されてしまう事が多いですが。
09219062005/08/07(日) 14:54:03ID:???
エラー&警告を報告してくれる酔狂なユーザーはいないから外す。
仕事なら付けたままのほうが良いかと。
0922nobodyさん2005/08/07(日) 15:07:05ID:???
で、use strict; って、何の意味があるの?
0923nobodyさん2005/08/07(日) 15:37:39ID:???
使うよ、厳密に
0924nobodyさん2005/08/07(日) 17:18:25ID:???
一種の「保証」だと考えればいい。
0925nobodyさん2005/08/07(日) 18:37:02ID: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
0926nobodyさん2005/08/07(日) 19:12:33ID:???
\
0927nobodyさん2005/08/07(日) 20:41:08ID:???
>>925
s/\\/\\\\/g;
s/'/\\'/g;
0928nobodyさん2005/08/07(日) 20:47:44ID:???
print q||; とかで囲むとだめ?

つーか、そういうウンコなの同居させるなら TT とか使えよ。
0929nobodyさん2005/08/07(日) 21:48:36ID:???
XSSバリバリになりそうだね。
レス数が900を超えています。1000を超えると表示できなくなるよ。