Perl コーディング初心者質問コーナー Part35
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/05/26 16:48ID:kkhhiYmo【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0515nobodyさん
04/06/24 23:10ID:???心配なときは、一旦グーグルに入れればいいのだ。
0516nobodyさん
04/06/25 02:44ID:???うまくいかない。
コマンドプロンプトで
d:\perl\bin>perl -c ファイルへの絶対パス
でやってるけど、useがないものならうまくいくけどuseがあると何故かuseしてる行数に
エラーがあるって出力される。
実際にhttpdで表示させると問題なくできるやつだから、何が悪いのかわかんない・・・・
もしかしてActivePerlの文法チェク機能ってuseでモジュール読みこんでるとしくじるの?
ちなみにモジュールは自前のPERLだけで書いた簡単なやつ。
誰か何か知ってたら教えて下さい。
0517nobodyさん
04/06/25 04:06ID:???>>1より抜粋
3: こんなエラーが出て上手く行かなかった。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
最低でも1と3が無いと誰も答えられないよ。
0520nobodyさん
04/06/25 11:04ID:???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] );
がやりたかったんだけど。。
こういう場合って羅列するしかないんですかね?
0522516
04/06/25 14:04ID:???useしてるものは自作のモジュールって書いたし。
エラーはuseが書いてある行数のとこで出てるって書いたけど、エラーの内容も出力されてるはずだから
それを出せってことかな?
ごめん。今からエラー文そのままあげます。
0523nobodyさん
04/06/25 14:20ID:???俺は今日初カキコだが、>>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でモジュール読みこんでると失敗するのですか?
まず何を調べるべきでしょうか?
0525nobodyさん
04/06/25 14:46ID:???0526516
04/06/25 14:57ID:???ごめん。
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に書けるとエラーはでないのでモジュール側には問題なしかと。
0527516
04/06/25 15:51ID:???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:???ああなるほど、こりゃ確かに >>516 の質問の仕方が悪い。
どうすればいいかを教えるのは簡単だが、その前に一つ質問に答えてくれ。
なんでまた、
「@INC に push しさえすればサーチパスを追加できる」
なんてことを考えたんだ?
0529nobodyさん
04/06/25 17:01ID:???か、Perl/libに入れるとか
0530516
04/06/25 17:25ID:???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:???内部的にはコンパイル言語であり、そう認識しないと往々にして罠にはまる。
その罠の一つが 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 を読んでくれる。
0534516
04/06/25 17:49ID:???ありがとうございます!今
use lib "C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test";
を初めに追加してエラーだったので、
use lib 'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
にしたら成功しました!シングルクォーテーションじゃないといけないんですね。
lib.pmがBEGINもやってくれてるんですね。
ところで、文法チェックの時以外でもlibを使って自作のモジュールを読みこむ必要が
あるんでしょうか?
モジュールを読みこむとそれだけ処理にかかる時間が増えますよね。なるべく軽くしたいのですが、
やはり自作モジュールをuseするプログラムには初めにlibでやっておいたほうがいいですか?
0535516
04/06/25 17:52ID:???BEGIN {
push @INC,'C:\WINDOWS\デスクトップ\httpd142k\cgi-bin\test';
}
をlibの変わりに書いたら、エラーがでないで文法チェックokでした!
どちらでも好きな方でやればいいってことですよね。
0537nobodyさん
04/06/25 19:54ID:???ダブルクォーテーションは \ を特別に扱う話を聞いたことはないか?
print "\n"で何が出力される?
print '\n'で何が出力される?
0539nobodyさん
04/06/25 21:02ID:QWdt1cChラジオボタンは
<INPUT name="color" type="radio" value="#758CEA">
<FONT color="#758cea">■</FONT>
のようになっておりcheckedを入れることができればOKなわけですよね。
関係演算子を使ってもcheckedを入れるような方法が思いつきません。
どなたかアドバイスお願いします。
0541nobodyさん
04/06/25 21:14ID:QWdt1cChココ以外には思いつかないのですが、どの辺を出せばよろしいでしょうか?
複数のラジオボタンからクッキーにあった一個を選ぶと言うものですが。
クッキーから前回使った色の読み込みはできます。
0543516
04/06/25 21:53ID:???俺ならそのラジオボタンの部分を全部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{〜}
とか。ちょっとブサイクなコーディングだけど、後は自分でもう少し処理を軽くするといいよ。
0544516
04/06/25 21:54ID:???0545516
04/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>
でいいね。
0547nobodyさん
04/06/25 22:15ID:???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:???まあほとんどの場合は undef が空文字列として展開されると期待されるだろう
漏れなら Template Kit 使うけど
0549516
04/06/25 22:30ID:???初めに
$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:???$hash{abcde}
今はこのように長くても5文字位に抑えてますが、できるだけわかりやすい名前をつけたいので
多少長く10文字くらいになってしまいそうになるのですが、重くなったりしそうで不安です。
みなさんはハッシュのキーを何文字くらいに収めようとしていますか?
0554nobodyさん
04/06/26 05:48ID:???おまい朝早ええな!
俺は16文字位まで。多分他のやつより長めだと思う。
っていうか誰かマジで作ったプログラムで、20文字超えたやついるのかな?
0555nobodyさん
04/06/26 05:53ID:???どうせ内部では数値に変換されるんでしょ、と思ってるから。(されてないかも)
0556nobodyさん
04/06/26 11:15ID:???されてる。
俺はだいたい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:???0558nobodyさん
04/06/26 13:02ID:???そういうのはありだ。
> '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
書いたスクリプトです。
よろしくお願いします。
0563nobodyさん
04/06/26 22:19ID:???0565nobodyさん
04/06/27 00:27ID:???0566nobodyさん
04/06/27 01:11ID:???0567nobodyさん
04/06/27 01:23ID:???0568nobodyさん
04/06/27 04:44ID:???$self->{data} = "ここで代入できる文字列の長さが知りたい";
リファレンスは元々格納場所へのアドレスを持ってるだけで、スカラに格納するわけでは
ないから大丈夫だよね。ってリファレンスじゃなくても別に大丈夫だよね?重くなるだけで。
HTML本文をそのままスカラに入れてそれを好きな文字コードに変換したいなあと思ってるんだけど
スカラに入れて一括変換なんてやるべきではないかな?
変換はjcode.pl使う。
0569nobodyさん
04/06/27 05:24ID:???0570nobodyさん
04/06/27 07:27ID:???そうなの?ならモジュールのファイルサイズが20KBでも大したことないよね?
何KBくらいからやりすぎになるの?例えば外部から30KB位のファイル読みこんで
open(FH,"uwa30kb.txt");
$a = join '',<FH>;
とかでもゴギブリの卵くらい?
0572nobodyさん
04/06/27 10:44ID:???0573nobodyさん
04/06/27 15:33ID:???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:???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許可をしてしまうとセキュリティー的にもあぶなさそう(掲示板などで自由に実行されてしまう等)なので他にSSIと同等のことができる方法はないでしょうか?
教えて下さい。お願いします。
0578nobodyさん
04/06/27 22:47ID:???0579nobodyさん
04/06/27 22:57ID:???ハ?
共通だろ
0580577
04/06/27 22:59ID:???やりたいことは
perlスクリプトAからPerlスクリプトBが出力する結果を取得してPerlスクリプトAで表示したいのです。
呼び出し元がただのhtmlならSSIを使えば簡単に実現できますがCGIからの呼び出しでは実行できません。
何かいい方法がありませんか?
0582577
04/06/27 23:20ID:???できるのは分かっていますが許可した場合第三者が掲示板の本文などにSSIでシステムコマンドなどを実行できてしまうので許可していないんです。
0583nobodyさん
04/06/27 23:24ID:???AからBに処理を渡してその戻り値をAで使いたい。
別に普通にできるし、なんでSSIとか掲示板とか許可とかの話になるん?
すいませんが、何を悩んでるのかわかりません。
0585nobodyさん
04/06/27 23:54ID:???@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でって聞き方はおかしいよ。
0588nobodyさん
04/06/28 01:40ID:???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";
}
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:???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:???sort関数ってどうなってるんですか?
@old=(1,a,4,f,5);
@new = sort{$a <=> $b}@old;
こうゆうのよく見ますけど、どうゆう流れで処理が行われているのかわかりません。
mapみたいに@oldからはひとつづつ要素が渡されてるんですよね?
その渡された要素は$_に入っているわけではなさそうですが、$aと$bには何が入ってるんでしょうか?
0594nobodyさん
04/06/28 06:49ID:???リスト中のどれか2つの要素。
どれがどの順で何回渡されるかは決まってなかったような。
(sortで使ってるアルゴリズムにもよるだろうし)
0596nobodyさん
04/06/28 09:39ID:???なるべくなら $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:???既出レコードIDの最大値に+1=追加レコードのID、てわかってるならそうすればいいじゃん。
途中まででもいいから自分でやってみるべし。
0599nobodyさん
04/06/28 15:23ID:whqvquC3read(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:vj4wrqzocgiを直接呼ばれたのとpostで来たのとを区別するにはどうしたらいいのでしょうか?
0601nobodyさん
04/06/28 15:33ID:???ループしないとだめじゃない? とくに入力元がpipeやsocketのときは
適当にどこかのバッファ長まで読まれた状態でひとまず戻ってくる
ことはよくある。
0602nobodyさん
04/06/28 15:36ID:???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
0604593
04/06/28 16:26ID:???>リスト中のどれか2つの要素。
>どれがどの順で何回渡されるかは決まってなかったような。
>(sortで使ってるアルゴリズムにもよるだろうし)
ランダムに選ばれた?二つの要素が$aと$bに入れられて、$aの方が大きければ1を等価なら0を
左の方が大きければ-1を返す?$aの方が大きければ$aに入っている要素を左に返す?
$aの中身を左辺に返した場合は元のリストの中からは消えるのですか?
なんかイマイチ流れがわかりません。sort関数については色々見に行きましたが、内部の具体的な
流れが解説されてるサイトが見つかりませんでした;
>>602
perldocは英語ですよね;翻訳かけると関数名まで翻訳されちゃってイマイチ理解できないんですよね;
したのサイトは見たことあります。
0606nobodyさん
04/06/28 18:51ID:???英語が読めないなら駱駝本を買えばいいのに。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
$a と $b に何が入るかは >>602 のページに明示されているし、
sort 関数の使い方ではなくソートアルゴリズムの話ならこの辺
行った方がいいよ。
http://pc5.2ch.net/test/read.cgi/tech/1088022524/
0607526
04/06/29 04:35ID:???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:???漏れはローカルとサーバ両方でパスとかを書き換えず動かしたいので、
my $server = $ENV{'REMOTE_ADDR'} eq '127.0.0.1' ? 'http://127.0.0.1/' : 'http://www.鯖.com/' ;
って事をしている。
0609nobodyさん
04/06/29 05:55ID:???>文法チェックでエラーがでました。
そのエラーメッセージを書こう。
ちなみに相対パスの指定は可能。存在しないパスを指定する事も可能。
e.g. use lib qw(../ /home/you/lib/perl E:/lib/perl);
>>608
use CGI ':cgi';
print server_name();
0610607
04/06/29 06:07ID:???それいいですね。でも相対指定ができるならそのほうが楽ですが。
>>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.
0611607
04/06/29 06:09ID:???#!/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:???ブラウザで開くとダウンロードのダイアログが開いてしまいます。
ダウンロードではなくそのままブラウザに表示したいので
アドバイスをください。
以下のようにして出力しています。
#!/usr/bin/perl
print qq(Content-type: text/plain\n\n);
print "minapon";
exit;
宜しくお願いします。
■ このスレッドは過去ログ倉庫に格納されています