Perl コーディング初心者質問コーナー Part34
■ このスレッドは過去ログ倉庫に格納されています
0001前スレの連投で気分崩したので後よろ
04/04/05 16:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0696nobodyさん
04/05/11 12:08ID:yHiP+CICやっぱり書き込んでいる真っ最中のデータを読み込んだり、
読み込んでる最中に書き込み始めたりしちゃうわけですね。
システム側でなんとかしてくれるのかと思ってました。
共有ロック、取り入れてみたいと思います
ありがとうございました
0697nobodyさん
04/05/11 13:57ID:xHapOBBnサーバーがLocationヘッダで指定されたファイルを返すのか、
どちらでしょう? どちらでもなければ、それを教えてください。
0699nobodyさん
04/05/11 14:25ID:???サーバをテストに使ったらファイルが消えた時に責任取れないんで
ローカルでテストしたいんですがどうすれば・・・
0700nobodyさん
04/05/11 14:51ID:???0701nobodyさん
04/05/11 14:55ID:???そしたらinstall_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ...
とエラーがでました。
恐らくモジュールが入ってないのかと思いますが
どうすればインストールできるでしょうか。
一応、Msql-Mysql-modules-1.2219と言うのをDLしてきましたが
root権限など持っていないので説明にある方法ではインストールできません。
cgiとおなじフォルダにmysql.pmを置いてやれば動くような気もしますが
取り敢えず/mysql/libの中身をまるごと置いてやっただけでは動きませんでした。
0702699
04/05/11 15:42ID:???0703nobodyさん
04/05/11 15:49ID:???winのローカル環境で動かしたいなら
http://x-web.pobox.ne.jp/fcgi/fcgi_01.html
が分かりやすいと思います
0705699
04/05/11 17:35ID:???とりあえず上のリンク先には行ってきましたが・・・
0706nobodyさん
04/05/11 17:40ID:???この人のところに文法チェッカーが配布されとる
0707nobodyさん
04/05/11 18:02ID:???という文字に変換したいのですが、
$line =~ s/<!--user-->/<a href="$usaddress">/g;
では変換されません。
どこが間違っているのでしょうか?
0711nobodyさん
04/05/11 18:31ID:???これは普通には変換されているというと思うのだが。
% cat user.pl
$usaddress = "foo";
$line = "<!--user-->";
$line =~ s/<!--user-->/<a href="$usaddress">/g;
print $line, "\n";
% perl user.pl
<a href="foo">
0712712
04/05/11 19:08ID:j+/3ilVKの掲示板なのですが、専用アイコン以外の普通のアイコンが表示されません。
中身は↓のようになってます。どうしたらいいのか、教えてください。お願いします。
http://sumiro2.hp.infoseek.co.jp/afraid/bbs.txt
0714712
04/05/11 19:20ID:???すいません・・・
0715nobodyさん
04/05/11 19:36ID:???スレ違いだが、たらい回しにされて可哀想なので一言・・。
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:???0718nobodyさん
04/05/11 21:28ID:M72HBXcrhttp://pc5.2ch.net/test/read.cgi/php/1010583350/68
0719718
04/05/11 21:40ID:M72HBXcr特にエラーは出ていません。
しかし、Windows2000 + Apache2 + perl5.6.1では
鯖エラー500が出てしまいます。
どの辺がまずいのでしょうか?
0720nobodyさん
04/05/11 21:43ID:???0721718
04/05/11 21:48ID:M72HBXcrperl stove.pl
としたら、htmlのソースが表示されました。
これはサーバの問題でしょうか?
それとも、ソースに不備があってもコマンドプロンプトでは表示されるんでしょうか?
0722nobodyさん
04/05/11 21:50ID:???0723718
04/05/11 21:52ID:M72HBXcrhttp://pc5.2ch.net/test/read.cgi/php/1010583350/68-69
に分けて貼ってあるソースです。
0724nobodyさん
04/05/11 21:58ID:???http://www.rfs.jp/sitebuilder/perl/03/02.html
0725nobodyさん
04/05/11 22:04ID:???答える気にならん。
0726718
04/05/11 22:17ID:lgCnMYEoアドバイスありがとうございます。
拡張子設定はplになっています。
>>724
ありがとうございます。
よく読んでみます。
0727718
04/05/11 22:23ID:lgCnMYEoprint "Content-type: text/html", "\n\n";
が抜けていた為だったようです。
おかげで、エラーは出なくなりました。
しかし、ONボタンを押してもストーブが付きません。
なぜでしょうか?
0728718
04/05/11 22:37ID:lgCnMYEo’O N'などとスペースを入れてしまっていました。
ONに直して動くようになりました。
0729nobodyさん
04/05/12 00:31ID:cFb5OXA3�A$hoge->a('1');
�Bif ($hoge->a eq '1'){
}
�@左辺値としても使えて、$hoge->{'a'}に'1'をセットする
�Aみたいに引数で$hoge->{'a'}にセットできて
�Bみたいに引数が与えられない場合$hoge->{'a'}の値を返す
ようなメソッドを書きたいのですけどどうやったらいいのか判りませんです
どっかで見た気がするけど見つからないです
気が向いたら教えてくださいまし
0730nobodyさん
04/05/12 02:08ID:???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:???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:???Attribute::Property
http://search.cpan.org/~juerd/Attribute-Property-1.05/
とかも。」
0734731
04/05/12 11:58ID:???回答ありがとうございます。
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は不要になると思うんです。
ひょっとしてコーディングミスなのでしょうか。
0737731
04/05/12 13:19ID:???どうもありがとうございました。
>>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:???では foreach(@array) は for のように書けるのでしょうか。
こちらでは for($i = 0; @array; ++$i) とかやってみたのですがエラーが出ました。
0739nobodyさん
04/05/12 13:39ID:???0740nobodyさん
04/05/12 13:52ID:???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:???単に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:???添字使いたいときもfor(my $i = 0; $i < @array, $i++) {...} よりfor(0..$#array) {...}の
方が速いよね。なんとなく0..$#arrayのリストを最初に作ってから〜とかしそうで
最初は抵抗あったけど、試してみるとその辺は処理系がよろしくやってくれてる
みたいだし。
0745nobodyさん
04/05/12 19:03ID:???多くの人はポストのようですが。
#オプティマイザが勝手にプリにしてくれるのはラクダ本で理解
0746nobodyさん
04/05/12 23:29ID:???インクリメント・デクリメント演算子のことか?
普通はポストだが、C++のコードを読み書きした直後はついプリにしてしまうね。
0747nobodyさん
04/05/12 23:33ID:???++$a
ってことか?
0748nobodyさん
04/05/13 00:54ID:???C#かなにかも後置推奨だった木がするので。
最もC#などとPerlじゃ変数の命名規則も違うけど
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:???http://perldoc.com/perl5.8.4/pod/func/sprintf.html
http://www.rfs.jp/sitebuilder/perl/05/05.html#sprintf
0754752
04/05/13 10:57ID:???すみません、それをみてもちんぷんかんぷんでして。。。
できれば>>752のケースの例を教えていただけませんでしょうか?
そこから勉強したいと思いまして。
すみませんが、よろしくお願いいたします。
0755752
04/05/13 11:33ID:???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|;
0756nobodyさん
04/05/13 11:39ID:???0757nobodyさん
04/05/13 11:40ID:???0758nobodyさん
04/05/13 11:47ID:???strftime使った方が楽じゃない?
use POSIX qw(strftime);
my $Date = strftime("%a, %d %b %Y %H:%M:%S %z", localtime);
sprintf(printf)の使い方も憶えといて損はないと思うけどね。激しく基本だと思う。
0759nobodyさん
04/05/13 11:49ID:???# JST == GMT + 9 時間
my $time = time + 9 * 60 * 60;
my $diff = '+0900';
my($sec, $min, $hour, $mday, $month, $year, $wday) = gmtime $time;
my @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
my @wday = qw(Sun Mon Tue Wed Thr Fri Sut);
my $Date = sprintf
'Date: %s, %02d %s %04d %02d:%02d:%02d %s',
($wday[$wday], $mday, $month[$month], $year + 1900, $hour, $min, $sec, $diff)
;
# 別解
my $Date = sprintf
'Date: %s, %02d %s %04d %02d:%02d:%02d %s',
(split /\W+/, scalar gmtime $time)[0,2,1,6,3,4,5], $diff
;
0760nobodyさん
04/05/13 13:09ID:???色々な方法があるかと。
0761nobodyさん
04/05/13 18:00ID:???Perlでの変数の値域ってどうなっているんでしょう?
文字列で扱うときはいいんですけど、数値で扱うときはどこまで大きい数字が扱えるかは、
Perlのバージョンとかで違うのでしょうか?
0762nobodyさん
04/05/13 20:48ID:???0764nobodyさん
04/05/13 22:13ID:???Perlのバージョンでは基本的には変わらない(perl6になれば変わるかもしれない)が、
バージョンは同じでもコンパイルオプションやOSによって異なる可能性がある。
まぁ普通はこんな感じだと思うが。小さすぎると思うならMath::Big(Int|Float)で。
> perl "-V:[in]v(size|type)"
ivsize='4'
ivtype='long'
nvsize='8'
nvtype='double'
0765nobodyさん
04/05/14 04:19ID:7/s5Izsl# crypt関数使用可否チェック
undef $check_crypt;
$check_crypt = eval { crypt('1111', '11'); 1; }; # ここが23行目
if ($@) { $check_crypt = 2; }
if ($check_crypt == 1) { crypt関数が使える時の処理 }
elsif ($check_crypt == 2) { crypt関数が使えない時の処理 }
else { 不明な時の処理 }
これを、-wオプション付で構文チェックすると
Useless use of a constant in void context at c:\www\〜\xxx.cgi line 23.
と注意されたのですが、どこが問題なんでしょうか?
このままでも使用に問題は無いのですが、少し気になるので・・。
よろしくお願いします。
0766nobodyさん
04/05/14 05:21ID:???戻り値を使うべき関数であるところの crypt() が
無効コンテキスト (void context) に置かれているから。
my $check_crypt = eval { crypt('1111', '11') } ? 1 : $@ ? 2 : 0;
とか
if (eval { crypt('1111', '11') }) { 使用可能 }
elsif ($@) { 未実装 }
else { crypt が何らかのエラー }
0767nobodyさん
04/05/14 06:02ID:???use HTTP::Date;
my $Date = time2str(time()+60*60*9);
$Date =~ s/GMT/+0900/;
とか。
>>761
use Config;
print "このシステムでは、\n",
"整数型(IV)はCで言うと$Config{ivtype}で、バイト長は$Config{ivsize}バイト\n",
"実数型(NV)はCで言うと$Config{nvtype}で、バイト長は$Config{nvsize}バイト\n";
いろいろ調べてみては。
0768752
04/05/14 10:31ID:???参考になります。
sprintfもなんとなくわかってきました。精進します。
ありがとうございます。
0769nobodyさん
04/05/14 10:36ID:???その日はその月の何週間目になるか調べる方法は在りますか?
この場合3が取得できるようにしたいです。
0770765
04/05/14 10:52ID:???レスありがとうございます。
問題の箇所を
$check_crypt = eval { crypt('1111', '11') } ? 1 : $@ ? 2 : 0;
と書き換えることにより、無事解決することができました。
無効コンテキストというものに理解が弱く、検索や書籍で調べても
まだ完全に理解するまでには至っていないのですが、
crypt関数の戻り値を利用すべき所なのに利用していなかったことが
問題だったのですね?
ちゃんと理解できるまで、もっと調べてみます。
ありがとうございました。
0771nobodyさん
04/05/14 11:57ID:???これのような気がする。
http://search.cpan.org/~amurren/DayOfNthWeek-1.0/
違ったら適当に探してくれ。
http://search.cpan.org/search?m=all&q=Date&n=100
0772nobodyさん
04/05/14 12:19ID:???問題の説明が曖昧だ。「その月の何週間目」という言い方はあまり
しないと思うのではっきりと定義して欲しい。
多分、月を週に分割してそのいくつ目に入るかって意味だとは思う
のだが、週の始まりは何曜日かとか、最初の週は0週目なのか
1週目なのかとかといった数え方の好みがあるだろうし。
Date::Manip使うかPOSIXのstrftimeの%Uか%W使うかだろうなぁ。
0773nobodyさん
04/05/14 16:41ID:???.htpasswdで発行されたパスワードとIDを保存してあるリストを、
perlで組んだCGI(例えばBBSやチャット)の認証の際に利用したいと
思っているのですが、htpasswdで暗号化されたパスワードとBBSとかの
フォームに入力されたパスワードをコンペアする良い方法はないものでしょうか。
0775761
04/05/14 20:16ID:???調べてみます。
0776nobodyさん
04/05/14 23:19ID:???日付から曜日を求めるツェーラの公式ってのがあったと思う
ちと、検索しても全然引っかからない…
その公式の事を書いてあった本も見つからない…
質問は「調べる方法は在りますか?」なので
ありますと言っておこう。
0777nobodyさん
04/05/14 23:26ID:???ツェーラーも見つけられないのか
[(y+[y/4]-[y/100]+[y/400]+[13m+8]/5+d)%7]
0778nobodyさん
04/05/14 23:54ID:???Zeller の公式(普通ツェラーと表記すると思う)はあくまで曜日(というか日数)を求めるものなので、
それだけでは単純に何週目という値が出てこない。
以前 CGI 関係のスレで質問があって書いてみたことがあるけど、もうひとひねり必要。
0779nobodyさん
04/05/14 23:58ID:???0780nobodyさん
04/05/15 00:03ID:???って言うか、前スレだったよ…_| ̄|○
Perl コーディング初心者質問コーナー Part33
http://pc5.2ch.net/test/read.cgi/php/1078076768/934
0781nobodyさん
04/05/15 10:55ID:???「日曜=0曜日というルールだと2004/5/1は6曜日。
2004/5/16はカレンダーで21マス目に現れる。」
これから気付けばint使って簡単に書けるでしょ。
0782lock
04/05/15 11:43ID:if9npvZfあの、最近CGIを作らんとならんコトになりまして、
ファイルのロック関係を調べたのですがちょっとお馬鹿な俺の脳味噌では理解出来ませんでした。
取り敢えずめんどう事は避けたいので、実行ロックをかけてプロセスが同時に動けないようにしたいです。
初めての経験なので負荷とか速度は気にしないことにして、安全を優先させるつもりです。
fllckを使って実現させようと思っているのですが、どのように記述すれば最も安全なのでしょうか?
開発環境はwin98ですが、本番の実行環境はUNIX系のOSです。
お馬鹿な質問で申し訳ありませんが、どなたかよろしくお願いします。
0783nobodyさん
04/05/15 12:05ID:???0785nobodyさん
04/05/15 13:09ID:???もう一台、検証用にマシンを用意してLinuxか*BSDでもインスコ
したほうがよい。
現行のwin98をwin2000以降にしてVMwareって手もあるが。
0787nobodyさん
04/05/15 15:01ID:???http://perldoc.com/perl5.8.4/pod/perlport.html#FUNCTION-IMPLEMENTATIONS
0788782
04/05/15 17:32ID:MHBM3z7f検索すると以下のコードに辿り着いたのですが、
open(OUT, "+< outfile.txt");
flock(OUT, 2);
truncate(OUT, 0);
seek(OUT, 0, 0);
print OUT "........";
close(OUT);
これはイツロックが解除されてるんでしょうか?
closeの時にファイルハンドルといっしょに消滅してるの??
と言いますか実行ロックがやりたいんだけど、プログラムの先頭に
open(OUT, "+< outfile.txt");
flock(OUT, 2);
これを書きっぱなしにしたらダメですか?
0789nobodyさん
04/05/15 17:37ID:???>プログラムの先頭に(略)これを書きっぱなしにしたらダメですか?
プログラムの開始はそこじゃないですよ。
スタートアップルーチン,perl_alloc,construct,parse(,run)して初めて(Perl)プログラムの先頭に行くわけです。
0791782
04/05/15 18:08ID:MHBM3z7fすみません、実行ロックは実行フェーズに対するロックの意でした。
つまり、インタプリタに引き渡された直後の実行フェーズの一番初めの処理としてロックをかけ、
それ以後の処理を複数のプロセスが同時に動いてほしくないと言うことです。
0792nobodyさん
04/05/15 18:08ID:???0793nobodyさん
04/05/15 18:25ID:???0794nobodyさん
04/05/15 18:27ID:???BEGINブロック作ってそこでflock。
そして、ENDブロックでclose。
壊れてもいいファイルだから、closeを書かなくても、
CGIなら問題ないのだろうけど、書いておくのがお約束。
0795nobodyさん
04/05/15 18:33ID:jlBwPWFJ掲示板のデザイン変えようとしてもどこにHTML書けばいいか分かりません。
属性名を変数にしてPrintで書けば良いの?
■ このスレッドは過去ログ倉庫に格納されています