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

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

■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ04/04/05 16:01ID:???
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
065564304/05/09 18:19ID:???
>>644
盛り上がっているところすいません
open(IN,"/なんとか/test.cgi hoge|");
として受け取るtest.cgiに@ARGVを使うということでしょうか?
test.cgiに手を加えないで出来る方法があったらその方がよいのですが無理ですか?
0656nobodyさん04/05/10 00:13ID:???
open(IN, "env QUERY_STRING=hoge /path/to/test.cgi |");
0657nobodyさん04/05/10 12:53ID:???
掲示板作ってるんだけどさ…
AUだけ

掲示板に書き込んだ→書き込み完了画面表示→戻るリンク(その掲示板のトップへ行く)

この最後の戻るリンクをクリックすると、また書き込みしちゃうんだけど、どうすれば対処できるんでしょうか?
imode、vodafoneはちゃんと掲示板のトップに戻ってくれるんですが orz
0658nobodyさん04/05/10 13:05ID:???
>>657
>>1
http://www.au.kddi.com/ezfactory/
0659nobodyさん04/05/10 13:12ID:???
>>658
だめなんです、解決方法が載ってないんです orz
0660nobodyさん04/05/10 14:41ID:???
SMART! ウェブ講座の中の人たちはいつまで江ノ島旅行に行ってるのですか?
0661nobodyさん04/05/10 14:48ID:9bXUHl3j
ソケットを使ってどこかのHTMLを取得し、それを加工して表示する
というプログラムを書いています。
少々疑問に思ったのですが、ソケットでHTMLを獲得するのと
ウェブブラウザでHTMLを獲得するのとでは何が違うのでしょう?
処理するのがユーザ側かサーバ側か、の違いと見て良いんでしょうか。
0662nobodyさん04/05/10 15:08ID:???
>>661
ブラウザも同じソケット通信してるから、同じこと。
そのようにサーバ側でソケット使おうとユーザ側で使おうと
どちらもHTTPクライアントリクエストをwwwサーバに対しておこなっている
0663nobodyさん04/05/10 15:17ID:???
変数の名前を変数にしたい場合はどのようにすればよろしいでしょうか。
PHPなら$foo = "val";のとき$$fooで$valにアクセス出来ますが,Perlはちょっと違いますか?

$val = "hoge";
$prm = "val";
print $$prm; #「print $val;」と同じ結果

$val = "hoge";
$HASH{'prm'} = "val";
print $$HASH{'prm'}; #ダメ
0664nobodyさん04/05/10 15:25ID:???
ブレースでくくれば同様にできるよ。でも必要性を感じない。
0665nobodyさん04/05/10 15:28ID:???
訂正します。use strict;だとCan't use string ("val") as a SCALAR ref while "strict refs" in use at...などと怒られます。

use strict;
my $val = "hogehoge";
my $prm = "val";
print $$prm; #だめ
print ${$prm}; #これもだめ
0666nobodyさん04/05/10 15:34ID:???
絶対にシンボリックリファレンスでないとダメなん?
他のアプローチを考えたほうが早いと思うが…
0667nobodyさん04/05/10 15:36ID:???
他にはどういうやり方があるのでしょうか?
0668nobodyさん04/05/10 15:41ID:???
use strict;
my $prm= 'val';
my $$prm= 'hoge';
print $$prm;

or

#use strict;
0669nobodyさん04/05/10 15:50ID:???
no strict 'refs';
0670nobodyさん04/05/10 15:56ID:???
>>669
それでもダメでした。あきらめます。
0671nobodyさん04/05/10 16:04ID:???
myで宣言するローカル変数はシンボリックリファレンスの対象にならないから

my $$prm= 'hoge';

なんてのは無理ってもんだろう。
0672nobodyさん04/05/10 16:18ID:???
2次元配列を関数内で作成しその戻り値を受け取りたいのですがうまくいきません。
どうすればいいのでしょうか。
以下のようでは空っぽのままです。

--

$test = &hairetu;
print $test[0][0];
print $test[1][1];


sub hairetu {
$box[0][0] = 0;
$box[0][1] = 0;
$box[1][0] = 0;
$box[0][2] = 0;
return $box;
}



0673nobodyさん04/05/10 16:19ID:???
訂正
×$box[0][2] = 0;
○$box[1][1] = 0;
0674nobodyさん04/05/10 16:40ID:???
$test = &hairetu;
print $$test[0][0];
print $$test[1][1];


sub hairetu {
$box[0][0] = 0;
$box[0][1] = 0;
$box[1][0] = 0;
$box[1][1] = 0;
return \@box;
}
0675nobodyさん04/05/10 16:46ID:???
>>672
$test = &hairetu;
print $test->[0][0];
print $test->[1][1];


sub hairetu {
$box->[0][0] = 0;
$box->[0][1] = 0;
$box->[1][0] = 0;
$box->[0][2] = 0;
return $box;
}
067667204/05/10 16:51ID:???
>>675
ありがとうございました。
無事思うような動作が出来ました。
067767404/05/10 16:59ID:???
_| ̄|○
067866104/05/10 17:04ID:9bXUHl3j
>>662
するとソケットを使用したHTML取得CGIをAと言うサーバに置いた場合
ブラウザからCGIを呼び出すと
ブラウザ→CGI→HTML (→はリクエスト)
となるのではなく
ブラウザ→HTML
となるのでしょうか?
CGIを置いたサーバに負荷が掛かりそうでちょっと尻込みしているのですが
サーバ側に負荷は行かない、のかな?
0679nobodyさん04/05/10 17:07ID:???
そりゃ多少の負荷はかかるでしょ。
でもそんなこと言ってたらCGIは何一つ動かせない。
それ以前に、ソケットの使えないところも多いけどね。
0680nobodyさん04/05/10 17:14ID:???
>>678
> ブラウザ→CGI→HTML (→はリクエスト)
が正解。
cgiがプロキシのような役割をするわけやね。
0681nobodyさん04/05/10 19:02ID:???
>>657
戻るリンクの代わりに戻るフォームもしくはlocationで飛ばす。
でいいような気がするけど確信はない。
いい加減な情報でスマソ。
0682nobodyさん04/05/10 19:05ID:???
残念ながら携帯はlocationでのリダイレクトに対応して無い物が多いよ。
0683nobodyさん04/05/10 19:13ID:???
まず全角というところに突っ込みを入れたい
0684すまん04/05/10 19:14ID:DDeHe7Rs
EUC-JPの機種依存文字が変数に含まれているかどうか
調べるにはどうしたらいいの?
0685nobodyさん04/05/10 19:54ID:???
携帯の動作なんか考えたこと無いな
0686nobodyさん04/05/10 21:18ID:???
>>663
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlref.html

>>684
http://www.din.or.jp/~ohzaki/perl.htm#Character
0687nobodyさん04/05/11 00:27ID:???
リファレンスとデリファレンスがどうしてもわかりません。
詳しく載ってる本やサイトってないでようか?
0688nobodyさん04/05/11 00:53ID:???
何が解らんの。
ラクダ本とか perlref じゃ駄目?
0689nobodyさん04/05/11 01:07ID:???
>661
ブラウザで個人的に見るのは著作権的に合法。
ソケットでCGIで取得して不特定多数に閲覧可能な状態にしてしまうのは著作権的に違法。
0690nobodyさん04/05/11 01:48ID:???
>>689
公開http proxyが違法という主張?
anonymizerは? exciteやinfoseekのweb翻訳は?
0691nobodyさん04/05/11 07:45ID:???
今、このスレを見つけて1から読んでいるが
「恥知らず」という言葉を思い出したよ。

>「でも、本当に簡単なミスでも、指摘されるまで気付かないことだってありますよ。 」

簡単なミスに、指摘されるまで気付かない事自体
恥ずかしい事と思わなかったのか?

そういう台詞を言う事自体「甘え」だと思わなかったのか?

ちゃんとした大人なら、そんな甘えた台詞は恥ずかしくて言えないものだが。

こういうやつが設計をやると、三びし自みたいな日さんな事故がおきるんだろうな。
0692nobodyさん04/05/11 08:26ID:???
今頃レスしてるのも恥ずかしいと思うけどな。
0693nobodyさん04/05/11 10:07ID:???
変に行間空けるのも恥ずかしいと思うけどな。
文章に自信が無いから飾ってるだけ。
0694nobodyさん04/05/11 10:37ID:???
ファイルの読み込み時にも排他処理は必要なんでしょうか
他人様のスクリプトを見てみたところ
ロックしている方もいますし、ロックしていない方も居ます。
0695nobodyさん04/05/11 10:47ID:???
>>694
書き込んでいる真っ最中のデータを読み込んだり、
読み込んでる最中に書き込み始めたりしてもいいのなら
読込時に排他処理は不要。

「共有ロック」なんてのも調べてみると吉。
0696nobodyさん04/05/11 12:08ID:yHiP+CIC
>>695
やっぱり書き込んでいる真っ最中のデータを読み込んだり、
読み込んでる最中に書き込み始めたりしちゃうわけですね。
システム側でなんとかしてくれるのかと思ってました。

共有ロック、取り入れてみたいと思います
ありがとうございました
0697nobodyさん04/05/11 13:57ID:xHapOBBn
Location ヘッダは、Locationヘッダをブラウザに返しブラウザが指定したファイルに飛ぶのか、
サーバーがLocationヘッダで指定されたファイルを返すのか、
どちらでしょう? どちらでもなければ、それを教えてください。

0698nobodyさん04/05/11 14:09ID:???
>>697
前者
0699nobodyさん04/05/11 14:25ID:???
すいませんが、コンパイルの仕方を教えてくれないでしょうか?
サーバをテストに使ったらファイルが消えた時に責任取れないんで
ローカルでテストしたいんですがどうすれば・・・
0700nobodyさん04/05/11 14:51ID:???
Perlはコンパイルせずとも動きますが。
0701nobodyさん04/05/11 14:55ID:???
MySQLをPerlから操作しようとしました。
そしたらinstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ...
とエラーがでました。
恐らくモジュールが入ってないのかと思いますが
どうすればインストールできるでしょうか。
一応、Msql-Mysql-modules-1.2219と言うのをDLしてきましたが
root権限など持っていないので説明にある方法ではインストールできません。
cgiとおなじフォルダにmysql.pmを置いてやれば動くような気もしますが
取り敢えず/mysql/libの中身をまるごと置いてやっただけでは動きませんでした。
070269904/05/11 15:42ID:???
テキストファイルに書いたプログラムをデバッグする方法が知りたいのです
0703nobodyさん04/05/11 15:49ID:???
>>702
winのローカル環境で動かしたいなら
http://x-web.pobox.ne.jp/fcgi/fcgi_01.html
が分かりやすいと思います
0704nobodyさん04/05/11 17:05ID:???
>>694-702
スレ違い
070569904/05/11 17:35ID:???
では、私はどこへ行けばいいのでしょうか?
とりあえず上のリンク先には行ってきましたが・・・
0706nobodyさん04/05/11 17:40ID:???
http://pc5.2ch.net/test/read.cgi/php/1078991985/l50

この人のところに文法チェッカーが配布されとる
0707nobodyさん04/05/11 18:02ID:???
<!--user-->という文字を、<a href="$usaddress">($usaddressは変数展開される)
という文字に変換したいのですが、
$line =~ s/<!--user-->/<a href="$usaddress">/g;
では変換されません。
どこが間違っているのでしょうか?
0708nobodyさん04/05/11 18:06ID:???
>>707
Perlがこわれています。再インストールをしてください。
0709nobodyさん04/05/11 18:12ID:???
>>699
ActivePerlでぐぐれ。
071070704/05/11 18:24ID:???
>>708
それってマジレスですか?
0711nobodyさん04/05/11 18:31ID:???
おれ708じゃねーけど、手元のperlではこうなるからな。
これは普通には変換されているというと思うのだが。

% cat user.pl
$usaddress = "foo";
$line = "<!--user-->";

$line =~ s/<!--user-->/<a href="$usaddress">/g;

print $line, "\n";
% perl user.pl
<a href="foo">
071271204/05/11 19:08ID:j+/3ilVK
http://sumiro2.hp.infoseek.co.jp/cgi-bin/abc/bbbs.cgi
の掲示板なのですが、専用アイコン以外の普通のアイコンが表示されません。
中身は↓のようになってます。どうしたらいいのか、教えてください。お願いします。
http://sumiro2.hp.infoseek.co.jp/afraid/bbs.txt
0713nobodyさん04/05/11 19:18ID:???
>>712
ここはコーディングスレなのでスレ違い。
071471204/05/11 19:20ID:???
うぅぅぅ・・
すいません・・・
0715nobodyさん04/05/11 19:36ID:???
>>714
スレ違いだが、たらい回しにされて可哀想なので一言・・。
http://sumiro2.hp.infoseek.co.jp/afraid/bbsimg/ここにアイコンを格納。
>$imgurl = "./img/";
を
>$imgurl = "http://sumiro2.hp.infoseek.co.jp/afraid/bbsimg/";
に変更。
0716nobodyさん04/05/11 20:04ID:???
( ゚д゚)ハァ?
071770704/05/11 20:54ID:???
>>711
すいません、1からそのように書いたら動きました。
なんか全角スペースかなにか入ってたのかもしれません。
ありがとうございます
0718nobodyさん04/05/11 21:28ID:M72HBXcr
電気ストーブが出来たんですが、鯖エラーになります。どこを修正したらいいんでしょうか

http://pc5.2ch.net/test/read.cgi/php/1010583350/68
071971804/05/11 21:40ID:M72HBXcr
コンソールでperl -cw stove.plとしてチェックしても
特にエラーは出ていません。

しかし、Windows2000 + Apache2 + perl5.6.1では
鯖エラー500が出てしまいます。
どの辺がまずいのでしょうか?
0720nobodyさん04/05/11 21:43ID:???
flock とか使ってたりして・・・
072171804/05/11 21:48ID:M72HBXcr
コマンドプロンプトで
perl stove.pl
としたら、htmlのソースが表示されました。
これはサーバの問題でしょうか?
それとも、ソースに不備があってもコマンドプロンプトでは表示されるんでしょうか?
0722nobodyさん04/05/11 21:50ID:???
CGIの拡張子設定が .pl になってないんじゃ?
072371804/05/11 21:52ID:M72HBXcr
あ、stove.plは
http://pc5.2ch.net/test/read.cgi/php/1010583350/68-69
に分けて貼ってあるソースです。
0724nobodyさん04/05/11 21:58ID:???
>>718
http://www.rfs.jp/sitebuilder/perl/03/02.html
0725nobodyさん04/05/11 22:04ID:???
なんかふざけたやつだな。
答える気にならん。
072671804/05/11 22:17ID:lgCnMYEo
>>722
アドバイスありがとうございます。
拡張子設定はplになっています。

>>724
ありがとうございます。
よく読んでみます。
072771804/05/11 22:23ID:lgCnMYEo
>>724
print "Content-type: text/html", "\n\n";

が抜けていた為だったようです。

おかげで、エラーは出なくなりました。
しかし、ONボタンを押してもストーブが付きません。
なぜでしょうか?
072871804/05/11 22:37ID:lgCnMYEo
自己レスです。

’O N'などとスペースを入れてしまっていました。
ONに直して動くようになりました。
0729nobodyさん04/05/12 00:31ID:cFb5OXA3
�@$hoge->a='1';
�A$hoge->a('1');
�Bif ($hoge->a eq '1'){

}
�@左辺値としても使えて、$hoge->{'a'}に'1'をセットする
�Aみたいに引数で$hoge->{'a'}にセットできて
�Bみたいに引数が与えられない場合$hoge->{'a'}の値を返す
ようなメソッドを書きたいのですけどどうやったらいいのか判りませんです
どっかで見た気がするけど見つからないです
気が向いたら教えてくださいまし
0730nobodyさん04/05/12 02:08ID:???
>>729
http://perldoc.com/perl5.8.4/pod/perlsub.html#Lvalue-subroutines

require 5.006;

sub Foo::foo : lvalue {
  my $self = shift;
  @_ and $self->{'-foo'} = shift;
  $self->{'-foo'};
}

my $obj = bless {} => 'Foo';
$obj->foo = 'foo!'; print $obj->foo; # foo!
$obj->foo('bar!'); print $obj->foo; # bar!
0731nobodyさん04/05/12 04:19ID:???
質問です。
配布しているcgiに以下の記述がありました。
2ch型掲示板でID生成部分の一部です。

> $id = crypt($identify,"${year}S\.E${mday}X${mon}");

crypt関数への第二引数の部分で、「S」や「\.」、「E」、「X」はただのノイズ用文字なのでしょうか?
\記号が含まれてるため何か意味を持つのではないかと思い質問いたしました。

引用元 ttp://www.toshinari.net/ 「2chブラウザ対応掲示板」
0732nobodyさん04/05/12 06:17ID:???
>>731
http://perldoc.com/perl5.8.4/pod/func/crypt.html
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/crypt.3.html
0733nobodyさん04/05/12 10:27ID:???
>>729
Attribute::Property
http://search.cpan.org/~juerd/Attribute-Property-1.05/
とかも。」
073473104/05/12 11:58ID:???
>>732
回答ありがとうございます。

saltは先頭が$1$以外の場合、通常先頭2文字を使うため、
$id1 = crypt($identify,"${year}"); # 104
$id2 = crypt($identify,"${year}S\.E${mday}X${mon}"); # 104S.E12X4
のどちらでも同じ結果となりました。(v5.8.2 built for MSWin32-x86-multi-thread)
もし何らかの要因で各変数が空だとしてもEとXは不要になると思うんです。
ひょっとしてコーディングミスなのでしょうか。
0735nobodyさん04/05/12 12:54ID:???
>>734
それは作者のみぞ知る、だな。
0736nobodyさん04/05/12 13:00ID:???
>>731のやり方で2chと互換性のあるトリップ生成できるの?
もしそうならこの話題継続キボン
073773104/05/12 13:19ID:???
>>735
どうもありがとうございました。

>>736
トリップはトリップキーをplainに、トリップキーの2文字目3文字目をsaltに、
足りない場合はH.を末尾に置き、後ろからn文字取ればn桁トリップになります。
$trip = substr(crypt($key, substr($key."H.", 1, 2)), -8); # 8桁トリップ
2chでもしたらばでもトリップ生成方法は同じのようです。
私の質問したID部分は、本家2chの場合トリップよりも複雑になっているようですが。
0738nobodyさん04/05/12 13:38ID:???
for と foreach の内部処理は同じという事を初心者板で見ましたが、
では foreach(@array) は for のように書けるのでしょうか。
こちらでは for($i = 0; @array; ++$i) とかやってみたのですがエラーが出ました。
0739nobodyさん04/05/12 13:39ID:???
初心者スレでした。
0740nobodyさん04/05/12 13:52ID:???
for(@array)
for($i=0; $i<@array; $i++)
0741nobodyさん04/05/12 14:05ID:???
という事は最終的に
for($i = 0; $i < @array; $_ = $array[$i], ++$i)
のような感じになってるのですね。
スッキリしました。
0742nobodyさん04/05/12 14:42ID:???
◆ 全サーバトリップ統一作戦
http://qb3.2ch.net/test/read.cgi/operate/1067245837/
0743nobodyさん04/05/12 16:37ID:???
>>741
単にforとforeachを交換しても実行するバイトコードは変わらない、というだけの話だと思うが。
for(@array){ ... } # OK
foreach(my $i = 0; $i < @array; $i++){ .. } # OK

for($i = 0; $i < @array; $_ = $array[$i], ++$i){} はfor(@array){}に比べると
ずっと遅い、$_がlocal化されない、$_を書き換えても@arrayの要素は変わらない、などの違いがあるしな。
0744nobodyさん04/05/12 16:58ID:???
>>743
添字使いたいときもfor(my $i = 0; $i < @array, $i++) {...} よりfor(0..$#array) {...}の
方が速いよね。なんとなく0..$#arrayのリストを最初に作ってから〜とかしそうで
最初は抵抗あったけど、試してみるとその辺は処理系がよろしくやってくれてる
みたいだし。
0745nobodyさん04/05/12 19:03ID:???
無効コンテキストの場合、演算子の位置はどちらが見易いですか。
多くの人はポストのようですが。
#オプティマイザが勝手にプリにしてくれるのはラクダ本で理解
0746nobodyさん04/05/12 23:29ID:???
>>745
インクリメント・デクリメント演算子のことか?

普通はポストだが、C++のコードを読み書きした直後はついプリにしてしまうね。
0747nobodyさん04/05/12 23:33ID:???
$a++
++$a

ってことか?
0748nobodyさん04/05/13 00:54ID:???
$hoge++; で統一だな。
C#かなにかも後置推奨だった木がするので。
最もC#などとPerlじゃ変数の命名規則も違うけど
0749nobodyさん04/05/13 05:29ID:???
>>748
もっと色々のコーディングをしてみると前置も後置も便利なのが判るかと思います。
0750nobodyさん04/05/13 06:04ID:???
場合によって使い分けろってことだな。
0751nobodyさん04/05/13 06:06ID:???
プリデクリメントとポストインクリメント固定。
アセンブラとCからの習慣。
0752nobodyさん04/05/13 10:08ID:???
メール送信のプログラムを書いているのですが、
サーバの環境上、Dateフィールドが自動で設定されません。
そこで、自力でDateフィールドを

Date: Wed, 12 May 2004 08:50:48 +0900

のように書きたいのですが、書き方がわかりません。
(途中まではわかるのですが、下記例の最後の行がわかりません)
どなたかご存じの方、教えていただければ幸いです。

# 日時の取得 $ENV{'TZ'} = "JST-9";#タイムゾーンの設定
$times = time();#時刻を取得
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
$month++;
$year = $year + 2000;
@month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@weekly = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut');#表示したい曜日文字
$Date = sprintf?(ここ不明)

0753nobodyさん04/05/13 10:30ID:???
>>752
http://perldoc.com/perl5.8.4/pod/func/sprintf.html
http://www.rfs.jp/sitebuilder/perl/05/05.html#sprintf
075475204/05/13 10:57ID:???
>>753
すみません、それをみてもちんぷんかんぷんでして。。。
できれば>>752のケースの例を教えていただけませんでしょうか?
そこから勉強したいと思いまして。
すみませんが、よろしくお願いいたします。
075575204/05/13 11:33ID:???
以下のように、sprintfを3回つかうことはできたのですが、1回ですます方法がわかりません。
sprinfの中でカンマを表示したく、それはどのようにすればいいのでしょうか?

$ENV{'TZ'} = "JST-9";#タイムゾーンの設定
$times = time();#時刻を取得
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
$year = $year + 1900;
@month_array = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@weekly_array = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut');#表示したい曜日文字

$hour = sprintf( "%02d", $hour );
$min = sprintf( "%02d", $min );
$sec = sprintf( "%02d", $sec );
my $Date = qq|$weekly_array[$wday], $mday $month_array[$month] $year $hour:$min:$sec +0900|;
■ このスレッドは過去ログ倉庫に格納されています