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

Perl コーディング初心者質問コーナー Part35

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/05/26 16:48ID:kkhhiYmo
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0514nobodyさん04/06/24 23:03ID:???
>>513
またウイルスだったりして・・・・とりあえず関係ない俺は踏まないでおこう。
0515nobodyさん04/06/24 23:10ID:???
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&oe=UTF-8&q=http%3A%2F%2Fwww%2Emnot%2Enet%2Fcache%5Fdocs%2F
心配なときは、一旦グーグルに入れればいいのだ。
0516nobodyさん04/06/25 02:44ID:???
ActivePerlをwin98に入れてPERLのテストしてるんだけど、-cを使った文法チェックが
うまくいかない。

コマンドプロンプトで
d:\perl\bin>perl -c ファイルへの絶対パス
でやってるけど、useがないものならうまくいくけどuseがあると何故かuseしてる行数に
エラーがあるって出力される。

実際にhttpdで表示させると問題なくできるやつだから、何が悪いのかわかんない・・・・

もしかしてActivePerlの文法チェク機能ってuseでモジュール読みこんでるとしくじるの?
ちなみにモジュールは自前のPERLだけで書いた簡単なやつ。

誰か何か知ってたら教えて下さい。
0517nobodyさん04/06/25 04:06ID:???
>>516
>>1より抜粋

3: こんなエラーが出て上手く行かなかった。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最低でも1と3が無いと誰も答えられないよ。
0518nobodyさん04/06/25 09:58ID:???
>>516
何をuseしてるのかは書かないのか。
0519nobodyさん04/06/25 10:07ID:???
use >>516の頭;
0520nobodyさん04/06/25 11:04ID:???
syntax error at >>519 line 1, near "use>>516の頭" Execution of >>519 aborted due to compilation errors.
0521nobodyさん04/06/25 13:49ID:???
範囲演算子って、小さい値〜大きい値の範囲じゃないと動かないんだね…

@Time = gmtime( time + 60 * 60 * 9 );
$Time[5] += 1900;
$Time[4] += 1;

ってしたときに、
sprintf( "%04d/%02d/%02d", @Time[5..3] );

がやりたかったんだけど。。
こういう場合って羅列するしかないんですかね?
052251604/06/25 14:04ID:???
どうゆこと?
useしてるものは自作のモジュールって書いたし。
エラーはuseが書いてある行数のとこで出てるって書いたけど、エラーの内容も出力されてるはずだから
それを出せってことかな?

ごめん。今からエラー文そのままあげます。
0523nobodyさん04/06/25 14:20ID:???
>>522
俺は今日初カキコだが、>>517と同じことを思ったよ。
>useしてるものは自作のモジュールって書いたし。
ってあるけど、最後におまけのように書いてあるだけじゃん。普通に見落とすよ。
要するに質問の仕方がド下手糞ってことだ。

あるスクリプトを-cオプションでチェックするとエラーがでます。
環境は、Win98 + ActivePerl version○○です。

↓のようなスクリプトで、
---hoge.pl---
1: #!/usr/bin/perl
2: use mymodule; # 自作モジュール(簡単なPurePerlライブラリ)
------------

C:\>perl -c hoge.pl

とすると、

○○○ at hoge.pl line 2.

と出ます。

でも、CGIとしてhttpdに実行させると問題なく動きます。
もしかしてActivePerlの-cオプションはuseでモジュール読みこんでると失敗するのですか?
まず何を調べるべきでしょうか?
0524nobodyさん04/06/25 14:28ID:???
>>521

sprintf( "%04d/%02d/%02d", reverse(@Time[3..5]) );
0525nobodyさん04/06/25 14:46ID:???
@INC
052651604/06/25 14:57ID:???
>>523
ごめん。
D:\Perl\bin>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI
これをやったら↓のエラーがでた。
Can't locate Test1.pm in @INC (@INC contains: D:/Perl/lib D:/Perl/site/lib .) at
C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B
.CGI line 3.

b.cgiの中身は↓
#!/usr/local/bin/perl
push( @INC, 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\Test1.pm' );
use Test1;
print "Content-type:text/html\n\n";
print "aiueoi";

useしているTest1.pmの中身は↓
package Test1;
#京
sub new{
my $self = shift;
my $obj = {a => 1 , b => 2};
bless $obj,$self;
}
1;

モジュールだけ-cに書けるとエラーはでないのでモジュール側には問題なしかと。
052751604/06/25 15:51ID:???
#!/usr/local/bin/perl

b.cgiを書き換えてみたけど、

package main;

BEGIN {
push( @INC, '/Test1.pm' );
}

use Test1;
print "Content-type:text/html\n\n";
print "aiueoi";

まだエラーだった。
Can't locate Test1.pm in @INC (@INC contains: D:/Perl/lib D:/Perl/site/lib . /Te
st1.pm) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI line 9.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B
.CGI line 9.

@INCへの追加が失敗していて、読みこむファイルのパスが見つからないってことだよね?
0528nobodyさん04/06/25 16:18ID:???
>>527
ああなるほど、こりゃ確かに >>516 の質問の仕方が悪い。

どうすればいいかを教えるのは簡単だが、その前に一つ質問に答えてくれ。

なんでまた、
「@INC に push しさえすればサーチパスを追加できる」
なんてことを考えたんだ?
0529nobodyさん04/06/25 17:01ID:???
use libしろ。または、ちゃんとプログラムが置いてある所まで移動してやれ。
か、Perl/libに入れるとか
053051604/06/25 17:25ID:???
>>528
http://www.rfs.jp/sitebuilder/perl/
ここの@INCの説明にpushすればいいて書いてあったんだけど、意味を勘違いして受け取ったのかも;
それで
http://nonki.net/technical/perl/library/
ここの
>@INCに手動で追加する
っていうところ読んで、BEGINしてみたけどそれも間違ってたのかも;

>>529
use lib;
の一行を足してみたけど、駄目だった。それでプログラムが置いてあるフォルダに移動して
C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\
CGI-BIN\TEST\B.CGI
をやったら
C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\B.CGI syntax OK
成功した!感激!

Perl/libに入れるというのはプログラムをそのフォルダに入れとくって事?やってみたら
同じエラーがでた。

本当は@INCにどうやって追加すればいいんでしょうか?beginもうまくいかないし;
後、文法チェックでは>>526で書いたプログラムはエラーだけど、httpdで
http://localhost/cgi-bin/test/b.cgi
でやると問題なく動作するけど、サーバではエラーになるんですか?
まだサーバと契約してないから、試せない。
0531田舎者 ◆BNNnMrNVbI 04/06/25 17:26ID:???
おお!すごいなぁ。
0532田舎者 ◆o0/tSn5Zoc 04/06/25 17:27ID:???
最高ですね!
0533nobodyさん04/06/25 17:34ID:???
初心者は perl をインタプリタ言語だと捉えがちで、確かに見た目はそう見えるが、
内部的にはコンパイル言語であり、そう認識しないと往々にして罠にはまる。

その罠の一つが use によるライブラリの読み込み。
use で指定したライブラリは、実行時ではなく、コンパイル時に読み込まれる。
たまに if($a==1){ use Foo::Bar;} なんてことをやる人がいるが、
この Foo::Bar はif条件に関係なく必ず読み込まれる。

同様に、初心者は push(@INC,'/hoge/fuga'); use Foo::Bar; と書くことで
@INC にパスを追加してから Foo::Bar を読み込んでくれる、と考えがちだが、
実際には コンパイル→Foo::Bar読み込み→実行→push の順で処理されるので、
Foo::Bar 読み込み時にはまだ @INC にパスが追加されておらず、エラーになる。
このような場合には、push ではなく、use lib を使う。
use lib '/hoge/fuga' と書いておくと、これがコンパイル時に処理されるので、
この時点で @INC に /hoge/fuga が追加され、そこから Foo::Bar を読んでくれる。
053451604/06/25 17:49ID:???
>>533
ありがとうございます!今
use lib "C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test";
を初めに追加してエラーだったので、
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
にしたら成功しました!シングルクォーテーションじゃないといけないんですね。

lib.pmがBEGINもやってくれてるんですね。
ところで、文法チェックの時以外でもlibを使って自作のモジュールを読みこむ必要が
あるんでしょうか?
モジュールを読みこむとそれだけ処理にかかる時間が増えますよね。なるべく軽くしたいのですが、
やはり自作モジュールをuseするプログラムには初めにlibでやっておいたほうがいいですか?

053551604/06/25 17:52ID:???
今シングルクォートならうまく行くことをしって、
BEGIN {
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
をlibの変わりに書いたら、エラーがでないで文法チェックokでした!

どちらでも好きな方でやればいいってことですよね。
053650004/06/25 18:45ID:???
>>513
レス遅くなりました。
英語のサイトなんですね;nifty翻訳にでも書けてみます。
0537nobodyさん04/06/25 19:54ID:???
>>534
ダブルクォーテーションは \ を特別に扱う話を聞いたことはないか?
print "\n"で何が出力される?
print '\n'で何が出力される?
053851604/06/25 20:14ID:???
>>537
初歩的なことを忘れてました;すいません。

ありがとうございました!
0539nobodyさん04/06/25 21:02ID:QWdt1cCh
掲示板の文字色を選ぶラジオボックスをクッキー対応にしたいのですがどのようにやればよろしいでしょうか。
ラジオボタンは
<INPUT name="color" type="radio" value="#758CEA">
<FONT color="#758cea">■</FONT>
のようになっておりcheckedを入れることができればOKなわけですよね。
関係演算子を使ってもcheckedを入れるような方法が思いつきません。
どなたかアドバイスお願いします。
0540nobodyさん04/06/25 21:06ID:???
>>539
そんな一部分だけ出されても答えようがない。
0541nobodyさん04/06/25 21:14ID:QWdt1cCh
>>540
ココ以外には思いつかないのですが、どの辺を出せばよろしいでしょうか?
複数のラジオボタンからクッキーにあった一個を選ぶと言うものですが。
クッキーから前回使った色の読み込みはできます。
0542nobodyさん04/06/25 21:44ID:???
>>541
お前、ここはPerlスレだぞ。
お前が貼り付けたのはどう見たって、HTMLにしか見えない。
054351604/06/25 21:53ID:???
>>541
俺ならそのラジオボタンの部分を全部PERLで動的に作成するかな。
$ENV{'HTTP_COOKIE'}の中身を条件文にかけて、$taguの中に何を入れるか決める。
それでできるよ。

例)
$cook = \$ENV{'HTTP_COOKIE'};
if ($cook eq "758cea" ) {
$tagu = qq|<INPUT name="color" type="radio" value="#758CEA" checked>|.
     qq|<INPUT name="color" type="radio" value="#000000">|;
}elsif($cook eq "000000"){
〜
}else{〜}

とか。ちょっとブサイクなコーディングだけど、後は自分でもう少し処理を軽くするといいよ。
054451604/06/25 21:54ID:???
ごめん。$cookをifの条件文で使うときは$$cookとかでデリファレンスしてね。
054551604/06/25 22:03ID:???
なんかクッキーの読みこみ後に=以前を切るの忘れてた。
修正も兼ねてもっと簡単に。
if ( $ENV{'HTTP_COOKIE'} eq "hogehoge" ) {$c1 = "checked";}
elsif(〜){$c2 = "checked";}else{〜}
それで
<INPUT name="color" type="radio" value="#758CEA" $c1>
<INPUT name="color" type="radio" value="#758CEA" $c2>
でいいね。
0546nobodyさん04/06/25 22:12ID:???
>>545
もし$c1にcheckedが入った場合$2には何が入るの?
0とかでもタグに不都合はないのかな…
0547nobodyさん04/06/25 22:15ID:???
my @Color_key = qw/
758CEA
000000
:
:
:
/; # 必要数並べる。

my %Color;
# $Color{'758CEA'} = ' checked';
# $Color{'000000'} = ''; のように成るように久喜をパージングしる。

foreach (@Color_key){
printf qq|<INPUT name="color" type="radio" value="#%s"%s>|, $_, $Color{$_};
printf qq|<span style="background: transparent; color:#%s">■</span>|, $_;
}
0548nobodyさん04/06/25 22:28ID:???
>>546
まあほとんどの場合は undef が空文字列として展開されると期待されるだろう

漏れなら Template Kit 使うけど
054951604/06/25 22:30ID:???
>>546
初めに
$c1 = "";
$c2 = "";
をしておく。
if文とかの制御構文はある程度勉強しておくといいよ。ちなみに>>545の場合
真がでてそのブロック処理をした時点でそれ以降の処理はおこなわれない。
0550nobodyさん04/06/25 23:03ID:???
こんなんとかってダメなん?

%COLOR_NUM = (1 => "#000000", 2 => "#FF0000", 3 => "#008040", 4 => "#0000FF", 5 => "#C100C1", 6 => "#FF80C0", 7 => "#FF8040");
print <<"EOF";
<TD>Color:</TD><TD><SELECT name="color" style="width : 40px;">
EOF
foreach (sort keys %COLOR_NUM) {
    if ($COOKIE{"color"} eq $COLOR_NUM{$_}) {
        $selected = " selected";
    } else {
        $selected = "";
    }
    print "<OPTION value=\"$COLOR_NUM{\"$_\"}\" style=\"color : $COLOR_NUM{\"$_\"};\"$selected>■</OPTION>\n";
}
print <<"EOF";
</SELECT></TD>
EOF
0551nobodyさん04/06/25 23:19ID:???
しばらくして気付いたけど、ラジオボタンだったんか・・・
まぁ似てるからいいか。
0552nobodyさん04/06/26 04:58ID:???
すごく初歩的な質問ですみませんが、連想配列のkeyの名前は通常何文字くらいが理想ですか?

$hash{abcde}
今はこのように長くても5文字位に抑えてますが、できるだけわかりやすい名前をつけたいので
多少長く10文字くらいになってしまいそうになるのですが、重くなったりしそうで不安です。

みなさんはハッシュのキーを何文字くらいに収めようとしていますか?
0553nobodyさん04/06/26 05:10ID:???
>>552
わかりやすい名前をつけるのを優先させればよい。
重くなるかどうかはベンチマークをとってみればわかる。
0554nobodyさん04/06/26 05:48ID:???
>>552
おまい朝早ええな!
俺は16文字位まで。多分他のやつより長めだと思う。
っていうか誰かマジで作ったプログラムで、20文字超えたやついるのかな?
0555nobodyさん04/06/26 05:53ID:???
長さなんて気にしたことないな。
どうせ内部では数値に変換されるんでしょ、と思ってるから。(されてないかも)
0556nobodyさん04/06/26 11:15ID:???
>>555
されてる。

俺はだいたい7文字ぐらいかな。
複数の単語が入ってるときは、多分何かがおかしい。
例:
$hash{HOGE_NUMBER}
$hash{HOGE_NAME}
$hash{HOGE_EMAIL}
おれなら↓こうする
$hash{HOGE}{NUMBER}
$hash{HOGE}{NAME}
$hash{HOGE}{EMAIL}
0557nobodyさん04/06/26 12:12ID:???
アクセスログの処理なんかで平気で$_log{'http://pc5.2ch.net/test/read.cgi/php/1085557731/'}ってやってるけど...?
0558nobodyさん04/06/26 13:02ID:???
>>557
そういうのはありだ。
> 'http://pc5.2ch.net/test/read.cgi/php/1085557731/'
は自分で付けた名前じゃないだろ?
0559nobodyさん04/06/26 17:23ID:???
間違えてム板に書いてしまいました。
質問させてください。

トラックバックのpingを実装しようとSocketでPOSTリクエストをする
スクリプトを書きました。実際にリクエストはできるのですが、相手側からの
意図した応答が得られませんでした。リクエスト内容を教えていただけませんか?

ttp://lowlife.jp/yasusii/stories/8.html
ここのリクエスト内容を参考にしました。

ttp://www5e.biglobe.ne.jp/~halcyon/cgi-bin/tb/test.txt
書いたスクリプトです。

よろしくお願いします。
0560nobodyさん04/06/26 17:40ID:???
>>559
You must encode URL.
0561nobodyさん04/06/26 20:38ID:???
>>559
You must read thread title.
0562nobodyさん04/06/26 21:33ID:???
>>559
I suggest you use Net::TrackBack.
0563nobodyさん04/06/26 22:19ID:???
This is a English-Speaking thread here.
0564nobodyさん04/06/27 00:14ID:???
>>563
s/ a / an /;
0565nobodyさん04/06/27 00:27ID:???
パンチ5分の2のバカはどこいった?絶対一生続けるって豪語してたくせに(プゲラ
0566nobodyさん04/06/27 01:11ID:???
煽るなよヴォケが
0567nobodyさん04/06/27 01:23ID:???
まぁ、なんだ、Perlのパンチ5分の2とPHPの本7は一生治らんな
0568nobodyさん04/06/27 04:44ID:???
スカラー変数のリファレンスってどれくらいのデータを格納できるの?2.71KBってやりすぎ?
$self->{data} = "ここで代入できる文字列の長さが知りたい";

リファレンスは元々格納場所へのアドレスを持ってるだけで、スカラに格納するわけでは
ないから大丈夫だよね。ってリファレンスじゃなくても別に大丈夫だよね?重くなるだけで。

HTML本文をそのままスカラに入れてそれを好きな文字コードに変換したいなあと思ってるんだけど
スカラに入れて一括変換なんてやるべきではないかな?

変換はjcode.pl使う。
0569nobodyさん04/06/27 05:24ID:???
2KBなんてハエのうんこみたいなもんだ。
0570nobodyさん04/06/27 07:27ID:???
>>569
そうなの?ならモジュールのファイルサイズが20KBでも大したことないよね?

何KBくらいからやりすぎになるの?例えば外部から30KB位のファイル読みこんで
open(FH,"uwa30kb.txt");
$a = join '',<FH>;
とかでもゴギブリの卵くらい?
0571nobodyさん04/06/27 07:59ID:???
>>570
> 何KBくらいからやりすぎになるの?

仮想メモリーを使うくらい。
0572nobodyさん04/06/27 10:44ID:???
apache の RLimitMEM 制限に引っかからないくらい。
0573nobodyさん04/06/27 15:33ID:???
>>462

1<>い<>12:50<>
4<>あ<>20:02<>
2<>き<>08:41<>
…

$buf = $ENV{'QUERY_STRING'};
$buf =~s/[^0-9]//g;
@txt = sort{(split(/<>/,$b))[0] cmp (split(/<>/,$a))[0]}@txt if($buf==1);
@txt = sort{(split(/<>/,$b))[1] cmp (split(/<>/,$a))[1]}@txt if($buf==2);
@txt = sort{(split(/<>/,$b))[2] cmp (split(/<>/,$a))[2]}@txt if($buf==3);

観覧者が見たい順にソートしたいんで、今はこのようにしてるんですが、
ハッシュの使い方がいまいち分かりません。
もう少しヒントを頂けないでしょうか?
0574nobodyさん04/06/27 16:44ID:???
まぁ、正直寂しい
0575nobodyさん04/06/27 22:33ID:???
PERLのレスポンスヘッダで文字コードを指定するときって
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "Content-type:text/html;charset=euc-jp\n\n";

JISの場合はなんて書くんだっけ?
0576nobodyさん04/06/27 22:38ID:???
検索エンジンって便利なものがあるらしいよ
0577nobodyさん04/06/27 22:44ID:???
cgiからSSI使ってincludeしたいんだけど
cgiからのSSI許可をしてしまうとセキュリティー的にもあぶなさそう(掲示板などで自由に実行されてしまう等)なので他にSSIと同等のことができる方法はないでしょうか?
教えて下さい。お願いします。
0578nobodyさん04/06/27 22:47ID:???
意味がわかりません。
0579nobodyさん04/06/27 22:57ID:???
>PERLのレスポンスヘッダ
ハ?
共通だろ
058057704/06/27 22:59ID:???
perlスクリプトAとperlスクリプトBがあるとします。
やりたいことは
perlスクリプトAからPerlスクリプトBが出力する結果を取得してPerlスクリプトAで表示したいのです。
呼び出し元がただのhtmlならSSIを使えば簡単に実現できますがCGIからの呼び出しでは実行できません。
何かいい方法がありませんか?
0581nobodyさん04/06/27 23:11ID:???
>>580
普通にできると思うが。。。
058257704/06/27 23:20ID:???
>>581
できるのは分かっていますが許可した場合第三者が掲示板の本文などにSSIでシステムコマンドなどを実行できてしまうので許可していないんです。
0583nobodyさん04/06/27 23:24ID:???
>>582
AからBに処理を渡してその戻り値をAで使いたい。
別に普通にできるし、なんでSSIとか掲示板とか許可とかの話になるん?
すいませんが、何を悩んでるのかわかりません。
0584nobodyさん04/06/27 23:48ID:???
>>583
その方法を577は教えろと言ってんじゃないの?
0585nobodyさん04/06/27 23:54ID:???
以前こちらで質問した>216なんですが、また少しお聞きしたい事があります。

@data = ('A,7,緑',
'C,6,青',
'B,4,赤',
'A,9,紫',
'A,2,黄緑',
'B,10,黄',
'C,3,青紫');

上記のような配列があり、これを一項と二項目でソートしたいのですが、
ここでもう一つの条件、
二項目の比較にある数字にもっとも近い数字からソートする、
という条件を加えたいのです。

例えば 二項目が 8 にもっとも近い数字からソートした場合

@data = ('A,9,紫',
'A,7,緑',
'A,2,黄緑',
'B,10,黄',
'B,4,赤',
'C,6,青',
'C,3,青紫');

といった感じにしたいのです。

前にお聞きした方法で作業を進めていたのですが、
どうしてもこの問題で詰まってしまい困っています。
何か良いお知恵があれば何卒ご教授下さい。
0586nobodyさん04/06/27 23:59ID:???
方法ったって、標準出入力介してもいいだろうし、
AからBをrequireするなり、モジュールにしてuseしてもいいだろうしさ。
evalとかdoとかの話もするの?

あ、ただCGIスクリプト内で別のCGIスクリプトの出力をそんまま
取り込みたい、って話なら、それは「CGIのお作法」の話なので、
別をあたってください。
でもそれならperlスクリプトAとBでって聞き方はおかしいよ。
0587nobodyさん04/06/28 00:54ID:???
>>585
前言われたやり方+シュウォルツでうまいことやりなさい。
0588nobodyさん04/06/28 01:40ID:???
$base= 8;
for (map{$_->[0]} sort {($a->[1] < 0 ? -$a->[1] : $a->[1]) <=> ($b->[1] < 0 ? -$b->[1] : $b->[1])} map{[$_,$base-(split',')[1]]}@data){
print $_,"\n";
}
0589nobodyさん04/06/28 03:19ID:???
>>588
わかりづら!
0590nobodyさん04/06/28 05:19ID:???
変数名に使えるのってアンダーバーと英数字だよね?

<input type=image src="hoge.jpg" name=test>

でも↑をsubmitとして使って、PERLで受けとると
test.x=
test.y=
が付いてきて、
foreach ( split /&/,$ENV{'QUERY_STRING'} ) {
(my $a , my $b ) = split /=/;
$form{$a} = $b;
}
とかやると、%formのキーにtest.xっていうのができちゃう。
一応動作に支障はないけど、ハッシュのキーにピリオド使っていいの?
0591nobodyさん04/06/28 05:45ID:???
>>585
my $base = 8;
my @sorted =
  map $_->[3],
  sort { $a->[0] cmp $b->[0] || $a->[1] <=> $b->[1] || $b->[2] <=> $a->[2] }
  map { /^([^,]+),([^,]+)/; [ $1, abs($2 - $base), $2, $_ ] }
  @data
;
print map "$_\n", @sorted;
0592nobodyさん04/06/28 06:02ID:???
条件式?:の条件演算子って条件式で真なら左辺を偽なら右辺を返すから普通は
$a = $b == 0 ? 1:2;
みたいに使うんだろうけど、
map{ /a/ ? $a += $a : $b += $a } @array;
みたいに真と偽の時の処理に↑みたくやるのも正しい使いかた?

これ使うと今の長いソースが短くできるからやりたいんだけど、HTMLでStrict厨な俺は
PERLでもなるべく正しい関数の使い方をしたいとか思ってる;

?:をifみたく処理の分岐で使うのはどうなの?
0593nobodyさん04/06/28 06:16ID:???
>>591
sort関数ってどうなってるんですか?
@old=(1,a,4,f,5);
@new = sort{$a <=> $b}@old;
こうゆうのよく見ますけど、どうゆう流れで処理が行われているのかわかりません。
mapみたいに@oldからはひとつづつ要素が渡されてるんですよね?
その渡された要素は$_に入っているわけではなさそうですが、$aと$bには何が入ってるんでしょうか?

0594nobodyさん04/06/28 06:49ID:???
>>593
リスト中のどれか2つの要素。
どれがどの順で何回渡されるかは決まってなかったような。
(sortで使ってるアルゴリズムにもよるだろうし)
0595nobodyさん04/06/28 09:18ID:???
>>592
Perlの存在自体を否定しているのですね。
0596nobodyさん04/06/28 09:39ID:???
>>592
なるべくなら $a $b は使わない方がいい。
あとは、perl 添付のドキュメントを読む。描き方に関しては perlstyle あたりを中心に。
0597nobodyさん04/06/28 14:51ID:cJ2UZAf9
次のようなリストを読み込んでレコードを追加したいのです
データ区切りは<>を使い文字列にカンマが入っても対応できる
ようにしてあります。
一番先頭のデータを重複の無いキー番号としたいのです

そこでレコード追加時に先頭のデータをチェックして
最大値の次の値と先頭にアルファベットを追加してキー番号を
生成したいのですが、どの様にプログラムを組めばよさそうでしょうか?


A000001<>xxxx<>XXXXX
A000003<>xxxx<>XXXXX
A000010<>xxxx<>XXXXX
A000004<>xxxx<>XXXXX
A000008<>xxxx<>XXXXX
0598nobodyさん04/06/28 15:04ID:???
>>597
既出レコードIDの最大値に+1=追加レコードのID、てわかってるならそうすればいいじゃん。
途中まででもいいから自分でやってみるべし。
0599nobodyさん04/06/28 15:23ID:whqvquC3
<form method="post">で送られてきたデータを
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});

な形で取得しようとしているのですが長い文章の場合に途中までしか取得
できません。

$inを以下のような感じで出力させると、
print $ENV{'CONTENT_LENGTH'};
print length($in);

$ENV{'CONTENT_LENGTH'} が 8205 のときはlength($in)は 8000 と出力され、
$ENV{'CONTENT_LENGTH'} が 9252 のときもlength($in)は 8000 と出力されます。
$ENV{'CONTENT_LENGTH'} が 8000を下回った場合にはlength($in)は同じ数値が出力されます。

どっちにしても8000しかreadが出来ていないようなのですがどうしてなんでしょうか?

環境はIE6 + redhat9 + perl v5.8 です。
0600nobodyさん04/06/28 15:30ID:vj4wrqzo
教えてください。
cgiを直接呼ばれたのとpostで来たのとを区別するにはどうしたらいいのでしょうか?
0601nobodyさん04/06/28 15:33ID:???
readって必ず指定した長さまで一気に読めるわけではないので、
ループしないとだめじゃない? とくに入力元がpipeやsocketのときは
適当にどこかのバッファ長まで読まれた状態でひとまず戻ってくる
ことはよくある。

0602nobodyさん04/06/28 15:36ID:???
>>593
http://perldoc.com/perl5.8.4/pod/func/sort.html
http://flex.ee.uec.ac.jp/texi/perl/perl_54.html

>>599
ご利用の httpd のスレへ行って下さい。

>>600
http://pc5.2ch.net/test/read.cgi/php/1055597189/

>>601
http://perldoc.com/perl5.8.4/pod/func/read.html
http://flex.ee.uec.ac.jp/texi/perl/perl_90.html
0603nobodyさん04/06/28 15:38ID:???
>>599
勉強のためとかじゃなけりゃCGIモジュール使った方がいいような気がする。
060459304/06/28 16:26ID:???
>>594
>リスト中のどれか2つの要素。
>どれがどの順で何回渡されるかは決まってなかったような。
>(sortで使ってるアルゴリズムにもよるだろうし)

ランダムに選ばれた?二つの要素が$aと$bに入れられて、$aの方が大きければ1を等価なら0を
左の方が大きければ-1を返す?$aの方が大きければ$aに入っている要素を左に返す?
$aの中身を左辺に返した場合は元のリストの中からは消えるのですか?

なんかイマイチ流れがわかりません。sort関数については色々見に行きましたが、内部の具体的な
流れが解説されてるサイトが見つかりませんでした;

>>602
perldocは英語ですよね;翻訳かけると関数名まで翻訳されちゃってイマイチ理解できないんですよね;
したのサイトは見たことあります。
0605nobodyさん04/06/28 16:30ID:???
>>604
QuickSortのアルゴリズムを調べてみれ。多分分かる。
0606nobodyさん04/06/28 18:51ID:???
>>602
英語が読めないなら駱駝本を買えばいいのに。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod

$a と $b に何が入るかは >>602 のページに明示されているし、
sort 関数の使い方ではなくソートアルゴリズムの話ならこの辺
行った方がいいよ。
http://pc5.2ch.net/test/read.cgi/tech/1088022524/
060752604/06/29 04:35ID:???
>>526で質問したものですが、自分で作ったモジュールを@INCに追加したい場合は
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
か
BEGIN{
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
でやるのはわかったのですが、'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test'
は絶対パスでないといけないのですか?

サバにアップしたときの事を考えて相対パスでいいならそうしておきたいのですが、
use lib '../c';
use lib '..\c';
などをやってみたところ文法チェックでエラーがでました。ローカル環境ではライブラリを@INCに
追加する時のパスをドライブ名からの絶対指定でないと無理でしょうか?

環境は
win98/ie6/httpd/activeperl5.6/
です。
0608nobodyさん04/06/29 05:03ID:???
>>607
漏れはローカルとサーバ両方でパスとかを書き換えず動かしたいので、
my $server = $ENV{'REMOTE_ADDR'} eq '127.0.0.1' ? 'http://127.0.0.1/' : 'http://www.鯖.com/' ;
って事をしている。
0609nobodyさん04/06/29 05:55ID:???
>>607
>文法チェックでエラーがでました。
そのエラーメッセージを書こう。

ちなみに相対パスの指定は可能。存在しないパスを指定する事も可能。
e.g. use lib qw(../ /home/you/lib/perl E:/lib/perl);

>>608
use CGI ':cgi';
print server_name();
061060704/06/29 06:07ID:???
>>608
それいいですね。でも相対指定ができるならそのほうが楽ですが。
>>609
エラー文は以下の通りです。続いてファイルの中身を挙げます。

C:\WINDOWS>perl -c C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI
Can't locate Test1.pm in @INC (@INC contains: ../c D:/Perl/lib D:/Perl/site/lib
.) at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C\A.CGI line 3.
BEGIN failed--compilation aborted at C:\WINDOWS\デスクトップ\HTTPD1~1\CGI-BIN\TEST\C
\A.CGI line 3.
061160704/06/29 06:09ID:???
a.cgiの中身

#!/usr/local/bin/perl
use lib '../c';
use Test1;
#京
print "Content-type:text/html;charset=euc-jp\n\n";
print "aiueo";

Test1.pmの中身

package Test1;
#京
sub new{
my $self = shift;
my $obj = {a => 1 , b => 2};
bless $obj,$self;
}
1;

a.cgiのlibの一行を
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test\c';
にするとオーケーがでます。\を/に変えてもオーケーはでます。

相対パスにすることは可能でしょうか?
0612nobodyさん04/06/29 06:16ID:???
質問!
演算子って同じような意味のものがあったりするけどどうしてでしょうか?
>や<の比較系は
数値用として<,>,==,<=,>=
文字列用としてgt,lt,eq,ge,le

それで、
and,or
と
||,&&
も用途別なんでしょうか?優先順位は||,&&の方が高いみたいですが。
これも
数値用||,&&
文字列用or,and
なのですか?でも
$a == 1 || $a == 2
ならいいですが、
$a == 1 || $a eq "ふたつ"
の場合は||とorのどちらを使えばいいでしょうか?
0613nobodyさん04/06/29 06:22ID:???
CGIで単純にtextを出力してブラウザに表示させたいのですが
ブラウザで開くとダウンロードのダイアログが開いてしまいます。
ダウンロードではなくそのままブラウザに表示したいので
アドバイスをください。
以下のようにして出力しています。

#!/usr/bin/perl
print qq(Content-type: text/plain\n\n);
print "minapon";
exit;

宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています