Perl 初心者コーナー Part24
■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ
03/06/07 22:30ID:GbQKLcPE【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0740nobodyさん
03/06/22 11:54ID:???sub query_condition{
my ($lineid, $staname) = @_;
とやったら、
Can't use global @_ in "my" at search.cgi line 370.
と言われたのですが、
このエラーメッセージの意図がわかりません。
なんでこんなこといわれなきゃいけないんでしょうか?
0745nobodyさん
03/06/22 12:30ID:???0747nobodyさん
03/06/22 13:33ID:???有難うございます。
ディレクトリのパーミッションが775だったのが原因みたいです。
そのディレクトリも、CGIによって作成したものなんですが、
一生懸命0777を与えてるんですが、どうしても777になってくれません(;ω;)#775になってしまう。
ちなみに、その上のディレクトリはFTPから作成したもので、書き込みもOKです。
サーバーの設定で、ディレクトリ作成時に一般の書き込み許可させないって事とかあるのでしょうか…
兎に角、もうちょい頑張ってみます。
0748nobodyさん
03/06/22 13:39ID:???出来るものもある。System-IIIとか。
>>747
CGIでパーミッション変えればいい。
つーかユーザ権限でCGI実行できないヘボイところはとっとと見限ったほうが良い。
0750nobodyさん
03/06/22 15:47ID:wDjVUYGM$STA[$i]->{staname}
($iには0から10くらい入ってる)
には文字列があてはめられてるのに、
for ($j=0;$j<=$#STA;$j++){
push (@TMPSTALIST,$STA[$j]);
}
foreach (@TMPSTALIST){
$HTMLStaLine .= $TMPSTALIST[$_]->{staid}."/" .$TMPSTALIST[$_]->{staname}|;
}
で、何も表示してくれないんですが、なぜなんでしょうか?
0751750
03/06/22 15:47ID:wDjVUYGM$HTMLStaLineをprintしてます。
0752732
03/06/22 16:18ID:qinZbGMm2:gzipを使ってみました。
3:どこかのサイトにもあったのですが、既に圧縮されている
画像などに関しては圧縮されないみたいでした。
100kbに対して100b程度減りはしました。
画像の転送量を減らす手段は他にありませんでしょうか?
0753nobodyさん
03/06/22 16:23ID:???Perlのコーディングによる問題ではない。
よってスレ違い。
0756アラー氏 ◆.GAf6ZDA2c
03/06/22 17:16ID:???http://homepage3.nifty.com/arashi/index.html
0758nobodyさん
03/06/22 19:47ID:???メモリもクリアされるんでしょうか?
0759nobodyさん
03/06/22 20:05ID:???どこからも参照されなくなった時点でクリアされる。
逆に言えば、何かから参照されている限り、スコープを外れてもメモリの内容は残る。
たとえば、以下のようにサブルーチン内でmyした変数のリファレンスを返すということもできる。
$var = hoge();
print $$var; # うんこ
sub hoge {
my $abc = 'うんこ';
return \$abc;
}
0760nobodyさん
03/06/22 20:29ID:S8oOZHOQ複数の検索エンジンに、キーワードを投げて
その結果をまとめてから出力というものを書いています。
それで、UNIX上のApacheでcgiを走らせているので
`wget $URL`;
$html = `w3m -dump_source $URL`;
そして、ファイルに$htmlを保存
などを試してみましたが、
wgetの方はURLが長すぎてダウンロード自体に失敗して、
w3mの方は、端末で同じコマンドを打つ分には成功しますが、
実行しても、何もファイルに書き込まれていなくて上手く取得ができません。
どうか、ご教授お願いします。
0763750
03/06/22 20:50ID:Rv0SCDPi0764nobodyさん
03/06/22 20:51ID:???申し訳御座いませんでした。
0765nobodyさん
03/06/22 21:09ID:???foreach (@TMPSTALIST){
$HTMLStaLine .= $_->{lineid} . "/" . $_->{staname};
}
どういう結果が欲しいのかわからんのでこれだけ。
0766750
03/06/22 21:35ID:a19vkXUc#SELECT始まり!
$HTMLStaLine .= qq|<select name="staid" size="10" multiple>\n|;
for ($i=0;$i<=$#GlobalLineidList;$i++){
#沿線名表示!
$HTMLStaLine .= qq|<option value="">----- $LINE[$GlobalLineidList[$i]]->{linename} -----</option>|;
undef @TMPSTALIST;
for ($j=0;$j<=$#STA;$j++){
if ($STA[$j]->{lineid} == $GlobalLineidList[$i]){
push (@TMPSTALIST,$STA[$j]);
}
}
#seqでソート
@TMPSTALIST = sort { (${TMPSTALIST[$a]->{seq}} <=> ${TMPSTALIST[$b]->{seq}}) } 0 .. $#TMPSTALIST;
#沿線に属する駅名一覧を表示!
foreach (@TMPSTALIST){
$HTMLStaLine .= qq|<option value="|.$TMPSTALIST[$_]->{staid}.qq|">|.$TMPSTALIST[$_]->{staname}.qq|</option>\n|;
}
}
#SELECT終わり!
$HTMLStaLine .=qq|</select>\n|;
0768nobodyさん
03/06/22 21:59ID:???丁寧な説明有難うございます。
調子にのてもう一つお聞きしたいのですが、
リファレンスを受け取った側で、undefすると
呼び出し元もクリアされるのでしょうか?^^;
$var = hoge();
print $$var; # うんこ
undef($var); <- hogeの$abcは要らないのでクリアしたい
その後の処理…
sub hoge {
my $abc = 'うんこ';
return \$abc;
}
sub { return \%dekai_data; }
大きな値とか返した場合、クリアする必要はあるでしょうか
0769750
03/06/22 23:46ID:MaT7PvCU用は、
$STA[$i]->{lineid}
$STA[$i]->{staname}
($iには0から10くらい入ってる)なのに、
push (@TMPSTALIST,$STA[$j]);
すると、
$STA[$i]->{lineid}
は値が入ってるのに、
$TMPSTALIST[$i]->{lineid}
には値が入ってないのです。
pushした直後でも。。。
0770-
03/06/22 23:48ID:pFJThKfu「クーポン屋の仕事は簡単!」
「HPにバナーを貼ればOK!」
「年商3000万円も夢じゃない!」
「あなたの努力次第です。」
http://www.c-gmf.com/index1.htm
0771750
03/06/22 23:53ID:???@TMP = sort { (${TMPSTALIST[$a]->{seq}} <=> ${TMPSTALIST[$b]->{seq}}) } 0 .. $#TMPSTALIST;
とやるところを、
@TMPSTALIST; = sort { (${TMPSTALIST[$a]->{seq}} <=> ${TMPSTALIST[$b]->{seq}}) } 0 .. $#TMPSTALIST;
とやっていたのが原因でした。
$TMPSTALIST[$i]->{lineid}には値がちゃんと入っていたようです。
0772nobodyさん
03/06/23 01:40ID:8VAV54DKどなたかお助けください。
1:Perlからサムネイル(縮小)画像を作りたいです。
2:GDやPerlMagickなどがあることを知り、使おうと考えました。
3:私の使っているサーバにはインストールされていません。
・インストール無しで使える、画像縮小のモジュール
・画像を縮小するための具体的なアルゴリズム
・インストールが必要なGD,PerlMagickモジュールの改造方法
のような情報を求めています。
(jpeg/png/gifなどについて行いたいです。(1つしか出来なくても構いません))
色々調べてはいるのですが、GD,PerlMagickのものばかりで
良い情報が見つけることが出来ませんでした。何卒、よろしくお願いします。
0773nobodyさん
03/06/23 02:07ID:???いや、もう無理だって答えでてるでしょ?
自分で作る気がないなら何度質問しても無駄。
むしろ、君がインストールしないで使えるモノを作って公開する方が良い。
0774_
03/06/23 02:09ID:???0775nobodyさん
03/06/23 02:13ID:???要するに自分で画像処理をすれば良い。
ttp://www.st.rim.or.jp/~syamaura/gifanime/gifabout/gifabout.html
こういう感じのページ探して、自前でやるとよろし。
#ファイルフォーマットをまとめたページ(英語)がどっかにあったのだけど、
#URL失念してるので貼れない。スマソ。
多分この先はスレ違いになるのでプログラム板等に移動した方が良い。
#が、今画像処理スレはない
0776nobodyさん
03/06/23 02:41ID:???自分はロリポップでIMAGE::MAGICKを使い、デジカメ写真を画面大、
200ピクセルくらい、80ピクセルくらいの3つに一気に縮小している。
その時、ローカルサーバーにIもMAGE::MAGICKをインストールし、
ロリポップが檄重のときはローカルで縮小し、サーバーに上げるルーチンも作ったけど、
その方法も一案では。
ローカルサーバーへのインストールは
http://yassu.no-ip.com/linux/httpd.htm
などを参照。
0777nobodyさん
03/06/23 11:54ID:???>>776
ああ、そうか。ローカルに入れれば何の問題もないよな。
よかったな、>>772, >>687
これでモジュールを入れられないとかいう泣き言を言わなくてよくなったぞ。
0778nobodyさん
03/06/23 11:55ID:???perl -e '$cnt = 100; while($cnt > 0) {sleep 1; print "."; $cnt--;}'
どこがいけないのでしょうか。
0779nobodyさん
03/06/23 12:20ID:QgEnyxPf手始めにPerlで書かれた簡易チャットのソースをコピーして使っています。
微妙にスレの趣旨と違うかもしれませんが、どうか教えて下さい。
チャットの発言内容を書き込んでサブミットボタンを押した時、その内容をcgiファイルに送る。
その後、発言内容のテキストボックスを空にしたいのです。
ジャバスクリプトでサブミットボタンにonClickを付けてファンクションを呼び出し、
そのファンクション内に発言内容のテキストボックスのvalueをnullにする仕様にしたら、
チャットのログ部分に「null」とそのまま出てしまいました。
どなたか解決策をお願いします。
0780nobodyさん
03/06/23 12:28ID:???「動きません」じゃ分からん。
どう動かないのか(エラーが出る、フリーズする、こういう結果がほしいのにこうなってしまう等)を
必ず書くこと。
>>779
微妙にどころか、まるっきりスレ違いというか板違い。
0783nobodyさん
03/06/23 13:01ID:???>780ではないが、この初心者スレでは、それ以外の場合でも「動かない」と表現する奴がいる。
というか多い。
それくらいわかるだろ。
バッファリングを止めても変わらないか?
0784nobodyさん
03/06/23 13:24ID:???0785nobodyさん
03/06/23 13:28ID:???0787nobodyさん
03/06/23 16:14ID:???スクリプトの最初の方で
if ($mode eq 'regist') { ®ist; }
elsif ($mode eq 'find') { &find; }
:
とズラズラ書き並べるのはカッコ悪いのですが
何か恰好良い方法はありませんか?
0789787
03/06/23 16:29ID:???use CGI;
$q = new CGI;
$mode = $q -> param('mode');
とかしますよね。でもサブルーチン使ったとしても
どこかに
> if ($mode eq 'regist') { ®ist; }
> elsif ($mode eq 'find') { &find; }
> :
みたいのはどこかに絶対あるわけで
これがなんとかならないかな とか
SWITCH:
{
if ($mode eq = "regist" ) (®ist;last SWITCH)
if ($mode eq = "find" ) (&find;last SWITCH)
:
}
こうやれば多少はましかな‥
でもズラズラ書くのは変わらないので恰好良くないな とか。
0790nobodyさん
03/06/23 16:36ID:???0791nobodyさん
03/06/23 16:38ID:???eq = てなんどい。
Perlにかっこよさを求めるのはおろかな気が。
サブルーチンごとに分けずに、
if($mode eq 'assa'){
処理
処理
}
ってしたら?醜いけど。
0793nobodyさん
03/06/23 16:41ID:???こうすると一つで済むよ。
eval(&$mode);
このスクリプト(?)の指摘禁止ね :-)
0794787
03/06/23 16:42ID:???>Perlにかっこよさを求めるのはおろかな気が。
これが全てですね。 適当に実装しますです。
0795nobodyさん
03/06/23 17:20ID:vdloYxxu0799nobodyさん
03/06/23 19:03ID:???ローカルでは問題ないんですが、共有鯖だとどうかな、と。
まぁ、あげてみて試してみます。
同じことをテキスト保存でやったら、ファイルサイズは20`くらいなんですが、遅い。
どうしようか・・・。
0800nobodyさん
03/06/23 19:11ID:???通常、索引編成ファイルのキーや値は、任意でないかぎりメモリに入る事はないよ。
Perlだと、確かにDBMファイルとの接続速度は遅いけど、データは読込んでないから、大丈夫。
796とか798の言ってることは相手にすんな。
0804nobodyさん
03/06/23 23:46ID:???リファレンスと配列を使うとか、無名のサブルーチンで、ハッシュを使うとか書き方あると思うけどねィ・・・
んで、カッコいいよりも見やすい記述を心がけるべきだと思ったり・・・
0807nobodyさん
03/06/24 00:20ID:???if
elsif
elsif
elsif
で処理速度は落ちないんだけど、見た目が、、、
0808nobodyさん
03/06/24 00:26ID:???見た目を気にするならSwitchもどき使えばいいんであ?
ttp://tech-web.net/perlmania/perlsyn3.html
0810nobodyさん
03/06/24 00:41ID:???0811nobodyさん
03/06/24 03:06ID:???単純な質問かもしれませんが、どうか教えてください。キーワードが考え付かず、
ググっても見つけられませんでした。(←力不足っす。。)
0812nobodyさん
03/06/24 03:31ID:???TMTOWTDI.
# substr
($A, $B) = (substr($A, 2), substr($A, 0, 2));
# unpack
($B, $A) = unpack 'A2A*', $A;
# 置換1
$A =~ s/^(..)//;
$B = $1;
# 置換2
$A =~ s/^(..)/($B = $1, '')[1]/e;
# 回りくどい方法
@tmp = split //, $A;
$B = join '', splice @tmp, 0, 2;
$A = join '', @tmp;
0813nobodyさん
03/06/24 03:31ID:???s/^(.{2})//;
$1;
こんなんじゃダメかね、ダメだね。文字だもんね。
あんたのやろうとしてることは、関数で出来るよきっと。
普段そうゆう処理しないから名前は知らんけど。
どっかのサイトの関数一覧をどうぞ。
上の正規表現で十分ならそちらをどうぞ。
081452
03/06/24 03:37ID:???# unpack
($B, $A) = unpack 'A2A*', $A;
コレ使わせてもらいました。
0815nobodyさん
03/06/24 04:16ID:???0817nobodyさん
03/06/24 06:44ID:???アルゴリズムを見れば、どの関数を使うべきか直感的に分かるから。
たくさんコードを書いてると自然に身についてくる。
0818nobodyさん
03/06/24 07:03ID:???分かりやすい名前付けた方が後々分かりやすいって聞くけど、
その名前が思い付かないとき…。
漏れコーディングより、名前で時間くう…。
こんな漏れって変でつか…?
0819nobodyさん
03/06/24 07:31ID:???少なくとも 5.8.0 には標準で Switch.pm がある。
use Switch;
switch ($val) {
case 1 { print "number 1" }
case "a" { print "string a" }
case [1..10,42] { print "number in list" }
case (@array) { print "number in list" }
case /\w+/ { print "pattern" }
case qr/\w+/ { print "pattern" }
case (%hash) { print "entry in hash" }
case (\%hash) { print "entry in hash" }
case (\&sub) { print "arg to subroutine" }
else { print "previous case not true" }
}
0823nobodyさん
03/06/24 09:26ID:2JWEavap「500 Internal Server Error」が出てしまう時がある。
httpdのログを見る限りエラーメッセージが出てるんだけど・・・
回避方法って無いですかね?
0824nobodyさん
03/06/24 10:41ID:???クラス名・変数名に迷ったら書き込むスレ
http://pc2.2ch.net/test/read.cgi/tech/1046541730/
こんなスレもあるでよ
0825818
03/06/24 10:44ID:4jjnB7QK初耳です。
こっち行きます。
0827nobodyさん
03/06/24 11:05ID:???ネーミングで困ることは少ないな
大抵そういう、どうでもいい変数で困る事が多いし
0828nobodyさん
03/06/24 11:11ID:2JWEavap分からないなら、しゃべんなって。
な。
0829nobodyさん
03/06/24 11:19ID:???お前はあの文章がわかんのか、とか思ったら本人だったので鬱
0830nobodyさん
03/06/24 11:23ID:???0832nobodyさん
03/06/24 12:32ID:???0833nobodyさん
03/06/24 13:40ID:???0834nobodyさん
03/06/24 13:59ID:???0835nobodyさん
03/06/24 14:10ID:RsywTEy7つまり値を参照するときはフィールド番号(って言うんですか?)で指定しなければいけません。
$record[2]みたく。
できれば、フィールド名で参照したいんですけど、それって無理なんですか?
連想配列みたいになれば言うことないんですが。
$record{'DATE'}って感じに参照したいんですけど、DBIだけでは無理?
どの解説サイトみても、「配列でかえります」までしか説明されてませんでした。
0836nobodyさん
03/06/24 14:29ID:???表示する時2ちゃんねるみたいに
1&750-800みたいに途中を飛ばして表示するとして
ログがレス順1から順に並んで保存されてるとすると
2-749まで空読みして飛ばしますよね?
これって無駄に思えますが何か良い方法ありませんか?
レスを逆順に800,799・・・保存する方法も考えましたけど
これだと表示時に表示するレスの分だけメモリ消費して
こちらも無駄かなと思ってしまうんですが。
全レス表示したら全レス分配列必要だし。
前者だとレスが多いスレだとCPU負荷がかかるし
後者だとメモリを多く消費してしまうし、何か他の選択が
ないでしょうか?
0838nobodyさん
03/06/24 14:38ID:???1レス1ファイル形式(w
■ このスレッドは過去ログ倉庫に格納されています