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

このエントリーをはてなブックマークに追加
1nobodyさん
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
2ごめんスレ番間違えた:04/01/31 19:35 ID:???
関連スレ
【Perl上級者コーナーPart01】
http://pc2.2ch.net/test/read.cgi/php/1024741312/l50
CGI: Common Gateway Interface part 11
http://pc2.2ch.net/test/read.cgi/php/1055597189/l50
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/l50
【 スクリプト改造工房 PART 7 】
http://pc2.2ch.net/test/read.cgi/php/1063780103/l50
△▲ WebProg 初心者の質問 Part5 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1060263267/l50
【Perl】ファイルロック(排他処理)について語ろう
http://pc2.2ch.net/test/read.cgi/php/1024795138/l50
★負荷軽減対策委員会(Perl、PHP)★
http://pc2.2ch.net/test/read.cgi/php/1034645635/l50
【Perl】掲示板を使ろう!
http://pc2.2ch.net/test/read.cgi/php/988890976/l50
Perlモジュールについて
http://pc2.2ch.net/test/read.cgi/php/997829243/l50
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/l50
3nobodyさん:04/01/31 19:36 ID:???
4nobodyさん:04/01/31 19:37 ID:???
5nobodyさん:04/01/31 19:37 ID:???
[総合]
 ・http://www.excite.co.jp/world/ # 英文のページ多いから一応
 ・Perl Com: http://www.perl.com/
 ・CPAN.com: http://search.cpan.org/
 ・ActivePerl: http://www.activestate.com/
 ・CGI-ML:http://forest.ne.jp/cgi-ml/

[お薦め]
 ・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm ★読んどけ
 ・Perl Recipes: http://www.effectiveperl.com/recipes/ # 死んでるか?
 ・Randal's WebTechniques columns: http://www.stonehenge.com/merlyn/WebTechniques/
 ・Perlの部屋: http://www.cc.rim.or.jp/~midorin/mad-p/perl/index.html
 ・Perl初心者の部屋:http://www.harukaze.net/~mishima/perl/
 ・Perlリファレンス:http://www.big.or.jp/~mio/ga/pl/plref/pl_ref.htm
 ・Perlのページ:http://homepage1.nifty.com/nomenclator/perl/
6nobodyさん:04/01/31 19:38 ID:???
 [Document&Tutorial]
 ・Home - Japanized Perl Resources Project: http://perldocjp.sourceforge.jp/
 ・Perl Monks: http://www.perlmonks.org/
 ・use Perl; : http://use.perl.org/
 ・Learn Perl - Perl Education: http://www.devdaily.com/perl/edu/index.shtml
 ・Perldoc.com: http://www.perldoc.com/
 ・Using Perl5 in Web: http://docs.rinet.ru/Using_Perl5_in_Web/
 ・Rex Swain's Home Page: http://www.rexswain.com/
 ・Robert's Perl Tutorial: http://www.netcat.co.uk/rob/perl/win32perltut.html
 ・Perl Tuts: http://savage.net.au/Perl-tutorials.html
 ・Beginning Perl Tutorials: http://www.pageresource.com/cgirec/index2.htm
 ・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
 ・Logical Choice Software, Home Page: http://www.logsoft.com/perltips/
 ・Perlfect Solutions: http://perlfect.com/
 ・The Perl Archive : http://www.perlarchive.com/
 ・Perl6 & Parrot VM についての情報: http://dev.perl.org/perl6/
 ・use Object; : http://perl.infoware.ne.jp/
7nobodyさん:04/01/31 19:38 ID:???
[Module]
 ・河馬屋二千年堂's Page: http://member.nifty.ne.jp/hippo2000/index.htm # お勧め
 ・PPMPackages: http://www.activestate.com/PPMPackages/

[Security]
 ・安全なプログラミングのためのガイドライン:http://www.FreeBSD.org/ja/security/#spg
 ・Perl security:http://www.perldoc.com/perl5.6/pod/perlsec.html
 ・Perl security和訳:http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsec.html
 ・CGI and Security http://www.ansi.co.jp/tech/cgi/security/
 ・The Unofficial Web Hack FAQ:http://secinf.net/websecurity/The_Unofficial_Web_Hack_FAQ/
 ・How to Write Secure Code:http://www.shmoo.com/securecode/
 ・Safe CGI Programming :http://www.improving.org/paulp/cgi-security/safe-cgi.txt

[OS]
 ・Linux日本語マニュアル:http://www.linux.or.jp/JM/
 ・FreeBSD日本語マニュアル:http://www.jp.freebsd.org/man-jp/
8nobodyさん:04/02/01 00:57 ID:???
そろそろプログラム技術板にあるスレッドに統一しなよ。
9nobodyさん:04/02/01 13:21 ID:???
初心者ですが質問させてください
data.datファイルに
aaa 1
bbb 1
ccc 1
というように配列が入っていましてbbbのカウントを1プラスして
bbb 2
aaa 1
ccc 1
と、data.datファイルに1プラスしたファイルを上にして
書き込みたいのですがどうやったらできるでしょうか?
10nobodyさん:04/02/01 14:10 ID:???
>>9
http://www5a.biglobe.ne.jp/~n_rieko/perl/
http://perldoc.com/perl5.8.0/pod/perlfunc.html

my $key = 'bbb';
open DAT, '+<' . './data.dat' or die $!;
{
  local $/ = undef;
  my %dat = split " ", <DAT>;
  $dat{$key}++;
  seek DAT, 0, 0;
  print DAT
    map "$_ $dat{$_}\n",
    sort { $dat{$b} <=> $dat{$a} || $a cmp $b }
    keys %dat
  ;
  truncate DAT, tell DAT;
}
close DAT;
11nobodyさん:04/02/01 16:26 ID:???
>>9
my $key = 'bbb';
my $file = 'data.dat';

open(FH, '+<'.$file) or die $!;
flock(FH, 2);

my ($top, @list);
my $search_str = $key.' ';

while(<FH>){
if (index($_, $search_str)){
push(@list, $_);
next;
}
my ($name, $count) = split;
$top = $name.' '.($count+1)."\n";
}

seek(FH, 0, 0);
print FH $top, @list;
truncate(FH, tell(FH));
close(FH);

# age処理?
12nobodyさん:04/02/02 14:03 ID:???
print << hoge; の使用法について質問なのですが、
サブルーチン中のif節の中で使ったりすると段付けがそのまま出力に反映されてしまい、
出力結果(HTMLソース)が汚くなります。
かといって段付けを外すと今度はPerlのソースが汚くなる始末で。

とは言え<<を使わずに出力するのもとても煩雑です。
どうにかならないものでしょうか?
13ヽ(´ー`)ノ:04/02/02 14:11 ID:???
何らかのテンプレートシステムを使うとか。

そもそもヒアドキュメントを使った(=出力がハードコーディングされた)コード
自体、俺は汚いと思うから、見栄えなんかどうでも良い。
14nobodyさん:04/02/02 14:27 ID:???
$hoge = << _hoge_;
希望通りかしらんが。
15nobodyさん:04/02/02 14:28 ID:???
あ、すまん。インデントの事か…。
16nobodyさん:04/02/02 14:33 ID:???
>>13
同意
HTML::Template とかああいったのを使うと
コードの中に出力文字列書かずに済む

例えばifで切り替えるなら、テンプレートの方に

<TMP_IF NAME="hoge">
hoge が真でつた
<TMP_ELSE>
hogeが偽でつた
</TMP_IF>

などと書くわけだな
17nobodyさん:04/02/02 14:45 ID:???
<!-- TMPL_IF NAME="hoge" -->
hoge が真でつた
<!-- TMP_ELSE -->
hogeが偽でつた
<!-- /TMPL_IF -->
18nobodyさん:04/02/02 14:45 ID:???
- <!-- TMP_ELSE -->
+ <!-- TMPL_ELSE -->
19nobodyさん:04/02/02 16:05 ID:???
http://pc2.2ch.net/php/subject.txt
を読み込むにはどうすればよいでしょうか?

open(FILE, "http://pc2.2ch.net/php/subject.txt");
では読み込めませんでした。
20nobodyさん:04/02/02 16:08 ID:???
>>12
 オレはこんな風にやってるよ。ターミネータ(EOF)だけはどうにもならんが。

[tab][tab]$data= << 'EOF';
[tab][tab][tab]なんたら
[tab][tab][tab]かんたら
EOF
[tab][tab]$data =~ s/\t*//gm;
[tab][tab]print "$data";
21nobodyさん:04/02/02 16:18 ID:???
>>19
use LWP::Simple;
$content = get("http://pc2.2ch.net/php/subject.txt");
22ヽ(´ー`)ノ:04/02/02 16:20 ID:???
>>20
print << '  EOF';
とかもできますぜ。
23nobodyさん:04/02/02 16:24 ID:???
>>21
その一文を追加するだけで、エラーが起こるようになりました。
検索すると
ttp://homepage1.nifty.com/nomenclator/perl/atnifty.htm
このようなサイトが出てきましたが、何か関係があるのでしょうか。
24nobodyさん:04/02/02 16:31 ID:???
>>19>>21
user agentにMonazilla送らないとだめじゃないかな。
25ヽ(´ー`)ノ:04/02/02 16:33 ID:???
エラーの内容書けよ。答えてる人はテレパシ使いじゃないんだぞ。

Can't locate LWP/Simple.pm in @INC (@INC contains:
/usr/lib/perl5/5.8.3) at -e line 1.

とか出てたら LWP::Simple がサーバに入ってない。
26nobodyさん:04/02/02 16:41 ID:???
>>24-25
申し訳ありません。
NIFTYのプロバイダのWebスペースでCGIを設置しようとしているのですが、

実行エラー
CGIの実行時にエラーが発生しました。

と出て動かないのです。
で、違う有料アカウントで同じものを実行するときれいに動きました。
>>24さんのおっしゃることをしなくても、subject.txtは読み取ることができたみたいです。
>>23のサイトに書いてある通り、Niftyでは標準モジュールというものが用意されていないのでしょうか。
27nobodyさん:04/02/02 17:09 ID:MugWoIRA
アフォな質問かもしんないなあ、と思いつつ、
更新履歴と、サイトトップページの更新内容(今日はここを変えたよん)を
リンクさせるCGI(Pearlのみで)、ってできるでしょうか?
今は手動で、サイト更新時に前の更新内容を切り取って、更新履歴の
ファイルに書き込んでいますが、たまに忘れるんです(^^;
書き忘れたり、アップを忘れたり(ぉ

で、トップページの「特定の部分」が変わったら、そこを吸い込
んで更新履歴に入れるみたいなことをしたいんですが・・・。

#逆ならありました。更新履歴に書き込んだら、別のHTML(例えば
#トップページ)に一番上だけ、など表示する、とか。SSI必須な
#のでだめっぽいのと、CGI外部呼出し不可ゆえに「別のHTMLに」
#がひっかかりそうで・・・。
28nobodyさん:04/02/02 17:10 ID:???
配布されていればいいですが、配布されていなければ
自作を、と考えたものの、こんなこと可能なのかどうか。
2927:04/02/02 17:10 ID:???
28=27です。ごめんなさい;;
30nobodyさん:04/02/02 17:11 ID:???
niftyは、モジュール入れてない。@niftyの説明よく嫁
自分で自分のディレクトリに入れてuse汁
31nobodyさん:04/02/02 17:13 ID:???
Pearlのみで)
Pearlのみで)
Pearlのみで)
3227:04/02/02 17:16 ID:???
>>31
Σ(@@) ぁっミスった・・・ぅー。

って・・・そんなに言わなくてもええやん(泣)
33nobodyさん:04/02/02 19:10 ID:???
質問です。

perlで定期処理はなんとかできませんでしょうか。
cronが使えない環境でです。


処理頻度は多くて30分に一回程度です。

環境はRedhat7.2以降です。
34nobodyさん:04/02/02 19:13 ID:???
>>33
考えたらわかるだろ
>>32
可能だが君には4ヶ月かかる
perlを1から勉強するよろし
35nobodyさん:04/02/02 19:44 ID:???
36nobodyさん:04/02/02 20:19 ID:???
30分間スリープすればよいのでは。
37未承諾広告※ ◆aiY4htt2.2 :04/02/02 21:28 ID:???
Perl 1.0 は手にはいるのでしょうか・・・@ 1 から始める Perl

ゴミスマソ
38nobodyさん:04/02/02 21:47 ID:???
if($hoge == $aboon){
print $hoge;
print "\n";
print $aboon;
}

とコーディングしたのに、
cgi
perl
と出力したのがわけわかりません。
文字列が等しいことを条件にするにはどうすればいいでしょうか。
39nobodyさん:04/02/02 21:49 ID:???
>>38
eqを使え。とネタにマジレス。
40nobodyさん:04/02/02 22:14 ID:???
>>39
うお、できた。thx!
41nobodyさん:04/02/02 22:26 ID:???

42nobodyさん:04/02/02 22:49 ID:???
@Niftyに何かをアップロードすればモジュールが使えるようになるかと思ったら、
そうじゃないのね…
LWP::Simple これは使えないでFA。
43nobodyさん:04/02/02 23:16 ID:???
>>39
まぁネタだわな。

>文字列が等しいことを条件に

数値の比較と違うということが分かってる(見当がついている)時点で
簡単に調べられるだろうに。
44nobodyさん:04/02/03 00:36 ID:???
このスレ本当はPart32だよな
過去ログpart20と同じくタイトル誤記だな
45yukun:04/02/03 00:42 ID:???
初めまして。教えてください。(Perlに関する質問です。)
ホームページにSSLを導入したのですが、
OPEN命令でHTMLを展開する際に、SSL経由にするには
どのようなコーディングにすればよいのでしょうか?

HTMLから、FORMでSSL経由でCGIを読み込む際には、
<form action="https://www.---.com/cgi-bin/@@@.cgi>
などと記述すればSSL経由でページを表示してくれると思うのですが、
例えば、以下のようにOPEN命令形経由でHTMLを展開する場合、
どうすればSSL経由にできるかという質問になります。
よろしくお願いします。

<処理(やりたいこと)イメージ>
@ページの中のイメージをクリックすると、CGIをコール
ACGIでは、OPEN命令によってHTMLファイルを展開
B展開する際に、SSL経由での展開としたい

<A href="http://www.----.com/cgi-bin/print.cgi><img></a>@

[print.cgiの中身]
open(PRHT,"usr/home/user0001/www/htdocs/html_file/contents.html")A

このcontents.htmlをSSL経由で表示させたい。=B

長くなってしまいましたが、よろしくお願いします。
46nobodyさん:04/02/03 00:46 ID:???
それってCGIの質問だろ
47nobodyさん:04/02/03 01:35 ID:???
まず@とか機種依存文字使うのやめれ。
48nobodyさん:04/02/03 01:42 ID:???
>>45
すまん、君が何をしたいかはあんまり理解できてないのだが
たぶん君はopen関数または/およびSSLというものについて
かなり根本的なところで勘違いしているんじゃないかと思う

SSLというのは「ブラウザ←→CGI」の間で使われるもので
「CGI←→open関数によって読み出されるファイル」の間にSSLというのはありえない
49nobodyさん:04/02/03 01:44 ID:???
難しいね。
50nobodyさん:04/02/03 01:44 ID:???
いやんぽ いやんぽ 
51nobodyさん:04/02/03 02:27 ID:???
52nobodyさん:04/02/03 11:54 ID:???
>>45
きみはPerl暦どれくらいなのだ?
教えるほうとしてはまずそこを言ってほしい
53nobodyさん:04/02/03 11:56 ID:???
>>52
教えなくていいよ。
詮索屋なお前には教えてほしいなんて頼んでないから。
どっかいって。
54nobodyさん:04/02/03 11:57 ID:???
必要とされない人はどこでもされない。ああ惨め(笑)
55nobodyさん:04/02/03 12:07 ID:???
昔はUNIXでshellの使い方を一通りわかってる人がperl使ってたもんだが、
最近はDOSプロンプトさえ使ったことのない人がCGIを作ろうとするから
まあいろいろ難しいんだろうなと思う

open() なんかも、コマンドラインを使ったことのない人は
「ただの呪文」としてしか理解してないだろう
56nobodyさん:04/02/03 12:18 ID:???
だからなんですか。
57nobodyさん:04/02/03 12:32 ID:???
アハハ
最初から教える気なんてねーよw
俺はどこの板でも質問君の揚げ足取ってるだけだw
俺の口癖はマルチw

ちなみに53
>>お前には教えてほしいなんて頼んでないから。
おまえは45か
58nobodyさん:04/02/03 12:49 ID:???
まじめに45が答えたら可哀想でしょ。
それを阻止するための野次馬です。
冷やかしには冷やかしでw
じゃねっ☆
59nobodyさん:04/02/03 13:57 ID:???
先輩面の吹きだまりですかここは。

あーキモイキモイ
60nobodyさん:04/02/03 14:14 ID:???
>>59
キモイなら来るなよ。












#まあ、類は友を呼ぶと言うからな…
61nobodyさん:04/02/03 14:22 ID:???
52がうざい。はやく消えて欲しい。
62nobodyさん:04/02/03 15:40 ID:???
>>60

またキモイのがひとり。
63nobodyさん:04/02/03 16:50 ID:???
>>62
ホント、やだよね。キモイ奴は消えてほしい。
ってか、ヘンな勘違い高慢なレスはスルーすれば、おかしい冷やかしもいなくなるかもね。
6432:04/02/03 18:21 ID:4NiNK9M3
>>34
レスthx!!

そうですか、出来ますか。
出来るとわかればあとはなんとかしまつ。
#しかしCGIサーバと該当HTMLのサーバは別だったりする・・(遠い目)

>perlを1から勉強するよろし
そうですね(^^;
がんばりまーす。
65nobodyさん:04/02/03 18:32 ID:???
>>64
まあ簡単な部類と逝って置く
ガンガレや
66nobodyさん:04/02/03 19:06 ID:d+BOMlR2
書き込みすると、どんどんアイコンが変わっていく。
というような掲示板ってありますか?
67nobodyさん:04/02/03 19:22 ID:???
>>37
> Perl 1.0 は手にはいるのでしょうか・・・@ 1 から始める Perl
> ゴミスマソ

あるよ。俺2週間ぐらい前にDLした。
68nobodyさん:04/02/03 19:41 ID:???
>>66
【CGI】こんなCGI探してますver.12【素材】
http://pc2.2ch.net/test/read.cgi/hp/1075737677/l50
69nobodyさん:04/02/03 19:51 ID:???
>>67を見て検索してみた。

http://dev.perl.org/perl1/dist/

にあるみたいね。
70nobodyさん:04/02/04 01:44 ID:???
お好きなバージョンをどうぞ。
http://history.perl.org/src/
71nobodyさん:04/02/04 03:06 ID:???
>>66〜70
それくらい簡単に作れ
10分で出来るだろ
72nobodyさん:04/02/04 10:53 ID:???
>>71
アイコンが変わるルーチンだけならまだしも、10分じゃ掲示板作成できねぇだろ(笑
73nobodyさん:04/02/04 11:00 ID:nY5FtdXr
これを実行するとログファイルが飛んでしまうことがあります。
この中でどこか不備があるのでしょうか?

my($fileDef ) = "./log.txt";
if(!(-e "$fileDef")){ &errMsg("エラー"); }
if(open(FL, "$fileDef") != 1){ &errMsg("エラー"); }
my($umpDef);
$dumpDef = <FL>;
close(FL);
my(@tmpDef) = split(/<>/, $dumpDef);

if($tmpDef[3] eq 'no'){
$tmpDef[7]++;
$onLine = join('<>', @tmpDef);
#カウントの書き出し
if(&lockopen(FL, ">$fileDef")!= 1){ &errMsg("エラー"); }
print FL "$onLine";
&lockclose(FL, $fileDef);
}
74nobodyさん:04/02/04 11:24 ID:???
&lockopenと&lockclose書かないことには分からないような。
75nobodyさん:04/02/04 11:29 ID:???
my($umpDef); ←変数がおかしい。が大した問題ではない
if(&lockopen(FL, ">$fileDef")!= 1) ←致命的
76nobodyさん:04/02/04 11:31 ID:nY5FtdXr
>>75
ご教授頂ければ幸いです。
77nobodyさん:04/02/04 11:53 ID:???
&lockopenかけ
78nobodyさん:04/02/04 11:58 ID:nY5FtdXr
>>77
sub lockopen(*$) {

my($fh, $modefile) = @_;
my($lockf, $path, $filename);
my($retry) = 100;# リトライ回数
my($interval) = 0.1;# インターバル

my($mode, $file) = ($modefile =~ /^(\+?(?:<|>>?)\s*?)(.+)$/);
if ($file =~ /(\/|\\)/) {
($path, $filename) = ($file =~ /^(.*[\/|\\])(.+)$/);
}else {
$path = '';
$filename = $file;
}
if( $filename eq '' ){ return undef }

$lockf = $path.'Lock_'."$filename";
while (-f $lockf) {
select(undef, undef, undef, $interval);
return undef if (--$retry <= 0);
}
open($filename, ">$lockf");
if ( open($fh, $modefile) != 1 ) {
close($filename);
unlink($lockf);
return undef;
}
return 1;
}
79nobodyさん:04/02/04 12:56 ID:???
80nobodyさん:04/02/04 14:15 ID:???
>>79
Perlプログラムのグロ画像。
リファレンスのバラバラ死体。
81nobodyさん:04/02/04 14:24 ID:???
配列の並び替えについて質問です。
@order1=(5, 3, 1, 4, 2);
@order2=(z, y, a, x, b);
上のような二つの配列があって、5-z、3-y、1-a、4-x、2-bの関係があります。
これを@order1についてソートを行い
@order1=(1, 2, 3, 4, 5);
とするときに@order2も同手順の並び替えを行い
@order2=(a, b, y, x, z);
とするためにはどのような方法が一番簡単なのでしょうか?
@ordercheck(5-z, 3-y, 1-a, 4-x, 2-b);
として、ソート後に"-"で分ける、と言う方法を考えたのですがちょっと冗長の気がするので、、、
82nobodyさん:04/02/04 14:46 ID:???
>>81
連想配列使え
83nobodyさん:04/02/04 14:57 ID:???
%order = (5=>'z',3=>'y',1=>'a',4=>'x',2=>'b');
foreach (sort keys %order){print "order1:$_ order2:$order{$_} \n";}
8481:04/02/04 15:00 ID:???
なるほど、連想配列で関連付けてソートすればよかったのですね。
解決です。有難うございました。
85nobodyさん:04/02/04 15:03 ID:???
>>81
Schwartz変換を使うと,こんな風にも書ける
@order2 =
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$order2[$_], $order1[$_]] } ( 0 .. $#order1 );
86nobodyさん:04/02/04 15:10 ID:???
もう馬鹿の一つ覚えみたいに Schwartz 変換したがるのやめれ。
87nobodyさん:04/02/04 15:15 ID:???
CGI掲示板を作っています。書き込み内容にあるタグを無効にしたいので、

s/&/&amp;/g;
s/</&lt;/g;
s/>/&gt;/g;
s/”/&quot;/g;

としました。すると、「&ほげ;」で現される実体参照も無効にされてしまいました。
そこで、入門書を参考にして、

s/&amp;(#x*\d+|\w+);/&$1;/g;

という行を付け加え、どうにか実体参照だけを有効に出来たんですが、
一番上の行で &を&amp;にして、
最後の行で&戻すのがなんとなく気に入りません。

最初と最後の部分をあわせて、&(#x*\d+|\w+); じゃない&だけを&amp;にする
ためにはどういう正規表現で書いたらいいんでしょうか。
88nobodyさん:04/02/04 15:22 ID:nY5FtdXr
reg.cgi → ログファイル ← read.cgi

flockに関してです。
書き込み用のCGIでログファイルにデータを書き込もうとロックします。
ロックして書き込んでいる最中に、
読み込み・表示専用のread.cgiがログファイルにアクセスすると
ログファイルは壊れてしまいますか?保護されますでしょうか?

壊れてしまうとしたら対処の方法はどのような物が考えられますか?
89nobodyさん:04/02/04 15:31 ID:???
>>87
後ろ読み  ってのがあるよ
>>88
ザ・プロセスがバグるだろ
90nobodyさん:04/02/04 15:39 ID:???
Perlの変数名をPerlで知ることってできる?

&reutrn_name( $value01 );

見たいなことすると、"value01" って文字列返すような関数が作りたい。
91nobodyさん:04/02/04 15:41 ID:???
92nobodyさん:04/02/04 15:42 ID:???
>>88
読み込み時にもflock使えばブロックされる。
具体的には
書き込み時にflock(OUT, 2)、読み込み時にflock(IN, 1)等とする。ファイルハンドルは適当
9387:04/02/04 15:48 ID:???
>>89
> 後ろ読み  ってのがあるよ

s/&(?!#\d+;|\w+;)/&amp;/g;

としてテストしたらうまく変換できました。ありがとう。
(?: とか (?! ってはじめて知った。奥が深い。
94nobodyさん:04/02/04 15:49 ID:???
>>90
どういう場面で使うんだ?
value01って自分で打つんだからわかりきってるじゃん。
9588:04/02/04 15:50 ID:nY5FtdXr
>>88です。

書き込み時だけじゃなくて、読み込み時にもflockをかければ
ログファイルを複数CGIで共有しても保護されるという事でしょうか?
96nobodyさん:04/02/04 15:50 ID:???
>>90
多分出来ないと思う。
9790:04/02/04 15:56 ID:???
>>94
場面は特に考えてないんだけど、
エラー画面で「$value01 が不正です」とか出せるかなーと。
あと、Data::Dumperみたいなこととか。

>>96
そっか…やっぱ無理なんかな。ども。

9892:04/02/04 16:00 ID:???
>>88
flockには読み込み用のロックと書き込み用のロックがある。
http://www98.sakura.ne.jp/~jun/perl/flock.html
に詳しい説明が載ってる。

で、flockするのはOSの仕事だから、CGIが1つだろうと複数だろうと関係ない。
99nobodyさん:04/02/04 16:04 ID:???
>>97
$value01 じゃなくて $param->{'value01'} とか使えば?
10090:04/02/04 17:00 ID:???
>>99

thx。
代替策はいろいろあるんだけど、
単純に疑問になったのが始まりかな…
出来ない仕様なら納得するんだが。
101nobodyさん:04/02/04 17:38 ID:???
>>90
$foo = return_name('$var');
print "$foo が不正です";

sub return_name{
    return @_[0];
}
102nobodyさん:04/02/04 20:22 ID:???
>>90
 できるよ。パッケージ名に「::」を付けたハッシュ(例えば%main::)
は、そのパッケージのシンボリックテーブルになっている。
 例えば$bar, $fooという変数を使っていれば、「bar」,「foo」という
キーがそのハッシュ内に必ず存在する。そこで、これらのキーに「$」を
付けて内容を確認し、その内容が調査対象の変数($???としよう)に等し
かったとしよう。それなら、そのキーが変数$???の変数名である可能性がある。
 だた、同じ内容を持つ変数も複数存在しうるから、今度は、可能性がある
変数に何かを代入して(その前に元の内容を退避させる必要があるが)、
再び$???の内容と照合してみよう。一致したものが変数$???の変数名だ。
 アホらしくてコーディングする気にはなれんが。
103nobodyさん:04/02/04 20:24 ID:???
>>102
my 変数はシンボルテーブルに登録されない。
104nobodyさん:04/02/04 22:45 ID:???
全ての変数名を表示する
デバックにどんな変数名を使ってきたらみたい時がある。
今使いっている全ての変数を見れたらどんなに便利だろう…。
パッケージのシンボルテーブルは、パッケージ名に :: をつけたハッシュに格納される。だったらグローバル変数とされる%mainを読めば変数名が取れるんじゃないか。…と考えた。

foreach my $k (sort keys %main::) {print "$k = $$k@$k%$k","\n" ;}
まだ未完だが、まぁつかえる?かな。
※実はスカラー変数ってオンザフライ(その場で)作る事ができる。$$kはその応用
105ここね:04/02/04 22:46 ID:???
10690:04/02/04 23:04 ID:???
>>102-105

いやぁ、勉強になった!ありがとう!
パッケージ名に「::」なんてしらんかったYO
らくだ本見直してみる。(書いてるよね?
107nobodyさん:04/02/04 23:23 ID:???
>>105 のページより
@deff = grep{ !{map{$_,1}@FileA }->{$_}}@FileB;
これ、一時ハッシュ使わないでやるのはじめてミタ
@deffがチトイタイが
108nobodyさん:04/02/04 23:33 ID:???
>>107
激しくお勧めできないコードだな。
109nobodyさん:04/02/05 00:31 ID:???

grep が実際にどんな処理してるか知らんのだけど
$#FileB 回、無名HASH作ってるってこと?
110nobodyさん:04/02/05 01:31 ID:???
>>107
そういうの見ると南下ゾクゾクしてくる。
11164:04/02/05 01:41 ID:???
>>37です。
とほほWEBのリファレンスを読みながら、こんなの書いてみました。
どう書いてよいのかわからなくなったところがあるのでまだ動かしていませんが。
基本的な処理としてはこんな感じ。
$datfileで指定したパスのファイル(HTMLファイルでSJIS)を読み込み、特定のタグに囲まれた日付と内容をそこから取り出し、$logfileに「日付,内容」の書式で書き込む。
これを思いつけなかった自分に乾杯(;;)

わからないところと言うのは、logfileへの書き込みの指定方法です。
ソースを後述しますが、その一番最後の所のprint(OUT・・・の部分。
$logfileに「日付,内容」の書式で書き込みたいのですが・・・・現在の書き方ではなんとなくすっきりしないような。これでよいのでしょうか。
#どこかで配列変数の'$hoge','hoge'・・・っていう書き方を見たので気になるのかも?
素直に $nakami = join(",", $date, $log);としてprint (OUT "$log"); とすべきでしょうか?
11264:04/02/05 01:44 ID:???
2分割ですみません。
#!/usr/bin/perl
#元となるデータのパス
$datfile = 'http://hogehoge.hoge/index.html';#もちろんダミーです!
#このなかに<!--day-->1月1日<!--/day--><br><!--log-->更新したぜい!<!--/log-->
#という部分がある。

#このスクリプトで出したデータを書き込むファイル
$logfile = 'log.txt';

#今年は何年?
$year = "2004";

#元データ取得
#ファイルの先頭から1000バイト分の文字は無視してよいので読まない
seek(NEWSFILE, 1000, 0);
open(NEWSFILE,"> $datfile") || &error('読めません');
#読んだ中身を@dataに入れる
@data = <NEWSFILE>;
close(NEWSFILE);
11364:04/02/05 01:46 ID:???
#元データから日付の部分を取得
$stday = 0;
$enday = 0;
#@dataの先頭から<!--day-->が出る位置を取得
$stday = index(@data,"<!--day-->");

#@dataの先頭から<!--/day-->が出る位置を取得
$enday = index(@data,"<!--\/day-->");

#<!--day-->から<!--/day-->まで何文字あるかを算出。
$enday = $enday - $stday;

#@dataの$stday番目から$enday文字返す。
$day = substr(@data, $stday,$enday) ;

#返した$dayの中身は1月1日のような文字列。これを2004.1.1のようにする。
#2004.01.01の方が二桁月日の時と揃うので見栄えするような気はするが、
#今すぐは解決法が浮かばないのでとりあえず置いて。
$day =~ s/月|日/./;
$date = join(".", $year, $day);
11464:04/02/05 01:48 ID:???
#元データから内容の部分を取得上の日付と一緒。
$stlog = 0;
$enlog = 0;
#@dataの先頭から<!--log-->が出る位置を取得
$stlog = index(@data,"<!--log-->");
#@dataの先頭から<!--/log-->が出る位置を取得
$enlog = index(@data,"<!--\/log-->");
#<!--log-->から<!--/log-->まで何文字あるかを算出。
$enlog = $enlog - $stlog;
#@dataの$stlog番目から$enlog文字返す。
$log = substr(@data, $stlog,$enlog) ;

#ログに書き出す。
open(OUT, ">> $logfile");
#2004.1.1,更新したぜい、とlog.txtに書く。
print(OUT '$date,$log');
close(OUT);
ここまで。
すいません3分割。私嘘をつきました(_○_
・・・投稿してから&error('読めません');のエラーサブルーチンがないのに
気づく馬鹿・・・動くわけないじゃん。
115nobodyさん:04/02/05 02:04 ID:???
>>111-114
ツッコミ処満載だな。
>>1
・ここは開発スレでもデバッグスレでも評価スレでもないぞ。
・長いコードはどこかに置いて URL を示そう。
http://perldoc.com/perl5.8.0/pod/perlfunc.html
http://perldoc.jp/docs/perl/5.8.0/perlstyle.pod
http://suika.fam.cx/~wakaba/documents/rfc-ja/rfc2606-ja.html
116nobodyさん:04/02/05 02:17 ID:???
>>111-114
> ソースを後述しますが、その一番最後の所のprint(OUT・・・の部分。
> $logfileに「日付,内容」の書式で書き込みたいのですが・・・・現在の
> 書き方ではなんとなくすっきりしないような。これでよいのでしょうか。
 ↓これのこと?
> print(OUT '$date,$log');
 print(OUT "$date,$log");
 と書けばすっきりすると思うけど。ソースの他の部分は全く不要。
117nobodyさん:04/02/05 03:25 ID:???
いいとかダメとか以前の問題だな。もうちょっと腰を落ち着けて勉強しなさい。
見本はいくらでもネットで拾ってこれるんだから。
118nobodyさん:04/02/05 05:41 ID:IomV4ee5
# $a, $b, $c には以下の文字列が入っている
$a = "123";
$b = "456";
$c = "789";
#配列@afterには変数を表す「文字列」は入っている。
@after = ('$a','$b','$c');

上の条件下で、
s/BEFORE/$after[$i]/;
を実行したとき、$iの数値に応じて、"BEFORE"の部分を
"123","456",789"とう文字列に変更することを期待しているのですが、
'$a', '$b','$c'という文字列になってしまいます。

@after = ('$a','$b','$c');
の部分が文字列になっているのは、実際のプログラムでは'$a','$b','$c'の
部分を外部ファイルから取り込んでいるためです。
この部分を変更することなく期待通りの動作をさせることはできないでしょうか?
119nobodyさん:04/02/05 08:34 ID:???
今、練習のため掲示板のCGIを一から自前で作っています
コーディングは秀丸で
APATCHとANHTPPDaemonを使ってブラウザで動作確認しています

この方法だと、正常に動作しなくても何行目にエラーがあるのかぜんぜんわからないので
事あるごとに行き詰まり、しんどいです

CGIのデバッグ環境って無いのでしょうか
120nobodyさん:04/02/05 08:52 ID:???
>>118
eval かシンボリックリファレンス

>>119
ブラウザで確認せずコマンドラインで確認するか CGI::Carp
121nobodyさん:04/02/05 09:08 ID:???
>>117
じゃあ教材となるようなプログラムをあげてほすぃ。
122nobodyさん:04/02/05 09:49 ID:???
my($a, $b);
for(sort { $a <=> $b } keys %sort){
 …
}
このようなプログラムを書いたらエラーになりました。
どうやら$a、$bにmy宣言がつかえないようなのですが何故でしょうか?
123nobodyさん:04/02/05 10:26 ID:7lLtTgGT
>>118
そりゃ外部ファイルの取り込み方直したほうがいいじゃねーの?
外部ファイルが何を意味するのかしらねーが。
124nobodyさん:04/02/05 10:28 ID:???
>>118
s/BEFORE/$after[$i]/ee;
125nobodyさん:04/02/05 10:28 ID:???
>>122
http://perldoc.com/perl5.8.0/pod/func/sort.html

>>121
>>5-7 と言いたいところだが、ム板のスレのがすっきりしてて良いな。
切り貼り。↓
126nobodyさん:04/02/05 10:29 ID:???
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[オンラインマニュアル]
・Perldoc.com: http://www.perldoc.com/
・perldoc.jp: http://www.perldoc.jp/
・perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/
・Smart! ウェブ講座: http://www.rfs.jp/sitebuilder/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[モジュール]
・CPAN: http://search.cpan.org/
・河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/
・jcode.pl の私的な解説書: http://www.mikeneko.ne.jp/~lab/kcode/jcode.html

[テクニックその他]
・Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm # 読んどけ
・Perlのページ: http://homepage1.nifty.com/nomenclator/perl/ # Shift_JIS 関係
・use Object;: http://perl.infoware.ne.jp/
・CGI セキュリティ情報: http://www.ansi.co.jp/tech/cgi/security/
・IPA ISEC セキュア・プログラミング講座: http://www.ipa.go.jp/security/awareness/vendor/programming/
127nobodyさん:04/02/05 11:40 ID:???
>>119
Apacheのエラーログを見れば分かるだろうがよ。
出ないときもあるが、大抵何行目辺りかは出るはずだが。
128nobodyさん:04/02/05 15:44 ID:???
質問よろしいでしょうか。

現在BBSを作っています。
名前が全角および半角スペース一つのみの場合などは、
以下のようにして、エラーとして投稿させないようにしています。

if ($name eq " " || $name eq " ") {
 &error("空白文字はNG");
}

ここで、さらに全角および半角スペースを二つ以上含む名前の投稿もブロックしたいと思っているのですが、
どのように記述したらいいのでしょうか。
名前の入力文字数は最大半角20文字なので、ありえるパターンを全指定して

[半:半角スペース 全:全角スペース]です。
if ($name eq "半半" || $name eq "半全" || $name eq "全半" || $name eq "全全" || $name eq "全半半" || $name eq "全半全" || …… ) {
 #エラー処理
}

と指定してもいいのですが、何か良い書き方はあるのでしょうか。
129nobodyさん:04/02/05 16:02 ID:???
>>128
正規表現を使おう。
130nobodyさん:04/02/05 16:22 ID:???
正規表現で全角と半角スペースしか使われてないときエラー
131nobodyさん:04/02/05 16:27 ID:???
>>129-130
その正規表現というもので解決できるのでしょうか。
アドバイス有難う御座います。
まずはその正規表現について調べることから始めます。
132nobodyさん:04/02/05 16:44 ID:???
変数名の使い方でわかりやすい方法ないかな。
グローバルなら頭文字を大文字にするとか、
一時的に使う変数なら全部小文字とか、
サブルーチンは全部小文字とか。

見てて混乱するときがある。。。
133ディレクトリの作成時刻を取得したい:04/02/05 16:59 ID:Xw+HYq57
ディレクトリの作成時刻を取得したいんですが、
stat関数は「ファイル」の情報を取得するみたいな記述ばかり見受けられます。

ディレクトリの場合はどうすればいいんでしょうか?
134nobodyさん:04/02/05 17:09 ID:???
>>133
statで試してみたらどうだったのでしょうか
135111-114:04/02/05 17:22 ID:???
>>115
>ツッコミ所満載
・・・あう。やっぱり(汗)
改造はたくさんしてますが、一から書いたのはこれが初めてなので、実は
関数の使い方に自信が無い・・・某ソフトのマクロと同じ考え方にしてみた
とか

>>116
やっぱりダブルクォートでないと駄目ですか。
「更新」の文字化けよけにシングルにしてみたのですが。
・・・素直にjcode.plを使うかな・・・。

#部分だけあっても、関数書き出しでわかりにくいかと思って
#ほぼ全部出してしまいました。ジャマですみませんでした。
136nobodyさん:04/02/05 17:26 ID:???
>>132
その問題はPerlと言うよりはプログラムの作法的問題なので、スレ違いかも。
ただ、Perlは他の言語以上にプログラムが読みづらくなるので他の人がどのように
コーディングしているのか、一般的な作法はちょっと興味がある。

ちなみに俺は
関数:単語で大文字(&MakeTimeCode)
変数:全部小文字+アンダーバー($time_zone_set)
コメントアウト:適当
一時変数:出来るだけ使わない、使うときは他のサブルーチンに渡してる、或いは処理直前で適当にmy宣言
大域変数:使わない、必要なときはコメントで強調して変数自体は特に何も。

一番困るのはリファレンスなんだよな。
変数や関数が何処までのリファレンスを取っているのか一目では分からなくなる。
137111:04/02/05 17:33 ID:???
>>113
CGI perl ディレクトリ 作成日時
これでぐぐった10件目に出てるCGIが参考になるのでは・・・。
138111:04/02/05 17:40 ID:???
>>113

っつか、ここのファイルロックを見て。
ttp://tokyo.cool.ne.jp/shigetomo/perl.html
139ヽ(´ー`)ノ:04/02/05 17:41 ID:???
>>136
俺は関数も変数も一緒くたに小文字とアンダーバーだな。
その変わり関数は基本的に動詞で始めるようにしてる(Java の命名規則風に)。
キチンとした命名してれば区別する必要無いだろう、という考え。

Camel Notation (setTimeZone とか) は書き易い(手が流れるように動く)んだけど、
後から読むとき辛いと(俺が)思うから Java みたいにお約束になってない限り使わない。

大域変数は大文字+アンダースコアかねぇ。
140133:04/02/05 17:47 ID:Xw+HYq57
>>134 >>138
レスどうも。
WindowsXPでもLinuxでもstat関数で作成時刻(秒)が取得できました。

なんで、ファイルのことしか書いてないんだろうと思ったが、
「ディレクトリ=ファイル」という概念は常識なのか。_| ̄|○
141nobodyさん:04/02/05 18:18 ID:Hi0k/Dpu
スクリプト読んでて、よくif文だけで終わってる箇所があるのですが(elseとかelsifが無い)
これは「if」に該当しない場合はその他の処理ってことでいいんですか?
もしこいつを改造するとして、if(もしAならB)ではなく、「どんな場合でもBという処理」という風に変えるのであればifをどのように変えてやるのが適切なんでしょうか
142nobodyさん:04/02/05 18:21 ID:???
>どんな場合でもBという処理
if使う必要ないやん
143nobodyさん:04/02/05 18:32 ID:Hi0k/Dpu
_l ̄l○ ほんとだ・・・

>>142さん
ありがとう
144nobodyさん:04/02/05 21:27 ID:???
>119
なぜApache+Anhttpdなんて形になるんだ?
AnHttpdならきちんと設定すればエラーメッセージ出るよ。
それはここで聞く質問じゃないがね。
145132:04/02/05 22:42 ID:???
>>136,139

やっぱり機能ごとに決まりを作るのがいいみたいだね。
(ってかそれしか方法が無いという。

自分は、
サブルーチン:小文字+アンダースコア
グローバル変数:大文字
ローカル変数:小文字

頭文字のみ大文字にすると、
意味のあるローカル変数。
146nobodyさん:04/02/05 22:48 ID:???
man perlstyle
You may find it helpful to use letter case to indicate the scope or nature of a variable. For example:
$ALL_CAPS_HERE constants only (beware clashes with perl vars!)
$Some_Caps_Here package-wide global/static
$no_caps_here function scope my() or local() variables
147nobodyさん:04/02/06 01:13 ID:UOi11LWR
文末の { や ; の違いはどういう風に覚えたら良いのでしょうか?
148nobodyさん:04/02/06 01:14 ID:???
149nobodyさん:04/02/06 04:52 ID:???
>>145
真似しようっと
150nobodyさん:04/02/06 06:01 ID:???
俺はファイルハンドルとハッシュを大文字にしてるが。
151nobodyさん:04/02/06 06:49 ID:???
>145
一番シンプルなのは、変数の頭にmyとかlocalとか付けてしまう事だな。
my @my_dataArray;
local $local_number;
誰が見ても一発でわかる。
152nobodyさん:04/02/06 08:10 ID:5Z6G99Rh
ネットからhtmlを取得して加工するプログラムを作っているのですが
なぜかある特定のサイト(infoseek)からだけはうまくデータを取得することができません。

以下、コードです。
sub gethtml {
 my ($url) = @_;
 if ($url =~ /http:\/\/([^\/]*)(\/.*)/) {
  my $host = $1;
  my $path = $2;
  my $s = Net::HTTP->new(Host => "$host") || die $@;
  $s->write_request(GET => "$path",
    'User-Agent' => "Mozilla/4.0 (compatible; MSIE 5.5; Windows 95)",
    'Referer' => "http://$host$path");
  my($code, $mess, %h) = $s->read_response_headers;
  my $data = "";
  while (1) {
   my $buf;
   my $n = $s->read_entity_body($buf, 1024);
   die "read failed: $!" unless defined $n;
   last unless $n;
   $data .= $buf;
  }
  return $data;
 }
}
153nobodyさん:04/02/06 08:10 ID:5Z6G99Rh
(続き)例えば
$data = &gethtml("http://www.yahoo.co.jp/index.html");
だとうまく行くんですが、
$data = &gethtml("http://www.infoseek.co.jp/index.html");
だと空の文字列しか返ってきません。

どこがまずいのでしょうか?
154nobodyさん:04/02/06 08:15 ID:???
LWP使え
155nobodyさん:04/02/06 08:45 ID:???
>>151
それってわかりづらいと思うけど。
myとか殆ど付くし。
156nobodyさん:04/02/06 08:50 ID:???
>>153
一応指摘しておくと、リダイレクトをサポートしていない点。
157nobodyさん:04/02/06 09:13 ID:???
PerlでつかえるテンプレートライブラリってHTML::TemplateとTemplate-Toolkitぐらいしかしらないけど
どっちがよくつかわれていますか?
統計とかはないと思いますが、みなさんの感じで結構ですので教えてください。
またほかにいいライブラリがあったら教えてください。
158nobodyさん:04/02/06 09:15 ID:???
プレフィクスは、長いと読み難く、短いとルールを決めた人にしか意味が通じない。

my か local で迷うのは稀だと思う。殆んど my でしょ。
local使うのは特殊変数の時くらいじゃないかな?
159nobodyさん:04/02/06 09:46 ID:???
やるならむしろグローバル変数に$global_scalarなんじゃないかと。

160nobodyさん:04/02/06 11:11 ID:???
ぼくはサブルーティンなんか使わないで十分すごいプログラム
書けるしぃ。
同じのをサブルーティンで分けると遅くなるよ。メイン中心主義!
161nobodyさん:04/02/06 11:37 ID:???
>>160 は、にせの無精
162nobodyさん:04/02/06 12:38 ID:???
リファレンスについて質問です
$bar{"$id.name"}があるときに
 $buf = $bar{"$id.name"};
 $foo{"$buf.param"}
とすることはできるのですが
直接
$foo{"$bar{"$id.name"}.param"}
のようにするにはどうしたら良いのでしょうか?
163nobodyさん:04/02/06 12:56 ID:???
>>162
それ、ハッシュにしか見えないんだけど。
$foo{$bar{$id . '.name'} . '.param'}
164nobodyさん:04/02/06 14:21 ID:???
リファレンスってのは実体までのアドレスみたいなもんだぽ
俺ならこう書くかな。
$foo{$bar{"${id}.name"} . '.param'}
いや、こんな記述書かないけどね。
165nobodyさん:04/02/06 14:46 ID:???
$num個連番の当たりページがあり、そのなかにランダムではずれを散りばめ、
リンク文字はきちんと連番にし、3個ずつ改行したいとき、
以下のように書いたのですが、改行してくれないときがあり、
色々試みたのですがまったく理由がわかりません。
なぜかはずれを表示する前のときに改行してくれないのです。
そのとき、1行目のprint $jには何も入ってません。
理由を教えていただけないでしょうか。

my ($i,$j) = (1,1);
while (1) {
#print "$j";
print "<a href=\"./?";
print "m=$in{m}&d=$in{d}&i=$i\">$j</a>\n";
unless (int rand 4) {
print "<a href=\"./?r=$j\">".++$j."</a>\n";
}
print "<br>\n" unless ($j % 3);
$i++; $j++;
last if $i > $num;
}
166nobodyさん:04/02/06 14:49 ID:???
url直すの忘れてました解りにくいのでこうします

my ($i,$j) = (1,1);
while (1) {
#print "$j";
print "<a href=\"$i.html\">$j</a>\n";
unless (int rand 4) {
print "<a href=\"./hazure.html\">".++$j."</a>\n";
}
print "<br>\n" unless ($j % 3);
$i++; $j++;
last if $i > $num;
}
167nobodyさん:04/02/06 16:04 ID:???
>>165-166
my ($i,$j) = (1,1);
while (1) {
print "<a href=\"$i.html\">$j</a>\n"; # J=3の倍数の時 (3,6,9...)
unless (int rand 4) {
print "<a href=\"./hazure.html\">".++$j."</a>\n"; # ここを通るとJ=4,7,10...に成る
}
print "<br>\n" unless ($j % 3); # 余り1なので実行されない
$i++; $j++; # んでここで5,8,11...と
last if $i > $num;
}

ちと分かり難いと思うけどこのような流れ
単純に改善するなら
my ($i,$j) = (1,1);
while (1) {
if (int rand 4) {
print "<a href=\"$i.html\">$j</a>\n";
}else{
print "<a href=\"./hazure.html\">".$j."</a>\n";
}
print "<br>\n" unless ($j % 3);
$i++; $j++;
last if $i > $num;
}

ちなみに
#print "$j"; には何も入ってないのじゃなくて実行されてない
print "J:$j\n"; #こんな風にすると分かると思う
168nobodyさん:04/02/06 16:05 ID:???
>>166

my ($i,$j) = (1,1);
do {
print "<a href=\"";
print int rand 4 ? "$i.html" : "./hazure.html";
print "\">$j</a>\n";
print "<br>\n" unless ($j % 3);
$i++; $j++;
} while ( $i <= $num );
169166:04/02/06 16:08 ID:???
有難うございます!しかもかなり詳しい解説つきで。
今から用事なんで、ざっとしか呼んでないですが理解できそうです。
帰ってきてからやってみます。
170nobodyさん:04/02/06 16:23 ID:yIl8HJKl
すみません。質問させて頂きます。

オライリーの黒ヒョウ本(実用Perlプログラミング)に載っている
ObjectTemplate.pm
をCPANモジュールで自動インストールしようとして
perl -MCPAN -e 'install ObjectTemplate'
とするも失敗します。

サーバ管理者に質問すると、
そもそも配布元が見つからない、とのこと。
ObjectTemplate.pmはもうサポートされなくなったのでしょうか?
それとも別の使い勝手の良いモジュールに移行したのでしょうか?

オブジェクト指向のプログラミングをされている方なら
この当たりの最新の情報をご存知ではないかと思って質問させて頂きます。
オブジェクト属性へのアクセス関数を自動で生成するモジュールなら
何でも良いのですが。
どなたかご存知でしょうか?
171もみ ◆6ZCCV.MOMI :04/02/06 16:36 ID:???
1.ttp://happy.honesto.net/cgi/のシンオプルBBSを改造して日記CGIを書こうと試みますた
2.とりあえず読み込みのCGIから作ってます。
ttp://cgiroom.nu/のチェッカーでテストしながら要らなそうなサブルーチンを削っていきました
3.ログ閲覧のテストのため表示件数を減らし、ページをめくろうとしたところ次のエラーが表示されました。

Undefined subroutine &jcode::convert called at (eval 1) line 30.

30行目付近は

sub decode_form{
@pairs=split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/,$pair);
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
&jcode'convert(*value,'sjis');         #←ここが30行目
$value =~ s/&/&/g;
$value =~ s/"/"/g;#"
$value =~ s/</</g;


こうなってます。

鯖はniftyです
何か解る事がある人居たら教えてください、おながいします。
172もみ ◆6ZCCV.MOMI :04/02/06 16:42 ID:???
できますた、お邪魔しますた。
173170:04/02/06 16:52 ID:yIl8HJKl
ちなみにObjectTemplate.pmは、黒ヒョウ本初版のP146に載っています。
174nobodyさん:04/02/06 16:57 ID:???
ある配列の要素を一個置きに別の配列にコピーしたいんですが、
for($i=0;$i<@array; $i++){
push(@newarray,$array[$i]) if($i % 2);
}
みたいに for 文で回す以外の方法ってないでしょうか。
175nobodyさん:04/02/06 17:06 ID:nfor5cjb
>>174
$i++
これは一を足す、
あなたは2を足したい
176174:04/02/06 17:10 ID:???
>>175
了解。

for 使わないでやることは出来ないということですか?
177nobodyさん:04/02/06 17:14 ID:???
forに何か不満でも?
178174:04/02/06 17:17 ID:???
>>177
ちょっと冷たくすると、すぐすねるんです
179nobodyさん:04/02/06 17:18 ID:nfor5cjb
>>176
%old_array = @old_array;
@new_array = values %old_array;

とか、奇数番目ならkeysとか、
あといろいろあるだろが
ちゅうか
考えれ。
黙って二個足しとけ
180nobodyさん:04/02/06 17:20 ID:nfor5cjb
>>179
あ、だめだ
順番だめ
あ〜あ
181174:04/02/06 17:30 ID:???
なんかにせものいるしなー。

よーは、(key,val,key,val,key,val,key,val,...)なリストを、
ハッシュにぶちこみつつ、keyの順番を変えずに配列にも放り込みたかったの。

サンプルがバカすぎたから $i+=2; なんつうアドバイスもらっちゃったけど、
べつにforに不満があるわけじゃないよ。
forで回すスクリプトかいててふと他に方法があるのかな?
って疑問に思っただけなの。

182nobodyさん:04/02/06 17:33 ID:???
foreach ( 1..$#array) {
push(@newarray2,$array[$_]) if($_ % 2);
}

183nobodyさん:04/02/06 17:37 ID:???
ずばり、おまえがやりたいのはこういうことか??

my %HASH = @array;
my @newarray = values %HASH;
184174:04/02/06 17:38 ID:???
んにゃー、スライスで一個おきをうまく表現できないのかなあ、ってだけで
・・・
おとなしく +=2 しときます。
185nobodyさん:04/02/06 18:11 ID:nfor5cjb
>>184
にせものだ?
ざけんな!人に聞いといて!

@new_array = @old_array[map{$_*2}(1..(int ($#old_array / 2)))];

ほざく前にわずかな自分の脳みそでも使え、
つか、2、足しとけ。
186nobodyさん:04/02/06 18:17 ID:I0u0oa63
@a[ grep $_ % 2 == 0, 0..$#a ]
でも、効率悪そうだね。。。
187nobodyさん:04/02/06 18:51 ID:???
連想配列のキーに2バイト文字を使うのってどうなんでしょうか?
188nobodyさん:04/02/06 19:25 ID:???
だから、
my %HASH = @array;
my @newarray = values %HASH;
でおしまいでしょ。
189nobodyさん:04/02/06 19:27 ID:???
>>188

>keyの順番を変えずに配列にも放り込みたかったの
190174:04/02/06 19:53 ID:???
帰ってきました。で、出来ました
私の説明が悪かったようで、書いていただいたのは、
若干違ったものに成ってましたが
以下のように動作させたかったわけです。
ま、自分の書いたコードでテンパって思いっきり勘違いしてました。

my ($i,$j) = (1,1);
while (1) {
#print "$j";
print "<a href=\"$i.html\">$j</a>\n";
print "<br>\n" unless ($j % 3);
unless (int rand 4) {
print "<a href=\"./hazure.html\">".++$j."</a>\n";
print "<br>\n" unless ($j % 3);
}
$i++; $j++;
last if $i > $num;
}

有難うございました
191nobodyさん:04/02/06 19:54 ID:???
↑164でした
192nobodyさん:04/02/06 19:54 ID:???
>>166です。。。申し訳ないです
193166:04/02/06 20:08 ID:???
int rand 4のとこはifじゃなくunlessでした
どっちでもいいですけど
かなりのスレ汚しすいませんでした
194nobodyさん:04/02/06 20:37 ID:???
>>162
$foo{ qq($bar{ qq($id.name) }.param) }

# 二行に分けたほうが。

>>170
黒豹本のp150から155。

>>174
my $sw = 0;
@newarray = grep{ $sw ^= 1 } @array;

# やっぱり+2するかな。

>>187
問題ないと思うよ。
195nobodyさん:04/02/06 22:46 ID:???
196nobodyさん:04/02/07 01:41 ID:???
splice(@a, $c+1, 0, $b);

splice関数で上のようにして配列の途中に要素を追加しようとしているのですが
このコードだとなぜか配列の末尾に追加されてしまいます。
「$c+1」のところを「$c-1」や、単に「$c」とした場合は途中に追加してくれるのですが
「$c+1」にしたときはなぜか末尾に追加されてしまいます。
$d = $c + 1;
として「$d」ともやってみましたがやはり末尾に追加されてしまいます。
しかし、「++$c」としたときは思い通りに動いてくれました。
でも、$cはループのカウントに使ってるので$c自体の数値を
増やすわけには行かないので、「++$c」とはしたくありません。

どうすればうまく動くようになるのでしょうか?
197nobodyさん:04/02/07 08:09 ID:???
>>196
@a = ("a", "b", "c");
$b = "hage";
$c = 1;
splice(@a, $c+1, 0, $b);
print join("\n", @a);

結果:
a
b
hage
c

試してみたけど、それでちゃんと動くはず。
変数の内容を表示させて動きを確認してみたら?
198196:04/02/07 10:47 ID:???
$d = $c + 1;
splice(@a, $d, 0, $b);
このようにしてspliceを使う直前と直後の数を取ってみましたが
問題はありませんでした。しかし、実際は末尾に追加されてしまいます。
また、「++$c」で正常に動いたことから
$d = $c;
++$d;
splice(@a, $d, 0, $b);
とやってみましたがこれも結果は同じでした。
$d = $c;
splice(@a, ++$d, 0, $b);
こうしてもやはり駄目です。

その数と同じ数と直接入れて
splice(@a, 2, 0, $b);
のようにすれば問題なく動くのですが…。
また、
$d = 2;
splice(@a, $d, 0, $b);
のようにしても問題なく動きます。

ちゃんと動く場合も末尾に追加されてしまう場合も変数の内容は同じなのに…。
この処理以外のところに問題があるのでしょうか。
199nobodyさん:04/02/07 11:01 ID:DNGeq5K/
UNIXコマンドをエミュレーションしてくれるモジュールとかって亡いでしょうか?

&cp('-rp','a.txt','../b.txt');

とか、

#カレントディレクトリ以下のmp3ファイルをすべて列挙
@result = &find('.','-name','\'*.mp3\'');

200nobodyさん:04/02/07 11:12 ID:???
>>199
Shell
201nobodyさん:04/02/07 11:19 ID:???
>>200
外部にはコマンドが亡い前提です。
あるなら素直にSystemするので。
202nobodyさん:04/02/07 11:28 ID:???
まとまっては無いと思うから、地道に探すしかないんじゃないかな。
cpはFile::Copy
findはFile::Find
などなど
203nobodyさん:04/02/07 11:30 ID:???
そんなんPerlで直で書いてもチョットで済むことやん
204nobodyさん:04/02/07 11:39 ID:???
>>202
Fileモジュールですか、覗いてみます。

>>203
独自の関数よりみなさんが周知している既存のコマンドの方が可読性は上がりますし
極力無駄な努力を省くのがスクリプト開発ってもんだと思うので。


205nobodyさん:04/02/07 12:19 ID:???
だったら、素直に外部コマンドをインストールしよー。
パイプが使えなければ、わざわざコマンド使う利点って特にないんじゃない?
206nobodyさん:04/02/07 13:41 ID:???
> だったら、素直に外部コマンドをインストールしよー。
激藁
207nobodyさん:04/02/07 16:28 ID:???
>>198
せめて問題の起きるコードがないと、分からない。
208nobodyさん:04/02/07 17:14 ID:???
>>198
print "PERL_VERSION: $]\n";
209nobodyさん:04/02/07 17:44 ID:B5upz/jF
@data = 1..10;
print "@data[0..4]";
は1 2 3 4 5 と表示されます。

$data = [1..10];
print "@$data->[0..4]";
これは駄目です。
配列リファレンスのスライスってどうやるんですか?
210nobodyさん:04/02/07 18:16 ID:???
211nobodyさん:04/02/07 18:43 ID:???
>>210
風呂入ってて、
あ、そか矢印いらないんじゃん、
って思ってあわてて出てきたら、
お返事頂いてました。

ありがとうございました。
212196:04/02/07 20:27 ID:???
>>207
0chスクリプト(http://tolkien.s7.xrea.com/jikken/
のage,dame処理のところを下のように改造しています。

foreach (@{$this->{'SUBJ'}}){
 ($lKey,$lSub) = split(/<>/,$_);
 ($lKey,$work) = split(/\./,$lKey);
 if ($lKey eq $key){
  $work = $this->{'SUBJ'}->[$Cnt]; # 対象サブジェクト保存
  splice(@{$this->{'SUBJ'}},$Cnt,1); # 対象削除
  splice(@{$this->{'SUBJ'}},$Cnt+1,0,$work); # 先頭へ追加
 }
 $Cnt++;
}

>>208
PERL_VERSION: 5.006001
だそうです。
213196:04/02/07 20:33 ID:???
>>212
改造したのは「# 先頭へ追加」とコメントが付いている行ですが、
改造する前のコメントなので、適切なコメントではありませんが気にしないでください。
214nobodyさん:04/02/07 21:36 ID:???
>>196
foreachの中でspliceは使わない方が良い。
215nobodyさん:04/02/07 21:37 ID:???
>>213
my @array = ('0'..'9');

my $key = '3';
my $Cnt = 0;
foreach my $lKey (@array){
if ($lKey eq $key){
$work = $array[$Cnt];
splice(@array, $Cnt, 1);
splice(@array, $Cnt+1, 0, $work); # 位置を入れ替え
}
$Cnt++; # ループ

print "@array\n";
}

# 位置の入れ替えを最後までループさせれば最後に来る。
216196:04/02/07 22:22 ID:???
>>214
そうなんですか…

>>215
ΣΣ(゚Д゚;)

_| ̄|○キヅカナカッタ…
ifに引っかかったらループを抜けるようにすれば大丈夫ですね。
ありがとうございました
217nobodyさん:04/02/07 23:28 ID:1elCfWDc
質問ですが、suEXECの使えない共有サーバーで
自作のCGIスクリプトのソースを隠したいのですが、
<FORM ACTION="./" METHOD="POST">
のようにパスを省略して隠している所があったのですが、
このようにして何で動くのかが分かりません。
どなたかご存知の方がいればお伺いしたいのですが・・・
218nobodyさん:04/02/07 23:39 ID:???
>>217
.htaccess とかで DirectoryIndex を CGI に向けるとかそんな感じだろう多分
219nobodyさん:04/02/07 23:39 ID:???
>>217
サーバ設定の話は各 httpd のスレへ。
HTML の話は Web製作板へ。
CGI 全般の話は CGI スレへ。
220nobodyさん:04/02/08 00:59 ID:DZxekGX/
splitについて質問です。
第一引数を/\x81\x40/のようにしても分割してくれません。
変数を介したり色々やったんですがだめです。/ /なら大丈夫でした。
ちなみに/\x09/とか、1バイトなら当然できます。なぜですか。
宜しくお願いします。
221nobodyさん:04/02/08 02:12 ID:???
>>220
>>1
split する前のデータをもう一度チェックする事を勧める。

my $str = "\x82\xA0\x81\x40\x82\xA2\x81\x40\x82" # Shift_JIS で
       . "\xA4\x81\x40\x82\xA6\x81\x40\x82\xA8"; # あ い う え お
my @chr = split /\x81\x40/, $str;
print join '/', @chr; # あ/い/う/え/お
222nobodyさん:04/02/08 10:53 ID:DkhVhGJs
すみません、JPerlをインストールしたいのですが、
perl5.8をインストールしたあと、Jperlをダウンロードしたものの
インストールできません。
http://rd.vector.co.jp/soft/win95/util/se043908.html
の通りにやろうとするんだけど、書いてあることがわかりません。
Jperlはどこに置くべきなのでしょうか? 
場所を指定して展開するとはどういうことですか?

Vectorの編集部が書いた
編成部注: ソースファイルの自己展開部分にトラブルがあり、自己展開ができません。
Lhasa や WinZIPのような自己展開型のZIPファイルを展開可能なアーカイバーで展開してください。
という部分がいけないのでしょうか?

環境はWIN XPとMEで両方試してみましたが、同じ結果でした。
Perlが正常にインストールされていることは確認できています。
どなたかよろしくお願いします。
223nobodyさん:04/02/08 11:16 ID:???
>>222
スレ違い。
でもさ、こんなに丁寧に説明してくれてるのに「書いてあることがわかりません」って失礼じゃないか?

>Windows95またはWindowsNT上で,アーカイブファイルを実行させてください。
って書いてあるじゃん。本当に読んだのか?
224nobodyさん:04/02/08 11:20 ID:???
>>222
それ以前にJperlを使う理由があるのか?
225nobodyさん:04/02/08 11:31 ID:???
>>223
>>Windows95またはWindowsNT上で,アーカイブファイルを実行させてください。

この言い回しは確かに変だと思うぞ。
自動解凍書庫でもなけりゃ。
226nobodyさん:04/02/08 12:02 ID:gccQ0umI
携帯向けにアクセスした端末によって元画像をリサイズして
表示する物をImageMagickを使って制作しています。
ですが、携帯向けのため、ファイルサイズに制限があり、
ドコモ10KB以下、au9KB以下などとしなければなりません。
CGIでImageMagick(PerlMagick)を使って指定ファイルサイズに
納める方法はありますでしょうか?

参考までですが、似たような機能が
ttp://yellow.sub.jp/wp/
にあります。
画像を作成>保存>サイズチェック>
指定サイズより大きければ再び読み込み>画質を落として保存>繰り返し
私はこのくらいしか思い尽きませんでした。
227222:04/02/08 12:31 ID:DkhVhGJs
すいません、どのスレに書いたらいいかもわかりませんでした。
アーカイブファイルを実行させて下さい、
というのは.exeをダブルクリックするだけだと思ったのですが
ダブルクリックするとWinzipがzip file is damagedと言ってきます。
しょうがないのでlhasaで解凍すると解凍はできるのですが、
それだとインストールしたことにはならないらしいのです。

あと、すいません、どのスレが適切なのでしょうか?
228nobodyさん:04/02/08 13:14 ID:???
>>227
5.8に対応したJPerlはない。
5.8はJPerlを入れたのと同等の機能を最初から持っている。
それに対応するバージョンも確かめずになんでも入れるのはトラブルの元。

以上で質問は解決。
229nobodyさん:04/02/08 13:17 ID:???
>>228
>以上で質問は解決。

それは質問者が判断することですよ。
奢りは身の破滅しか招きません。
230nobodyさん:04/02/08 13:21 ID:???
>>227
WindowsでPerlやりたいんならActive Perl入れれば?多分こっちの方がメジャー。
231nobodyさん:04/02/08 13:37 ID:???
個人的にはcygwinのperlをお勧め。
232nobodyさん:04/02/08 14:18 ID:???
勧める理由は?
233nobodyさん:04/02/08 15:00 ID:???
>>225
それはバカよけフィルターというテクニックだよ。
234nobodyさん:04/02/08 15:20 ID:???
>>233
しかし、「書いた本人がバカだと思われる罠」ってのはリスクが大きすぎないか?
235nobodyさん:04/02/08 17:58 ID:???
Perl使ったCGIの質問もここでいいのかな。

現在mod_perlを使ってるのですが、
時間のかかるスクリプトの場合、途中でブラウザ側が読み込み中止をしても
最後までスクリプトは実行されるものなんでしょうか?
15秒程度のスクリプトで実験したところ、中止した後も最後まで実行されているようでした。

更新作業をするスクリプトで、一旦更新するブロックに入ったら
何があっても最後まで実行させたいのですが、まれに途中で止まってしまっているようで
原因がよくわかりません。
236nobodyさん:04/02/08 18:20 ID:???
CGIに使うPerlの「コーディング」の話はここで。
Perlを使っていてもCGI全般の話はCGIスレで。

よってここでは返答できないのであしからず。
237nobodyさん:04/02/08 18:21 ID:???
238nobodyさん:04/02/08 18:22 ID:???
しぐなるつかえ
239nobodyさん:04/02/08 18:50 ID:???
「最後までの実行を保証するコーディング方法はありまつか?」
という質問ならこのスレで良いかもしれない

が、残念なことに答えは「たぶんありまつぇん」

CGI の場合と mod_perl の場合でまた違うという気もするし
240nobodyさん:04/02/08 18:54 ID:???
>CGI の場合と mod_perl の場合でまた違うという気もするし

同じやんけ
241nobodyさん:04/02/08 18:59 ID:???
CGIの場合、鯖側でタイムアウト設定されてるとどうしようもないしな。
タイムアウトに引っ掛かるようなもの組むなって話にもなるが。
242nobodyさん:04/02/08 20:16 ID:???
あのー
if文を短くしたのって何って言うんでしたっけ?
?・・・・処理;
でしたっけ?
記号だけのやつ、名前も忘れてしまって検索できません。助けてください
243nobodyさん:04/02/08 20:18 ID:???
三項演算子のことか
244nobodyさん:04/02/08 20:18 ID:???
>>242
三項演算子の事か?
245nobodyさん:04/02/08 20:19 ID:???
>>243>>244
それです。ありがとうございましたー
246nobodyさん:04/02/08 22:34 ID:???
for $i ( 0 .. 100 ){
&hoge;
}

この書き方は初めて見たんですけど、$iにforループの値が入るっていうことで良いんでしょうか?
247nobodyさん:04/02/08 22:52 ID:???
248235:04/02/08 23:28 ID:???
サンクスコ。
Perlでのコーディングの質問のつもりだったので
こっちでいいかと思ったんだけど。
CGIスレのほうに移動してみます。
249nobodyさん:04/02/09 00:33 ID:???
>>247
いや、forなんですけど。
foreachと同じってことですか?
250nobodyさん:04/02/09 00:36 ID:???
>>249
人に尋ねる前にマニュアルを調べる癖をつけよう。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsyn.html#Foreach_Loops
251nobodyさん:04/02/09 01:22 ID:???
パターンマッチで例えば
if($foo =~ m/hoge/){ ... }
と書いているとして、$fooに何も入ってない場合
>Use of uninitialized value in pattern match
というエラーが出ますよね。

自分の使ってるスクリプトでこのエラーが出るケースがある事に最近気付いたのですが、
一見、動作上は問題無いようなのです。

で一応、エラーを出さないようにする為に
if($foo){ if($foo =~ m/hoge/){ ... } }
とやってこの問題自体は解決したのですが。

今度はもしかしたら上のエラーによって何か不具合が出ていたのでは無いのかという疑問が湧いてきました。
このエラーにより何か具体的に良くない事が起こる場合はあるのでしょうか。
252nobodyさん:04/02/09 01:33 ID:???
コードによる
253nobodyさん:04/02/09 03:20 ID:???
こうゆう事って可能でしょうか
@array = ('aa=1234', 'ab=5678');

%hash=map{正規表現}
map {(split /=/)} @array;

キーと値それぞれに正規表現の処理をしたいのです。
先頭文字の文字だけ拾ってハッシュに収めたいです。
254nobodyさん:04/02/09 03:53 ID:aHOrEnKk
@以下のようなデータをテキストファイルから読み込み、
-------------------------
00(\t)名前(\t)データ1(\t)データ2
01(\t)名前(\t)データ1(\t)データ2

nn(\t)名前(\t)データ1(\t)データ2
-------------------------

A以下のように変数に代入して、
-------------------------
@strDAT0 = ("00","名前","データ1","データ2");
@strDAT1 = ("01","名前","データ1","データ2");

@strDATnn = ("nn","名前","データ1","データ2");
-------------------------

Bポインタで管理したいと思っています。
-------------------------
@ptDAT = (\@strDAT0, \@strDAT1, 〜, \@strDATnn);
-------------------------

データの行数がわからないため、変数名を動的に生成したいのですが、
(「@strDAT0」の0の部分を動的に生成、名前をつけたい。Aをループ処理にしたい)
そういうことは可能なのでしょうか?
もしくは、他に有効な方法がありましたら、ご教授いただけないでしょうかm(__)m

目的は、CGIだけでリレーショナルデータベースっぽい
データ管理がしたいと思っていて、必要なときに必要なデータだけを読み込んで、
IDと名前の関連付けなどの加工ができるような状態に持って行きたいです。
255nobodyさん:04/02/09 04:42 ID:???
変数で変数名を決めるのはシンボリックリファレンス。

てか外部から取り込んだ文字を変数名にするのは管理をめんどくするだけだと思うぞ。
数字をそのまま適用したいなら、それを添え字にすればいいわけだし。
文字ならハッシュのキーでいいし。

#ファイル読みこみのループ中
{
our %ptDAT;
my @strDAT = split(/\t/,$_);
$ptDAT{"$strDAT[0]"} = \@strDAT;
}
#ループここまで

どうしてもptDATがリスト変数にしたいなら、
「00」とかの数字を一桁にしてから添え字に使えばよろし
256nobodyさん:04/02/09 04:51 ID:???
%user = ();

while (<IN>){
chomp;
my($id,$name,$dat1,$dat2) = split(/\t/);
$user{$id}={ name => $name , dat1 => $dat1 , dat2 => $dat2 };
}
257255:04/02/09 04:55 ID:???
@strDATnn = ("nn","名前","データ1","データ2");
やっぱこんなのあるから、ハッシュがいいね。
255の記述だと、
@{ $ptDAT{'nn'} };
とか
@{ $ptDAT{'01'} };
とか書けば書くリスト変数を取り出せるよ。
258254:04/02/09 05:13 ID:???
>>255
回答有り難うございます。
ハッシュってそういう風に使うんですね・・
Perlの勉強始めたてで、ハッシュの存在意義がいまいち分かってませんでした^^;
参考になりました、有り難うございました。
259254:04/02/09 05:16 ID:???
うぉ、参考書読んでる間にレスが・・
>>255さん>>256さん有り難うございます。
何となく…レベルでしか分かってないので、
参考書見ながら一行一行解釈してみまっす。
260nobodyさん:04/02/09 05:38 ID:???
>>251
>> Use of uninitialized value in pattern match
> というエラーが出ますよね。
普通は実行時エラーにもならないし -w にも引っかからない。
ただ Perl 5.8.0 の特定ビルドにそういうエラーが出るバグが
あるらしいという話はググったら出てくる。

>>253
my @array = qw(aa=1234 ab=5678 bcd=9012);
my %hash = map /^(.)[^=]*=(.)/, @array;
print map "$_:$hash{$_} ", sort keys %hash; # a:5 b:9

>>254
http://perldoc.jp/docs/modules/MLDBM-2.01/MLDBM.pod
261254:04/02/09 06:09 ID:???
すみません、Perlのバージョンは5.6.1でした。。
あと見ている参考書は、去年の6月に出版されたPerl/CGI辞典です。
質問ばかりでスミマセン、自分で調べてもいますが、平行してここにも投げさせてください

>>255
冷静に考えてみると、それですと読み込み時に
ポインタの参照元を行数分上書きしてしまうので、むりっぽいですね。。><
ポインタの使用は表形式の構造を作る為に必要で、
動的な変数名生成はデータの確保に必要でした。

>>256
$user{$id}={ name => $name , dat1 => $dat1 , dat2 => $dat2 };

右側の意味が、参考書を見てもいまいち分からないのですが、
これは何をしているのでしょうか。
「=>」という演算子の意味は、webで調べて分かったのですが、、

>>260
情報有り難うございます。。><
正直内容以前に用語がさっぱり分からないですが、
ちょっとずつ読んでいって具体的に質問が出来るようになったら
もう一回書き込みします。
262254:04/02/09 06:17 ID:???
>>260
意味が分かりました、有り難うございました。
趣味のCGIなので、自分でコーディングできないか、もうちょっと模索してみます。
263255:04/02/09 06:53 ID:???
>冷静に考えてみると、それですと読み込み時に
>ポインタの参照元を行数分上書きしてしまうので、むりっぽいですね。。><
>ポインタの使用は表形式の構造を作る為に必要で、
>動的な変数名生成はデータの確保に必要でした。

違うよ。
my @strDAT
ループの中にmyされた変数があるって事は、
myに出会うたびに古い変数が破棄されて、名前が同じの全く別の変数が生成されてるってイメージ
264255:04/02/09 06:56 ID:???
>$user{$id}={ name => $name , dat1 => $dat1 , dat2 => $dat2 };
>右側の意味が、参考書を見てもいまいち分からないのですが、
>これは何をしているのでしょうか。
>「=>」という演算子の意味は、webで調べて分かったのですが、、

{}で囲まれた所は、無名のデータが生成されてる。
この場合は、変数名を持たないハッシュ構造のデータ。
リファレンス(ポインタ)でのみ、そのデータにアクセスできる。
265nobodyさん:04/02/09 09:10 ID:???
#id:001 name:田中 dat1:独身 dat2:借家
#id:002 name:山本 dat1:既婚 dat2:持家

$user{'001'} = { 'name'=>'田中','dat1'=>'独身','dat2'=>'借家'};
$user{'002'} = { 'name'=>'山本','dat1'=>'既婚','dat2'=>'持家'};

#idに該当するnameを表示する

foreach (sort keys %user){
print 'id:'.$_.' name:'.$user{$_}{'name'}."\n";
}
266田中:04/02/09 10:10 ID:???
>>265
俺に対する当て付けかコルァ!
267254:04/02/09 10:39 ID:???
>>262-263
再三の質問に答えて頂き、有り難うございます。
>>256さんの物を、本を見て反芻しながら改造していたら、
いつの間にか>>255さんの物になっていました。
んで、さらに参考書を見ながら改造して以下のような感じになりました。

--------------------------------------------------------
my @ptDAT = ();

open(FILE,"<data.txt");
while(<FILE>){
chop;
my @tmpDAT = split(/\t/);
push(@ptDAT, \@tmpDAT);
}
close(FILE);
--------------------------------------------------------
#テスト出力
print "@{$ptDAT[0]}<BR>@{$ptDAT[1]}<BR>";
print "@{$ptDAT[0]}[0]<BR>@{$ptDAT[0]}[1]<BR>";
--------------------------------------------------------

idは一意なデータですが、使い勝手の関係から別に通し番号を設けました。
本当に勉強になりました。有り難うございました。
268255:04/02/09 10:51 ID:???
>print "@{$ptDAT[0]}[0]<BR>@{$ptDAT[0]}[1]<BR>";
この記述よくない。スカラーコンテキストでたった一つのデータにアクセスする時は矢印演算子で。
$ptDAT[0]->[0]
269254:04/02/09 11:23 ID:???
有り難うございます><
買ってきた参考書が古かったのか、=>とか->などの
演算子が載っていないので、非常に勉強になりますです。
…さっそくググってきます(笑
270nobodyさん:04/02/09 11:52 ID:???
なんていう参考書?
271nobodyさん:04/02/09 11:56 ID:???
272253:04/02/09 13:31 ID:???
>>260 254さんレス有難うございます。

そのやり方が一番だとは思うのですが、
split後に正規表現がしたいんです。
実際に使うというわけではなくて後学のためにmapの勉強中なんです。
273nobodyさん:04/02/09 13:33 ID:???
自分は必ず$$ptDAT[0][0]ってしてるなぁ。この方が見やすい気がして。
274nobodyさん:04/02/09 14:06 ID:???
$$ptDAT[0][0]これなに?

あと->を省略するヤツはリファレンス自体よく分かってないのが多い気がするなー
俺的にはどこがどうデリファレンスされてるのかを目視出来ないと、記述汚いどころの騒ぎじゃない。気持ち悪い。
275274:04/02/09 14:19 ID:???
$$ptDAT[0][0];
これパースしてみた。コンパイルエラーになるかと思いきや
${$ptDAT}[0]->[0];
これと等価だった。
やっぱリファレンスの状態が分かりにくくて気持ち悪い上に優先順位まで分かりずらいや。
276nobodyさん:04/02/09 15:13 ID:6so9voyI
perl でatコマンドを実行するプログラムをつくっているのですが、
atのジョブの取り消しはどうしたらいいのでしょうか?
ジョブ番号の取得とかできるのでしょうか?
277nobodyさん:04/02/09 15:18 ID:???
>>276
マニュアル読めば分かるような事書くなよ。man at。
278nobodyさん:04/02/09 19:08 ID:???
元々リファレンスは深くしないからなぁ。
確かにリファレンスが来たら$重ねるぐらいの気持ちで使ってる。
あんまり分かってないかもな。
279nobodyさん:04/02/09 19:41 ID:???
>>260
>>> Use of uninitialized value in pattern match
>> というエラーが出ますよね。
>普通は実行時エラーにもならないし -w にも引っかからない。
>ただ Perl 5.8.0 の特定ビルドにそういうエラーが出るバグが
>あるらしいという話はググったら出てくる。

警告ならある。

#! /usr/local/bin/perl -w
use strict;

my $str;
$str =~ /hoge/;

5.005_03
Use of uninitialized value at ...
5.6.1以降
Use of uninitialized value in pattern match (m//) at ...

OS:WindowsXP/FreeBSD/Linux
280nobodyさん:04/02/09 19:45 ID:???
>>253
答えはあなたの中に。
my %hash = map { split /=/ } @array;
281nobodyさん:04/02/09 19:54 ID:???
あっと、頭文字でしたね。。
my %hash = map{ substr($_, 0, 1) } map{ split(/=/) } @array;
282nobodyさん:04/02/09 21:10 ID:+d6a4LxG
%databaseのkeyをvalueの値でソートされたkeysの配列を得るのは、
@keys = sort { $database{$a} cmp $database{$b} } keys %database;
て事なんですが、

$database->{"$id"}{'name'} = いろいろ;
というデータ構造の、'name'の値でソートされた
keys %$database の配列を得る方法はありますか?
283251:04/02/09 21:38 ID:???
あまり致命的なエラーでは無いっぽいので安心しておく事にします。
#エラーログが増えるのは良くないので対策はしますが
284nobodyさん:04/02/09 21:45 ID:???
sort { $database->{$a}->{name} cmp $database->{$b}->{name} } keys %$database;
285nobodyさん:04/02/09 21:46 ID:???
>>284
おお、そうか。
単純に考えればいいのですね。
ありがとうございます。
286nobodyさん:04/02/09 22:05 ID:Km8TNpNn
$fooと$barがことなる場合、
以下の「$foo_crypted」と「$bar_crypted」は必ず異なると言えるのでしょうか?
あるいは、たまたま一致してしまう可能性は少しでもあるのでしょうか?

#$saltは同じとします
$foo_crypted = crypt($foo,$salt);
$bar_crypted = crypt($bar,$salt);
287nobodyさん:04/02/09 23:06 ID:???
>>251
通常実行時エラー無しのスクリプトを-wで実行すると突然現れる警告メッセージの多くは
空の変数の操作に関するものだったような。(Xp、ActivePerl 5.8.0 build806使用)
パターンマッチだけでなく、空の変数に対して四則演算、比較演算、配列やハッシュへの代入、
printによる出力などでも警告になるはず。
それらを全て解決しようとすると簡潔なスクリプトが蛇足だらけになるので自分はある程度で諦めている。
288nobodyさん:04/02/09 23:46 ID:???
いや、正確には空ではなく、undef の場合に出るワーニングだ

変数は必ず my で宣言して空文字列を代入するように心がければ、ほとんど防げる
289nobodyさん:04/02/10 01:05 ID:???
重要な警告に気付かないというミスを避けるためにも、警告を出さないようなコーディングを心がけるべき。
既にあるバグの無いスクリプトを-wで実行すると大量の警告が出る、というケースなら仕方ないけどね。
290nobodyさん:04/02/10 01:07 ID:???
>>251
if($foo){ if($foo =~ /pattern/){ ... } }
これは
if(defined($foo) and $foo =~ /pattern){ ... }
としたほうが読みやすいぞ。
291nobodyさん:04/02/10 01:09 ID:???
>>286
たまたま一致することはあるよ。試しに下のルーチンを実行すると「たまたま」
一致したから。

$salt = "abc";
$foo = "abcdefgh123";
$bar = "abcdefgh456";
$foo_crypted = crypt($foo,$salt);
$bar_crypted = crypt($bar,$salt);
print "\$foo_crypted = $foo_crypted \$bar_crypted = $bar_crypted";
292286:04/02/10 01:38 ID:???
>>291
うお、ためしてみますた、ほんとだー。
ありがとうございます。
293nobodyさん:04/02/10 01:42 ID:???
>>292
その3行目を

$bar = "abcdefgh" . "ここに君の好きな文字を入れてよい"

に変えてみそ
294286:04/02/10 02:03 ID:???
>>293
あ、同じですね。ありがとうございます。
気になってcryptの原理を調べてみたら、納得。
(そもそも、cryptってperl独自の関数かと思ってたもんで、ハズカシイ)
295nobodyさん:04/02/10 04:58 ID:???
掲示板の「該当記事を修正」というのをやりたいんですが、
「ファイルの当該行を読み込む」のやり方がわかりません。
お教え下さい。お願いします。
296nobodyさん:04/02/10 05:34 ID:???
>>295
ファイルフォーマット次第。

Tie::File, Tie::Csv_File 辺りのモジュールを使えば、
行指向のファイルのレコードのn行目を編集といった事が
配列操作と同じような感覚で出来たりするよ。

自前で実装する場合は、一行ずつ読み込んで(readline)
該当行かどうかをチェックする、行数を数える等。
幾つかの方法が考えられる。以下、$n行目を読み込む(手抜きコード)

open(FH, $file);
my $buffer = (<FH>)[$n];
close(FH);
297nobodyさん:04/02/10 05:36 ID:???
>>296
何行目、ってのはあるんですね。
頑張って実装してみます。

記事編集機能つきのBBSのソースを見て勉強してるんですが、
いかんせん複雑なルーチンのものが多くて、どれがそれをやってる部分なのかがわからなかったりして苦労してます。
298295:04/02/10 05:53 ID:???
だめだ。
該当記事参照のためのナンバリングの仕方からわかってない。
一から出直してきます。
299295:04/02/10 06:15 ID:???
ファイルの一行目の$numを呼び出して、それに+1したものを与えて書き込む、という方法でナンバリングしようと思ってるんですが、回りくどい(もっと適切な書き方がある)ですか?
300nobodyさん:04/02/10 06:28 ID:???
"行番号"の様な物を考えているのなら、
「書き込み時に数える」か、「値を他のファイルに記録」でいいと思う。

"ファイルの一行目の$num"が毎回インクリメントされるのなら、それでもOK
301295:04/02/10 06:32 ID:???
>>300
該当記事を呼び出す→編集する→同じ行に上書きする、
とやるにはやっぱりその行を現す数値が必要ですよね?
なんか根本的に間違ってるような予感がしてきました……。
回答有難う御座います。

>>296
礼を忘れてました。回答有難う御座いました。
302295:04/02/10 08:27 ID:???
open(COUNT,"dsgdgrh.dat");
my $buf = (<COUNT>)[1];
($name,$ua,$ip,$value,$time,$res,$nums) = split(/\,/,$buf);
if($nums eq ''){$num = '1'}else{$num = $nums +1};
close(count);
とやってみたんですが、
数値が1,1,2,2,3,3,4,4,と二回ずつカウントするんです。
なんでこんな風になるんでしょうか?
303295:04/02/10 08:31 ID:???
>>302は全然違うなぁ。
どう違うのかさっぱりわからん……。
304nobodyさん:04/02/10 08:32 ID:???
>>302
ゴメン。$n+1 行目を読み込むだった。1行目を読むには (<COUNT>)[0]
最初の行だけなら、スカラーコンテキストで $buf = <COUNT>;でもいい。
305295:04/02/10 08:37 ID:???
>>304
何度もすみません。
open(COUNT,"dsgdgrh.dat");
$buf = <COUNT>;
($name,$ua,$ip,$value,$time,$res,$nums) = split(/\,/,$buf);
if($nums eq ''){$num = '1'}else{$num = $nums +1};
close(COUNT);
と書き換えてみたんですが、この部分入れただけで書き込みできなくなってしまいました。
なんだかもうお手上げです。
向いてないんだろうなぁ。
306nobodyさん:04/02/10 08:59 ID:???
>>305
書き込みが出来なくなったのは、そのコードからは検討付かないよ。
ログファイルの形式が崩れたりしてない?
307295:04/02/10 09:19 ID:???
>>306
そうですよね。これだけじゃあ分かるはずないですよね。
ファイルに書き込みをする前のルーチン(デコード処理するところ)に入れたんですが、
なぜか、書き込まれてるデータの後方にも名前が入るようになってしまったりしてます。
もうたぶん根本的な部分から間違ってるんだろうと思います。

あと、編集機能を付けるだけで完成(ストレート掲示板としてはすでに使える状態なんです)なんですが……。

本当に何度も何度も有難う御座いました。
308295:04/02/10 11:24 ID:???
原因が解明されました。
ファイルを開いて、閉じたあとに処理を書き込んでました。
抜け過ぎです。すみませんでした。
309295:04/02/10 11:53 ID:???
ログの行数-$num(記事に与えられた数字)で、上から何番目、というのを割り出したいんですが、
ログの行数を知る方法ってどうするんですか?

#それともこのやり方はおかしいでしょうか?
310nobodyさん:04/02/10 11:54 ID:???
(rand(1) * 5 + 7.5)/100 これを簡単に書き直すとしたら
rand(5)/100 + 0.075 で良いんでしょうか?
311295:04/02/10 12:06 ID:???
あ。
,で区切ってログファイルに書き込んでるんですけど、
,と書き込んだ場合、&#44;と変換されて書き込まれるから、
「,$num」で一致する行、でもいけますかね。
ただ、「一致する行」の抜き出し方はわからないんですが。
312nobodyさん:04/02/10 13:25 ID:???
>>310
前者の方が見やすい+後々の変更に対応しやすいから前者でいいのでは。

>>311
行を,でsplitしてそれを($id,$other)みたいにして受けて
$id が一致すればOK、とか。<読み込み
記事番号は行頭に置くのが吉。
313nobodyさん:04/02/10 16:26 ID:puNUP7nd
open(TFILE,"<$sfile");
while(<TFILE>){
if(/$trip/){
print;
print "発見しました。";
exit(0);
}}
close(TFILE);
print "見つかりませんでした。";
exit(0);

$sfileには一行ずつデータが入っていて、それを一行ずつ読み込み$tripが含まれている一行が見つかると、
それを出力し終了するというプログラムを作っているのですが、小一時間ほど試行錯誤しても上手くいきません。
どなたかご指導して頂けると幸いです。
314ヽ(´ー`)ノ:04/02/10 16:42 ID:???
>>313
ちゃんと動くが、突っ込みどころ満載だな。

さしあたって問題になりそうなのは、open のエラーチェックしてないから
open に失敗した時に $trip が見つからないことになる、ってことかな。

use POSIX qw{strerror} して open(TFILE, "<$sfile") or die strerror($!) しる。
315313:04/02/10 16:55 ID:???
>>314
ありがとうございます。ツッコミどころ満載ですか。。。精進しまふ。。。
ご指導通り追加したところ、ファイルが見つからないエラーが。
もしやと思って./追加したら正常動作しました。他のプログラムでは./追加しなくても
同フォルダのファイル読み込んでいたので付けてなかったのですが、
何かしらおかしかったんでしょうね。フォルダ名が、成功した時は英語、
不成功の時は日本語だったのでそのせいかもしれません。後で試してみます。
この度は本当にありがとうございました。
316nobodyさん:04/02/10 17:38 ID:???
>>313
こうゆうコードの場合、closeさせなくていいのかな?
317nobodyさん:04/02/10 17:45 ID:???
みんなだったらこのプログラムどう書くの?
純粋に疑問なのと、>>313の後学のために聞いてみたい。
318nobodyさん:04/02/10 17:58 ID:???
>>317
わたしだと、こうかくかな。
open(TFILE,"<$sfile");
while(<TFILE>){
if(/$trip/){
$flag=1;
last;
}}
close(TFILE);
if (flag != 1) {print "見つかりませんでした。"; }
else {print "発見しました。"; }

exit(0);
319nobodyさん:04/02/10 18:18 ID:???
見つけた一行の表示もしてるようだからこんな風に書いてみた。
open(TFILE, "<$sfile");
while(<TFILE>){
if(/$trip/){last;}}
close(TFILE);
if($_){print "$_発見しました。";}
else{print "見つかりませんでした。";}
exit(0);
320nobodyさん:04/02/10 18:32 ID:???
含まれてるかどうかだけ知りたいなら
indexの方が早くていいんじゃない?
含まれてるフィールドを限定したいなら
その後にsplitして詳しい判別に入る、と。
321nobodyさん:04/02/10 18:36 ID:???
open(TFILE, "<$sfile") or die;
if ($found = (grep /$trip/, <TFILE>)[0]) {
print "$found発見しました。";
} else {
print "見つかりませんでした。"
}
close(TFILE);
exit(0);
322nobodyさん:04/02/10 18:42 ID:???
いろんな書き方があるんだな、為になる。
323nobodyさん:04/02/10 19:51 ID:???
>>317
open(TFILE, $sfile) or die "couldn't open $sfile";
LOOP:{
while(<TFILE>){
(/$trip/o) or next;
print;
print "発見しました。";
last LOOP;
}
print "見つかりませんでした。";
}
close(TFILE);
exit;
324未承諾広告※ ◆aiY4htt2.2 :04/02/10 21:37 ID:???
$trip = '((.*)';
にすると、先日のように全鯖で書き込みが出来なくなるようになりますのでご注意を。

>>316
終了したら勝手に閉じるそうです。@perlfunc
325316:04/02/10 21:51 ID:???
>>324
そうなのか、ありがとう
326nobodyさん:04/02/10 22:28 ID:???
$trip = '((.*)';
にすると、先日のように全鯖で書き込みが出来なくなるようになりますのでご注意を。

どういう意味?
327未承諾広告※ ◆aiY4htt2.2 :04/02/11 00:59 ID:???
>>326
試してみよう。

$test = "0123456789\n";
$trip = "(*.))";
print $test =~ /$trip/o ? "OK\n" : "NG\n";
exit;
328nobodyさん:04/02/11 01:09 ID:???
Quantifier follows nothing before HERE mark in regex m/(* << HERE .))/

と出ました。
329nobodyさん:04/02/11 06:33 ID:???
/\Q$trip\E/ しろって事?
330nobodyさん:04/02/11 08:04 ID:???
何をわけわかめなことやってんだよ
331nobodyさん:04/02/11 08:11 ID:???
俺も327の意味がわからない。
332nobodyさん:04/02/11 09:06 ID:???
だから意味なんかないわけわかめなんだって
333nobodyさん:04/02/11 09:19 ID:???
正規表現内のメタ文字のエスケープの事を言いたいんじゃないかな?
$trip が . や / を含んでいると結果がおかしくなる。
334nobodyさん:04/02/11 14:29 ID:???
括弧が1個余分だからパターンマッチに必ず失敗するということでは?
335未承諾広告※ ◆aiY4htt2.2 :04/02/11 14:44 ID:???
んーパターンマッチする or しない以前に、エラーで止まっちゃうってこと。
得体の知れないパターンは quotemeta するか事前に eval してチェックするとか。

$test = "0123456789\n";
$trip = "(*.))";
eval { print $test =~ /$trip/o ? "OK\n" : "NG\n"; }
print "NG $@" if $@;
exit;
336nobodyさん:04/02/11 15:39 ID:???
そんなのあたりまえだろ。
>>324みたい意味ありげに余計なことを書くから
みんな何かあるのかと思っちゃうんだろうが。
337nobodyさん:04/02/11 15:39 ID:???
form から受け取ったデータ、チェックもしないで
正規表現にぶっこむなってこった、以上
338nobodyさん:04/02/11 16:09 ID:???
>>337
ハ?釣り?
339nobodyさん:04/02/11 16:49 ID:???
>>337
「汚染されたデータ」についてお勉強ですな。
340nobodyさん:04/02/11 17:04 ID:???
チェックする為に先ず正規表現を使うんじゃないの?
341nobodyさん:04/02/11 17:07 ID:???
変数の中身を正規表現として解釈させないようにしましょう。

が正解か?
342nobodyさん:04/02/11 17:20 ID:???
my 変数ってブロックを抜けたら一々 undef とかしなくてもメモリから破棄されるのですか?
343nobodyさん:04/02/11 17:26 ID:K/v7YD0e
いろいろ調べたのですがうまくいかないので質問させてください

LWP::SimpleでのリクエストはUserAgentがLWP::Simple/X.XXとなっていて、
このUserAgentを変えるにはどのようにしたらいいのでしょうか。
344nobodyさん:04/02/11 17:34 ID:???
未承諾広告※は荒らしコテだろ
345nobodyさん:04/02/11 17:38 ID:???
>>342
でないとauto変数として役に立たんよ。
346nobodyさん:04/02/11 17:42 ID:???
>343
どういう調べ方をしたのか是非聞きたい。
347さん4さん:04/02/11 17:56 ID:???
まずPerl解説サイトっぽいところで探したけども見つからず
LWP Simple User Agent
でぐぐったらいくつかそれらしきものがあったんですけども、
それはLWPでもSimpleを使ったものでは無いらしく
UserAgentが変わらなかったり、サーバーエラ出たりてな感じです
↑説明ヘタだ…

俺の調査能力はこれでいっぱいいっぱいダ
348nobodyさん:04/02/11 18:04 ID:???
>>347
探し方が間違っとる。
http://search.cpan.org/ で 「LWP」で検索
libwww-perl-5.76 の説明ページがヒットしたのでクリック。
いかにもって感じで「The User Agent」の項目があるのでそこを読む。
349さん4さん:04/02/11 18:24 ID:???
LWP::UserAgentを使わないとだめってことか…
LWP::Simple使ったのに二、三行加えれば出来るんじゃないのかと
安易に思ったのが間違いだったようで

LWP::Simpleを使わずにLWP::UserAgentのみでやったらあっさり出来ました
いいサイト教えてくれてサンクス
やはり英語ができないとだめね
350nobodyさん:04/02/11 18:26 ID:???
>>335
my $trip = '(*.))';
my $trip_regex = eval { qr/$trip/ } or print "NG.";
チェックついでに正規表現をコンパイルした方が、お得感があっていいよ。

関連
http://www.perldoc.com/perl5.8.0/pod/perlfaq7.html#How-can-I-pass-return-a-%7bFunction%2c-FileHandle%2c-Array%2c-Hash%2c-Method%2c-Regex%7d-
351nobodyさん:04/02/11 18:38 ID:???
>>350
evalに変数って汚染では?違う?
352nobodyさん:04/02/11 19:01 ID:???
>>345
ブロック抜けても参照が残っていれば解放されないよ。
変数をundefはする必要ないけど、データがメモリから破棄されるかどうかは別。
Cのauto変数の様に、スタックに積まれる様な動作を想定してるならlocalの方じゃないかな。

http://www.kt.rim.or.jp/~kbk/perl5.005/perlfaq3.html#How_can_I_free_an_array_or_hash_
353nobodyさん:04/02/11 19:13 ID:???
>>351
my $ls = '`ls -l`';
print eval{$ls}, "\n"; # 展開されるだけ($lsを評価)
print eval "$ls", "\n"; # 展開されてその中身を評価
print eval $ls, "\n" # 同上
354nobodyさん:04/02/11 20:16 ID:???
>>345,352
うーむ、例えば
while(<FILE>){ my $foo = $_; }
とかやったとき、1ループ目の$foo、2ループ目の$foo、(以下略)、という風に区別され、
次々にメモリ上に格納されてしまうのかどうかが心配だったわけです。

上の例ならファイルを最終行まで読んだ場合は
ファイル全体のデータが毎行ずつ次々と追記されて行くのだろうか、と。
355nobodyさん:04/02/11 21:21 ID:???
>>354
リファレンスが無ければ、ブロックの終わりで自動的に破棄される。
この例だと、1ループ目で変数生成、代入、変数破棄、2ループ目で生成、代入、破棄、
を繰り返すことになる。
356nobodyさん:04/02/11 21:48 ID:???
PHPのセッションIDにあたるような、一意の文字列(100%一意でなくてもいいです)を
Perlで自作するにはどうすればいいのでしょうか?
357nobodyさん:04/02/11 22:05 ID:???
>>354
実際に無制限アップローダで同じようなロジック使ってるけど、
500MBアップしても使用メモリが増え続けるようなことはなかったよ。
まぁ、コンパイラの出来が悪いとメモリを食いつぶすようなコードをはくかもしれないけどね。
358nobodyさん:04/02/11 22:09 ID:???
>354-355を見て思ったんですが、
while(<FILE>){ my $foo = $_; }
と、
my $foo;
while(<FILE>){ $foo = $_; }
を比べた時、どちらがモアベターとかありますか?
素人考えでは、ループごとに変数生成や破棄がない分、
後者の方がいいのではないかと思えてしまいました。
359nobodyさん:04/02/11 22:10 ID:???
あ。
後者は
{
my $foo;
while(<FILE>){ $foo = $_; }
}
と置き換えてください。
じゃないと意味が変わっちゃう。
360nobodyさん:04/02/11 22:15 ID:???
>>356
http://search.cpan.org/~sherzodr/CGI-Session-3.95/
↑この辺から好きなの参考にして再発明。

>>358-359
自分でベンチ取って調べると、安易に教えてもらうより身につくよ。
まずいベンチコード書いて間違った結果を覚えてしまう事もあるけどな。
361nobodyさん:04/02/11 22:37 ID:???
>360
use Benchmark;
timethese(10000,{'TEST1'=>'&test1;','TEST2'=>'&test2;', });
sub test1{
open(FILE,"./jcode.pl");
while(<FILE>){ my $foo = $_; }
close(FILE);
}
sub test2{
open(FILE,"./jcode.pl");
my $foo;
while(<FILE>){ $foo = $_; }
close(FILE);
}

Benchmark: timing 10000 iterations of TEST1, TEST2...
TEST1: 64 wallclock secs (56.51 usr + 1.54 sys = 58.05 CPU) @ 172.26/s (n=10000)
TEST2: 59 wallclock secs (54.89 usr + 1.15 sys = 56.04 CPU) @ 178.44/s (n=10000)

ベンチマークで見ると後者の方がいいようですね。
可読性だと前者ですよね。
それ以外の理由でもどちらがより良いかなど聞ければと思ったのですが、
そういうのはありますでしょうか?
362nobodyさん:04/02/11 22:47 ID:???
csvファイルをアップロードする仕組みと、その内容を見に行く仕組みをつくったのですが、
なぜか、マックでファイルをアップロードすると、その内容が異なってしまいます。
(単純な、idとpassを書いたファイルなのに、それを使ってログインできない)

で、マックバイナリのせいかなとも思ったのですが、
ひでまるでそのファイルを開けて、ファイルの先頭や後方に変な文字もなく、
保存しなおして、同じようにファイルをアップロードしたら、今度は、
正常に内容を読み込めました。

いったい原因として何が考えられるのでしょうか?
マックのファイルをperlとかcgiで扱うときの注意って、マックバイナリしかしらないもので。。。
他に理由があるのでしょうか?
363nobodyさん:04/02/11 22:48 ID:???
改行コードは?
364nobodyさん:04/02/11 23:11 ID:???
よろしくお願いします。

サイトにperlのCGIを設置したのですが、
Operaではきちんと表示されるのですが、IEでは何も表示されません。
IEの吐かれたhtmlのソースを見るとheadとbodyの中身がありません。

Operaで表示されるということはパーミッションに問題があるのではなくて
本当はCGIの文法が間違っているんだけど、operaでは適当に解釈して
表示できているだけということでしょうか?

それともブラウザの違いによってパーミッションが違っていても参照できる事が
あるのでしょうか?
365nobodyさん:04/02/11 23:25 ID:???
Perlメモでcsvに触れてるところをぱくったので、まちがいないかと思うのですが。。。
あと、csvファイルの内容を見にいくときは、各行ごとにchompしてるんで、大丈夫かと思ったのですが。。。
366362:04/02/11 23:25 ID:???
すいません。>>365=>>362です
367nobodyさん:04/02/11 23:34 ID:???
>358
どちらでも全く変わらないと保証出来る場合は好きな方を取れば良いんじゃないでしょうか。

>364
出力されるHTMLのソースの問題の可能性の方が高いし、
ブラウザによって表示が変わるトラブルの場合、
順序的にはWEB製作板の該当スレからの方がよさげ。
#振り分けによってIE弾いてたりする可能性もあるけど
368nobodyさん:04/02/11 23:34 ID:???
>>364
それ、去年の暮に会社の後輩に同じことを質問されて、
そのときは一瞬でバグの在り処を指摘できたんだが、
今になってみると何だったかさっぱり思い出せない。
おぼろげながら、http ヘッダの吐き方の問題だったような気はする。

>>365
chomp ではだめかもしれない。
秀丸で開いて問題ないように見えても、やっぱりだめかもしれない。
UNIX上のemacsで開くと、たぶん問題の所在がわかると思う。
369364:04/02/11 23:35 ID:???
ありがとうございます。
そちらに行ってみます。
370364:04/02/11 23:36 ID:???
>>368
ありがとうございます。
まずその辺を調べてみます。
371362:04/02/11 23:38 ID:???
>>365
ありがとうございます。
調べたら、chompって、\r\n の時でも \n しか削ってくれないことに気づきました。
なので、正規表現で消すことにします。
372nobodyさん:04/02/11 23:44 ID:???
>371
正確にはちょっと違う。
chompの解説をよく読んでみることを勧めるよ。
\nしか削らないと思い込むと痛い目にあう事もあるかもしれない。
373362:04/02/11 23:59 ID:???
>>372
ありがとうございます。
「 $/にセットされている値(通常は\n)を行末から削除して、
削除した文字数を返します。改行の削除によく使われます。」

ということですね。てっきり、「改行がある場合に削除してくれる」としか考えていませんでした。
374nobodyさん:04/02/12 01:05 ID:6vxpFTk5

0-9とa-zを使って1桁から4桁の組み合わせを自動で生成させたいのですが、
どのようにスクリプトを組めばよいかまったく分かりません。

たとえば$keyにある値を調べたいとき、

$key = 'hsp';

〜〜自動生成のコード〜〜〜

$value ='自動生成した文字'

if ($key == $value) { print "HIT!"; break; }

〜〜〜ループ〜〜〜〜〜〜

exit;

このような感じにしたいのですが、、、できますでしょうか?
375374:04/02/12 01:06 ID:6vxpFTk5

簡単に言うと、

aa
ab
ac
ad
ae




のように全ての組み合わせを生成して、そのつど判定を行いたいのです。
376nobodyさん:04/02/12 01:11 ID:???
4桁?
その組み合わせが何通りあるのか考えよう。
377nobodyさん:04/02/12 01:26 ID:???
何に使うのかわからんが、思いついたのは

@char = ( 0..9, 'a'..'z' );

を使ってふにふにする。
数字がなければ

@str = ( 'aaaa'..'zzzz' );

で生成できるのかな。
378nobodyさん:04/02/12 01:27 ID:???
foreach(aa..zz){}
379nobodyさん:04/02/12 01:46 ID:???
@char = ('', 0..9, 'a'..'z' );
foreach $c1 (@char) {
 foreach $c2 (@char) {
  foreach $c3 (@char) {
   foreach $c4 (@char) {
    $value = $c1.$c2.$c3.$c4;
    〜〜〜
   }
  }
 }
}
同じ文字列が何度か出てきて、ちょっと無駄だけど。
380nobodyさん:04/02/12 02:25 ID:???
どひゃー、ループのネストかよw
仮にそれだとしても同じ文字列を出さないようにすればいいだろ
381nobodyさん:04/02/12 02:31 ID:???
つか、>>374の仕様に忠実に組むと、ループをネストせざるを得ない希ガス
382nobodyさん:04/02/12 02:53 ID:???
>>374
my @array1 = my @chr = (0..9, 'a'..'z'); # 1桁
my @array2; # 2 桁
for my $chr (@chr) { push @array2, map $chr . $_, @array1 }
my @array3; # 3 桁
for my $chr (@chr) { push @array3, map $chr . $_, @array2 }
my @array4; # 4 桁
for my $chr (@chr) { push @array4, map $chr . $_, @array3 }

要素数 1,727,604 個の配列を作る必然性が全くないがな。

$key =~ /^[0-9a-z]{1,4}$/
383nobodyさん:04/02/12 03:02 ID:???
テストしてないけど。
for (my $i = 'y'; length($i) < 5; $i = increment($i)) {
 ;
}

sub increment {
 my $str = shift;
 my $chars = [$str =~ /./g];
 _r_inc($chars);
 return join('', @$chars);
}

sub _r_inc {
 my $chars = shift;
 if ($chars->[-1] == 9) {
  $chars->[-1] = 'a';
 } elsif ($chars->[-1] eq 'z') {
  pop @$chars;
  _r_inc($chars);
  push @$chars, '0';
 } elsif (! @$chars) {
  $chars->[0] = '0';
 } else {
  my $tmp = "$chars->[-1]";
  $chars->[-1] = ++$tmp;
 }
}
384383:04/02/12 03:04 ID:???
あ、初期値 y になって、、、
385nobodyさん:04/02/12 03:33 ID:2BcfCTiO
>>382の下の一行で事足りそうな悪寒。いやそんなまさか
386nobodyさん:04/02/12 04:24 ID:???
或いはこういう事をしたいだけなのかも知れん。

my $key = 'hsp';
my @chr = (0..9, 'a'..'z', '');

while (1) {
  my $value = "@chr[ rand(@chr), rand(@chr), rand(@chr), rand(@chr) ]";
  $value =~ tr/ //d;

  if ($key eq $value) {
    print 'HIT!';
    last;
  }
}
387nobodyさん:04/02/12 04:59 ID:???
>>374は、パスワード解析とかがしたいのではないのか。
最大4桁と分かっているが、暗号化されていているとか。
それでひとつひとつしらみつぶしに。
388nobodyさん:04/02/12 05:14 ID:???
「ひょっとしてパス割りしたい?」と>>374におたずねしたい気分ですね。
389nobodyさん:04/02/12 05:35 ID:???
ブルートフォースアタックだな。
390nobodyさん:04/02/12 05:37 ID:ww+BFK9/
>>374
print "HIT!";

これだけでお望みの結果が得られる予感。しかも最速。
ついでにいうと$key == $valueは$key eq $valueの予感
391nobodyさん:04/02/12 05:39 ID:???
print "パスワードクラック成功!";
392374:04/02/12 06:36 ID:???
キャァーーーーーーーーーーーーーーーーー
393nobodyさん:04/02/12 10:50 ID:???
パスワードクラックしたけりゃ、Cを使えよ。Cを。
この種の処理なら、Perlよりも数倍速いぜ。
394374:04/02/12 11:16 ID:???
Cかぁ・・
6文字やるのに1時間かかったよ!
Cを使うしかないね!
だけど一般人が決めるパスワードの文字としてはqとかx、v、zなどあまり
使われそうが無いものを除けば以外と!
395nobodyさん:04/02/12 11:42 ID:???
use password_crack;
使えばいいじゃん。
396nobodyさん:04/02/12 12:59 ID:???
XSで書かれた順列生成モジュールなかったっけ?

PerlQuiz
http://books-support.softbank.co.jp/pq/backnumber/032_index.html
397nobodyさん:04/02/12 13:50 ID:jjdbHkdx
質問です。よろしくお願いします・
$hash{$g}{"$h"}=0
このようなhashにデータをいれて
foreachを使用しての0の取り出し方は
どのようにすればいいのでしょうか?
398nobodyさん:04/02/12 14:15 ID:???
foreach (values %{$hash{$g}})
399nobodyさん:04/02/12 14:43 ID:jjdbHkdx
>>398
ありがとうございます。
400nobodyさん:04/02/12 16:58 ID:???
質問よろしいでしょうか。
掲示板に投稿されたアドレスによって、適用されるスタイルシートのクラスを変えたいと思っています。
例として、niftyとinfoseekの名前を出します。

#  掲示板の本文を引数にして、URL自動リンク
sub auto_link {

  #  アドレスにniftyがある場合
  if ($_[0] =~ "nifty") {

    #  本文を引数にして、URLを自動リンク化させる(style="nifty")
    $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" target="_blank" class="nifty">$2<\/A>/g;

  #  アドレスにinffoseekがある場合
  } elsif ($_[0] =~ "infoseek") {

    #  本文を引数にして、URLを自動リンク化させる(style="infoseek")
    $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" target="_blank" class="infoseek">$2<\/A>/g;

  }

}
401nobodyさん:04/02/12 16:58 ID:???
現在このように書いています。
本文に記載されたアドレスがniftyの文字列を含めば、niftyのスタイルシートが適用されます。
infoseekの文字列を含めば、infoseekのスタイルシートが適用されます。
しかし、アドレスを二つ本文に記入し、それぞれがniftyとinfoseekのアドレスの場合、
スタイルシートが正常に適用されなくなります。

例1:投稿内容(わざとttpにします)
ttp://www.nifty.com/
ttp://www.infoseek.co.jp/

このようにして投稿すると、両方とも自動リンクされたものになりますが、両方ともniftyのスタイルシートが適用されます。

例2:投稿内容(わざとttpにします)
ttp://www.infoseek.co.jp/
ttp://www.nifty.com/

こうすると、両方ともinfoseekのスタイルシートが適用されてしまいます。
それぞれ正常なスタイルシートを適用させるためには、どのようにすればいいでしょうか。
402nobodyさん:04/02/12 19:58 ID:???
「niftyをドメイン名に含むURLらしきもの」
「infoseekをドメイン名に含むURLらしきもの」
をそれぞれ別個に置換して<a></a>のクラスを変えたいと。

今はifで分岐した後「URLらしきもの」をgつけて置換してるから
全部同じになっちゃうと。

正規表現を工夫しましょう。
403nobodyさん:04/02/12 21:17 ID:???
>>379

それだと多い桁数から(例えば6桁から)検索することになるよなぁ。。
1桁目から順番にうまく増やしていく方法はないだろうか。

404nobodyさん:04/02/13 00:26 ID:???
つか、gがいらないだけじゃないんかと。


sub auto_link {
 if ($_[0] =~ "nifty") {$host=nifty;}
 elsif($_[0] =~ "infoseek") {$host=infoseek;}
 $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" target="_blank" class="$host">$2<\/A>/;
}
405nobodyさん:04/02/13 00:46 ID:???
>>404
なるほど、URLの部分を抜き出してから&auto_link(抜き出した部分)するってことね。

・・・とか言えばいいのですかそれはひょっとして。
406295:04/02/13 02:35 ID:???
フォームから送られたデータを、postかgetか判断して、splitして、ってやって表示させるようにしてたんですが、
<a href="index.cgi?num=$num">とやってgetで渡して、
受け取ろうと思ったら、「書き込まれたときのルーチン」とかちあってしまうようです。
どうしたらいいんでしょうか…。

>>312
ありがとうございました。
そのルーチンにたどり着く前に詰まりました。
407nobodyさん:04/02/13 04:11 ID:???
>>406
引数を追加して区別すればいいだろ
408nobodyさん:04/02/13 09:17 ID:???
>>404
それだと、

 if ($_[0] =~ "nifty") {$host=nifty;}
 elsif($_[0] =~ "infoseek") {$host=infoseek;}

$_[0]ってのは書き込まれる本文全部なわけだよな。
要するに本文内にniftyとinfoseekのアドレスが両方あったら、
片方だけしか置換できないんじゃ?解決してなくね?俺の勘違い?
409nobodyさん:04/02/13 10:40 ID:???
>>400-401

1.本文からURL文字列にマッチする部分を抜き出す
2.マッチした部分を配列URLに突っ込む
3.foreach(@URL)
   if($_ =~ "nifty") {
     スタイルシートのクラスをniftyにする;
   } elsif {$_ =~ "infoseek") {
     スタイルシートのクラスをinfoseekにする;
   }
 とかで配列の中身を入れ替えていく
4.配列の中身を本文のURL文字列にマッチした部分と入れ替える

とかじゃ無理なん?いまいち綺麗な書き方が思い浮かばないが。
誰かフォローよろ。
410perl初心者:04/02/13 11:43 ID:tfW2FTff
初心者です。

infoseekでHPをつくっています。
掲示板を自作しているのですが、ログファイルが大きくなり過ぎないように、
(例えば100ごとに)新しいログファイルをつくってみようかな、と思いました。

で、
open( FILE , ">>bbs$number.dat"); # $numberは数字で、投稿が100増えるごとに1カウントアップする
というような書き方は間違っているのでしょうか?

どうやらファイルが作成されず、書き込みができていないようです。

よい解決策がありましたら、ぜひ御教授お願い致します。
411nobodyさん:04/02/13 11:50 ID:???
openするときゃエラーの捕捉くらいしれ。そんでエラーメッセージ見りゃ解決する。

そしていちいち初心者なんて主張するな、書いてなくてもみりゃわかる。
412nobodyさん:04/02/13 11:51 ID:???
>>410
perl的には間違ってなさそうなので
おそらく他の箇所に問題があると予想される

例えば、そうだな、ディレクトリに書き込み権限が無い、とか
413410:04/02/13 14:22 ID:V83fKtr2
>>411
えーと。
すいません。
初心者なので「初心者」と書いただけなのですが、気にさわったのならあやまります。
とりあえず、エラー処理してみますね。
どうもありがとうございます。

>>412
例えば、
open( FILE , ">>bbs1.dat");
とかにすると、正常に書き込みできるんですよね。
構文のエラーかと思っていろいろ調べてたのですが、
とりあえず、構文的には間違ってないということがわかり、一歩前進です。
ありがとうございます。

414nobodyさん:04/02/13 14:32 ID:???
> open( FILE , ">>bbs1.dat");
> とかにすると、正常に書き込みできるんですよね。
じゃー $number にまともな値が入ってないんじゃねーの?
なんつーか、もうちょっと頭使え。
415410:04/02/13 14:54 ID:???
>>414
あ。
ごめんなさい、説明不足でした。

open( FILE , ">>bbs1.dat");
なら書き込みできるのですが、

$write_file="bbs1.dat"
open( FILE , ">>bbs1.dat");
とすると、書き込みができなくなるようなのです。

うーん。
がんばってはいるのですが、どのように頭をつかっていいのやら(w

あ、ちなみにエラー処理を入れても、エラーメッセージは出ずにファイルが作成されていないという、
不思議な状況となっております。
416nobodyさん:04/02/13 14:56 ID:???
>$write_file="bbs1.dat"
>open( FILE , ">>bbs1.dat");
>とすると、書き込みができなくなるようなのです。

ありえないとは思うがセミコロン忘れじゃないだろうな。
417410:04/02/13 15:02 ID:???
>>416
あー、ごめんなさい。
セミコロンはちゃんと入ってます。

infoseekのせいですかねぇ??
418nobodyさん:04/02/13 15:03 ID:???
>>413
追加書き込みでも新しいファイルを作成できるけど、
openの前に、ファイルがなければ空ファイルを作成する。
といった処理をいれてみるといいよ。冗長に書くと ...

if (not -e $file) {
if (not -w "./") {
die "ディレクトリに書き込み権権限がありません。";
}
else {
open(FILE, ">$file") or die "Can not open >$file: $!\n";
}
}
if (-f $file and -w $file) {
open(FILE, ">> $file") or die "Can not open >>$file: $!\n";
}
else {
die "$fileが存在しない。もしくは、書き込み権限がありません。\n";
}
419nobodyさん:04/02/13 15:06 ID:???
>413
「初心者です」という台詞は大抵の場合何かに対する
言い訳として取られるので書かない方が良い。

回答者側から見れば「初心者ですか、それが何か?」という感じかな。
そもそもこのスレに限れば初心者質問コーナーだし、
わざわざ書く必要性が全く無いから尚更。

ってわけで一旦>414の言う通り $number の値を調べてみるとか。
間違って使ってるOSのファイル名に使えない文字が入ってる可能性も。
420419:04/02/13 15:07 ID:???
ウワァァァン遅レスになっちまった
421nobodyさん:04/02/13 15:30 ID:qPomAfxi
CGIで、指定したフォルダ内のファイル数を取得できる関数はありますか?
422nobodyさん:04/02/13 15:41 ID:???
infoseekも鯖のせいにされて災難だな・・・
423nobodyさん:04/02/13 15:46 ID:???
はいはい煽らない。鯖によってあれこれ違う部分があるのはしょうがないんだから。
424>>400-401:04/02/13 16:06 ID:???
先日質問させていただいたものです。
以下の方法にて解決できました。

  #  本文を引数にして、URL文字列の部分で infoseek を含む部分を自動リンク化(style="infoseek")する
  $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" target="_blank" class="infoseek">$2<\/A>/g;

  #  本文を引数にして、URL文字列の部分で nifty を含む部分を自動リンク化(style="nifty")する
  $_[0] =~ s/([^=^\"]|^)((http|ftp|https)\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+nifty\.com\/junmix\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\,\|]+)/$1<A href="$2" target="_blank" class="nifty">$2<\/A>/g;

もっとスマートな処理も可能なのでしょうが、とりあえず問題無さそうなので良しとします。
アドバイスくださった皆様、ありがとうございました。
425nobodyさん:04/02/13 16:10 ID:???
>>421
>>374-396 あたり見れ
ファイル名に使える文字の組み合わせで、20文字ぐらいまで生成
ひとつひとつオープンしてみる
開けた数を数える

正確な数が知りたければ、当然20文字以上のファイル名まで生成しなきゃ
いけないわけだが、コストがかかりすぎるのでやめといた方がいい
426nobodyさん:04/02/13 16:12 ID:???
(^∀^)ゲラゲラ なるほどそういう追い返しかたもあるか
427nobodyさん:04/02/13 16:29 ID:???
>>424
ミニクッ
と思って書いてみたけど、大してかわんねーや
s#([^="]\s*)((?:https?|ftp)://(?:[^/\]\@[^/:]:)?(?:[^/]+\.)*?infoseek(?:\.\w+)+(?:\/\~?[-_0-9a-z.%&?=]*)*)#$1<a href=$2>$2</a>#ig;
428427:04/02/13 16:35 ID:???
一部コピペしたせいか、変なとこあったな。手直し
s#([^="]\s*)((?:https?|ftp)://(?:[^/\]\@[^/:]:)?(?:[^/]+\.)*?infoseek(?:\.\w+)+(?:/~?[-\w.%&?=]*)*)#$1<a href=$2>$2</a>#ig;
429nobodyさん:04/02/13 17:18 ID:WMQmiSJK
自分で晒しちゃダメだよ。w

php:Webプログラミング[レス削除]
http://qb2.2ch.net/test/read.cgi/saku/1030165467/211
430nobodyさん:04/02/13 17:35 ID:???
>425
どうも、ありがとうございます。
431nobodyさん:04/02/13 17:43 ID:???
>>430
おい、真に受けるなよ・・・
432nobodyさん:04/02/13 19:57 ID:???
>>374
何に使うか知らないけど、36進カウンタを作るか、10進でカウントして36進に基数変換。

>>421
my $dir = './foo/bar/*';
my $file_num = @{[glob($dir)]};
433295:04/02/13 22:01 ID:???
>>407
書き込まれた
 ↓
getかpostかで判定
 ↓
判定に従って受け取り
 ↓
書き込み処理

なんですけど、
<a href="index.cgi?num=$num">ですと、getメソッドですよね?
$ENV{'REQUEST_METHOD'}で「getですよ」って判断してくれますか?
ローカルでテストを繰り返してるんですけど、もはやどこでつまってるかすらわからないんです。

#print $num;ってやって、何が入ってるかを見ようとしたらウチのOperaは「ダウンロードしますか?」とか言い出し始めました。
434nobodyさん:04/02/13 23:13 ID:???
Content-type: text/html
435nobodyさん:04/02/13 23:33 ID:???
charset:nullpo
436日本語処理:04/02/13 23:41 ID:UTk8Uv/J
perl 5.8で、日本語の処理をしようとしています。
ちなみにperlを書くのは初めてです。
やりたいことは
(1)Shift-JISの日本語のファイルを読み込み、
(2)日本語の正規表現を使って置換して
(3)Shift-JISで書き出す
ということです。
いざ、やろうとしてから、perlのバージョンによって、またJperlを使うか
Jcode.pl, Jcode.pmなどを使うかで複雑な事情があることなどがわかりました。
これまでに得た情報の中では、
Perl5.8以降を使うのが最善だろうという結論に達しました。
(ここまでは間違っていないだろうと思います)
ところが5.8以降はまだ資料も少なく、あっても初心者向けに書かれてはいません。
おそらく(2)の部分がネックになって、Shift-JISで読み込んでから一旦euc-jpに変換して、それから置換して、それをまたShift-JISに変換して書き出す必要があるのではないかという予測はつくのですが、実際にどうコーディングするのかがわかりません。
use encoding "euc-jp";
とか
binmode STDOUT, ":encoding(euc-jp)";
とか
use open IO => ":encoding(euc-jp)";
open( F, "< filename" ) or die;
とか
を使うのでしょうか?
どなたかご教授をお願いします。
437nobodyさん:04/02/13 23:49 ID:HAumrZ9z
>ちなみにperlを書くのは初めてです。
本当かコイツ…?
438nobodyさん:04/02/13 23:52 ID:???
>>437
要はお前が今までやってたのはPerlバージンにすら劣るPerlごっこだったと言うことだ。
439nobodyさん:04/02/14 00:05 ID:???
>>436
どちらかと言うと euc よりも utf-8 の方が良いと思うが
euc でやりたいと言うなら止めはしない

>binmode STDOUT, ":encoding(euc-jp)";
この行は「euc-jp で出力を書き出す」という意味だが、それでよい?

>use open IO => ":encoding(euc-jp)";
この行は「euc-jp のファイルを読み込む」という意味だが、それでよい?
440nobodyさん:04/02/14 00:11 ID:???
普通にopenで読み込んでエンコードして、またエンコードすればええやん
441nobodyさん:04/02/14 07:18 ID:???
>>436
僕も utf8 でスクリプトを書くのをお勧めするけど。>>439の捕捉

Shift_JISで読み込み、出力との事なので、
use encoding STDOUT => ":encoding(sjis)";
use open IO => ":encoding(sjis)";

ただし読み込まれたデータはPerl内部では utf-8 で保持されるので、
日本語の正規表現を使うには、use utf8; として utf-8でスクリプトを記述しなければならない。

入出力共にShiftJISの様なので、正規表現自体の文字コードを変換した方がいいんじゃないかな。
PerlIO以外に、従来の方法でも文字コードの変換は出来るので。
use Encode;
Encode::from_to($_, "shiftjis", "euc-jp");
442nobodyさん:04/02/14 12:41 ID:???
>>436
 入力も出力も sjis なら、スクリプトも sjis で書いてしまう方が簡明かも
しれない。Perl 5.8 なら、スクリプトの先頭に
use encoding "shift-jis";
と書けば、Jperl と同様に sjis をそのまま使ったコーディングができる。
但し、 sjis のコードの並びに依存した処理はできない。例えば、
s/[唖-蔭]/あ/g; などと書いても期待したようには動かない。ファイルは
全部 shift-jis でも内部は utf-8 で動いているから。
 もし、s/[唖-蔭]/あ/g; のような処理を期待通りに実行させたいなら、
Jperlを使うしかない。
443sage:04/02/14 14:56 ID:iklPMhbn
掲示板を作成しております。

<BR>とか書き込むと、改行になってしまう。
©とか書き込むと、ゥっぽくなってしまう。

回避策をお教えいただきたいです。よろしくお願いいたします。
444443:04/02/14 14:59 ID:???
すみません。sage失敗しました。。。

でも、このカキコソースで、なんとなくわかりました。
「<」だったら「<」ですね。
「&」だったら「&」ですね。
でもやっぱり、「©」とかなるんですね。
445443:04/02/14 15:03 ID:???
>>443>>444です。

「<」だったら「<セミコロン(;)」。
「&」だったら「&セミコロン(;)」と書いたつもりでした。

なーるほどー!
しかしやっぱり「<セミコロン(;)」と書き込みたい場合、
何か回避策はあるのでしょうか???
446nobodyさん:04/02/14 15:03 ID:???
>>443-444
>>1 嫁。
> 1: 自分はこう言う事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
>
> 最低でも1と3が無いと誰も答えられないよ。
>>1 を読まない奴は氏ね。百遍氏ね。
447443:04/02/14 15:05 ID:???
> 1: 自分はこう言う事がしたい。
掲示板を作成したい。

> 3: こんなエラーが出て上手く行かなかった。
<BR>とか書き込むと、改行になってしまう。
©とか書き込むと、ゥっぽくなってしまう。
448443:04/02/14 15:08 ID:???
「<」だったら「<セミコロン(;)」。

と出るのカー。。
「&lt」で「<」となるんですね。ハハハハハ。
449nobodyさん:04/02/14 15:09 ID:???
>>447
それはPerlの話題ではない。ブラウザ関係の別スレで。
450nobodyさん:04/02/14 15:09 ID:???
>>447
htmlのタグに解釈されたくなけりゃ前後に<pre></pre>か
<code></code>も出力したら?
451nobodyさん:04/02/14 15:11 ID:???
>>448
クーーンノヤロローーゥ。目ん玉抜いて肥溜めにドッブーンだジョ
452443:04/02/14 15:16 ID:???
>>449
(・∀・;)アッ!

お騒がせしました。。

>>450
ありがとうございます!さっそく調べてみます!

>>451
(∀)スンマセンスンマセンスンマセン

マジでありがとうございました。
453nobodyさん:04/02/14 17:17 ID:???
>>450
んなわけねー
454nobodyさん:04/02/14 19:26 ID:???
htmlspecialchars()
あ、PHPか
455nobodyさん:04/02/14 20:48 ID:MY20jgff
http://www.mirv.net/gappa/np.cgi.txt

これなんで動かないんでしょ?
456nobodyさん:04/02/14 21:21 ID:???
>>443
use HTML::Entities;

my $str = '<>=&"などなど';
print encode_entities($str, '<>&"');
457nobodyさん:04/02/14 22:26 ID:???
>>455
xreaスレ住民か
残念だったな、俺もそのスレ見てるんだよ
458nobodyさん:04/02/14 22:33 ID:???
>455
2行目に書いてあるだろ。
それすら読めないならCGIなんて設置するな。
459nobodyさん:04/02/14 23:08 ID:5JCFJ0BZ
プログラム初心者ですが質問させてください。
$a = 13;
$b = 13.1;

$c = $b - $a;
のようにして$cには0.1が入る様にしたいのですが
実際は0.0999999999999996が入ってしまいます。
調べてみたところ浮動小数点計算時の丸め誤差と言うのがでている
と分かったのですがこれを十進演算で0.1になるように演算できないものでしょうか?
該当するリファレンスも見あたらず困っております。
最悪、各値を10倍して131 - 130 = 1の様にしてこの1に無理矢理文字列扱いで
"0."をつけてしまおうかとも思っています。
460nobodyさん:04/02/14 23:12 ID:???
printf "%.1f", 13-13.1;
461nobodyさん:04/02/14 23:33 ID:???
use Math::BigFloat;

$a = Math::BigFloat->new('13');
$b = Math::BigFloat->new('13.1');
$c = $b - $a;

# 演算誤差が問題を起こさなければ>>460に同意。
462nobodyさん:04/02/15 00:01 ID:???
早速ありがとうございます。
>>460さんの方は私にはちょっとよくわからないのですが調べてやってみます。
お二人ともありがとうございました。
463nobodyさん:04/02/15 00:07 ID:7ZjLzuEO
>>461が分かって、>>460が分からないのですか。
うーむ、御見それしやした。
464nobodyさん:04/02/15 01:21 ID:EsFj8SNd
掲示板なんですが、
$colors = '#000000 #〜 #〜 #〜 #〜 #〜 #〜 #〜';
と半角スペース区切りで指定した書き込み色を

if ($colform) {
print "文字色<br>\n";
@col = split(/\s+/, $colors);
if ($ck{'color'} eq "") { $ck{'color'} = $col[0]; }
foreach (@col) {
if ($ck{'color'} eq $_) {
print "<input type=radio name=color value=\"$_\" checked><font color=\"$_\">■</font>\n";
} else {
print "<input type=radio name=color value=\"$_\"><font color=\"$_\">■</font>\n";
}
}

こんな感じで呼び出してるんですが、携帯端末だと機種によって改行がバラバラなのを直したいんです。
全8色なので、これを端末に関係なく4色目のチェックボックス+■の後で改行させるにはどう書き換えればよいでしょうか。

イメージ的には(Oがチェックボックスとして)
現在
O■O■O■O■O■O
■O■O■
こんな感じなのを
O■O■O■O■
O■O■O■O■
こういう風にしたいんですが
465nobodyさん:04/02/15 01:27 ID:???
>>464
いいと思うよ
466166:04/02/15 01:37 ID:???
>>464
目からうろこです
467nobodyさん:04/02/15 01:38 ID:???
>>464
4色ずつ代入すれ
468nobodyさん:04/02/15 01:43 ID:???
#4行毎に<br>タグを入れる

@col = ('Q','W','E','R','A','S','D','F');

my $counter = 0;
my @counter_array = (' ',' ',' ','<br>');

foreach $value(@col) {
print $value.$counter_array[$counter % 4];
$counter++;
}
469nobodyさん:04/02/15 02:38 ID:EsFj8SNd
>>465-468さん
レスありがとうございます。
バレンタイ(ry に一日スクリプト弄ってた甲斐があった・゚・(つД`)・゚・

>>468さん、あなたのことは一生忘れません。
実を言うとまだ
#000000 #FF2596 #0077FF #009493
#FF2000 #FF1493 #0000FF #FF6347
O■
こんな風になってしまうんですが_l ̄l○
あとは宿題ですね。頑張ってみます。
改行させる処理がどうしてもわからなかったのでほんと助かりました。
ほんとにありがとうございました。
470nobodyさん:04/02/15 02:46 ID:???
if($a ne ''){
if($b eq ''){
&c;
}
}
$aが空じゃなくて、$bが空のときsub cへ、をもっと簡潔に書くことは出来ませんか?
andとか探してみましたが、とほほのリファレンスには載ってなかったようなので。
471nobodyさん:04/02/15 02:51 ID:???
>>470
とほほだけじゃなくいろんなところを見たらいいよ
ttp://www.rfs.jp/sitebuilder/perl/
ttp://perl.misty.ne.jp/index.html
472nobodyさん:04/02/15 03:12 ID:???
>>471
有難う御座います。
if($a ne '') and ($b eq ''){
&c;
}
と思ってました。

if($a ne '' and $b eq ''){
&c;
}
なんですね。
473nobodyさん:04/02/15 04:20 ID:???
#4行固定から@arrayの要素数依存に変えてみた

@col = ('Q','W','E','R','A','S','D','F');

my $counter = 0;
my @array = ("\n","\n","\n","<br>\n");
my $limit = scalar @array;

foreach $value(@col) {
print $value;
print $array[$counter % $limit];
$counter++;
}
474nobodyさん:04/02/15 11:41 ID:???
横レス(失礼
真っ先に三項演算子を使った方法が思い浮かんだんだけど、
($counter++ % 4) ? "\n" : "\n<br />"
配列を用意するとは nice idea.番兵みたいな感じ?ちょっと違うか。
参考になったよ、ありがとう。
475nobodyさん:04/02/15 17:13 ID:???
perlの
$str = s/文字/$a+1/e;
のようなeオプション(式として評価する)みたいな機能はありますか?
476nobodyさん:04/02/15 17:18 ID:???
eval
477nobodyさん:04/02/15 17:27 ID:???
crtpt関数がはき出す文字列に、「&」が含まれる可能性はあるでしょうか?
478nobodyさん:04/02/15 17:45 ID:???
crypt?
./0-9a-zA-Z
479nobodyさん:04/02/15 18:40 ID:???
教えてください。

日本語処理で困っています。
URLのエンコードで、普通にsjisをunpackしましたが
コード体系が違うみたいでうまくいかなくて
おそらくutf-8にしなくてはならないのですが、
なにかよい方法はないでしょうか?

具体的には以下の変換です。

変換前:2ちゃんねる
変換後:%EF%BC%92%E3%81%A1%E3%82%83%E3%82%93%E3%81%AD%E3%82%8B
480nobodyさん:04/02/15 18:49 ID:???
>>479
URLエンコード?
481nobodyさん:04/02/15 19:46 ID:???
>>480
はい。
正確にはURLの後ろにくっつけるQueryデータのことです
日本語データをGETで 渡したいのですが、受け取り側がうまく解釈してくれなくて困ってます
482nobodyさん:04/02/15 19:57 ID:YoBoJyol
$foo = 1234; のとき、

$show1234 = 1とするには、どうすればいいのでしたでしょうか?
(「1234」の部分は任意の数字が入ります。)

お教えいただければ幸いです。

$$が2つ入るような記憶があるのですが、どうためしてもうまくいかず。。。
483nobodyさん:04/02/15 20:04 ID:???
>>482
ハッシュ使えばいいんじゃないかと。

$foo=1234;
$show{$foo} = 1;

わざわざ$show1234とか作る意味が分からんです。
484nobodyさん:04/02/15 20:05 ID:???
>>479
エンコードをスクリプトでやっているなら、エンコード側で
UTF-8からShift_JISへ変換した方がいいよ。
$strに入っているとして、

use Jcode;
$str = Jcode->new($str, 'utf8')->sjis;

Perl 5.8.xなら
use Encode qw(from_to);
from_to($str, 'utf8', 'shiftjis');
485166:04/02/15 20:16 ID:???
なにかしら理由があるんだろ。決め付けるのはいくない。

$foo = 1234;
${show.$foo} = 1;
print $show1234;
486nobodyさん:04/02/15 20:16 ID:???
 
487nobodyさん:04/02/15 20:19 ID:???
>>485>>482への解
488nobodyさん:04/02/15 20:28 ID:???
>>482
こういうことをする人は、たいていハッシュをよく理解してない。
489nobodyさん:04/02/15 21:50 ID:???
-w && use strict 下でなら、
{
no strict;
no warnings;
${show.$foo} = 1;
print $show1234;
}
use strictしていなければ、$$name = $valueで新しい変数作成の様な事が出来るけど、
リファレンスと間違いやすいのでお勧めはしないよ。-w で警告もでるし。
特に理由がなければハッシュを使う事を勧める。
490482:04/02/15 22:54 ID:YoBoJyol
>>483-484
ありがとうございます。
他人がつくったへなくちょライブラリの仕様にあわせなくてはならなかったので。。。
491nobodyさん:04/02/15 23:23 ID:WhE988CO
ふふふ・・・

http://cache/test/read.cgi/php/1075545279/
とアクセスして
/php/1075545279/の部分を取り出したい

どうすればいい?

$ENV{'もじれつ'}を使えば出来そうなんだが分からん
492nobodyさん:04/02/15 23:47 ID:???
PATH_INFO
493nobodyさん:04/02/16 03:08 ID:EJ9bmaTw
>>492
ありがと
494295:04/02/16 08:27 ID:???
何度もすみません。
掲示板の修正ルーチンを組みたいんですが、
$num,$name,$ua,$value,$ip,$time,$resとlogファイルに記録されてあって、
でも、logを読み込むと全行丸々読み込まれるんですが、
「$numに該当する行を抜き出し」て「その行に新しい情報を上書き」する方法が思いつかないんです。
「$numに該当する行を抜き出し」の方法をお教え下さい。お願いします。
495nobodyさん:04/02/16 08:46 ID:???
> $ENV{'もじれつ'}を使えば出来そうなんだが分からん
そこまで分かってるなら、環境変数全部表示しろよ……。
496nobodyさん:04/02/16 10:53 ID:???
>>494
フォームから$numに相当する値(例:$input{'num'})を送信。
全レスを@alldataに格納して、1レス(1行)ごとに$numを見ていく。
マッチしなければ、何もしないまま一時的に別の配列に格納する。
$numがマッチしたら処理して一時配列に格納する。

オレは↑な感じでやってるけど、ほかにいい方法があればきぼんぬ。

foreach $line (@alldata)
 ($num,$name,$ua,$value,$ip,$time,$res) = split(/\t/,$line); #タブ区切りの場合
 if($input{'num'} == $num) {
  #ここで新しい情報を上書きした$lineを作成
  push(@tmpdata,$line)
 }
 else {
  push(@tempdata,$line);
 }
}
497ひらがな1文字読み込みたい:04/02/16 11:01 ID:8KPvfhj8
入力された「よみがな」から、先頭の文字を読み込み、
五十音順別(あかさたな…行)に、$gyouを自動入力(a, k, s, t, nな感じ.)したいんですが、
先頭の1文字を読み込む方法が分かりません。

1バイトならgetcを使いますが、日本語の場合はどうすればいいのでしょうか?
498nobodyさん:04/02/16 11:09 ID:8KPvfhj8
>>496
あ、打ち間違い。下から6行目は↓ね。
× push(@tmpdata,$line)
○ push(@tempdata,$line);
499nobodyさん:04/02/16 12:31 ID:???
>>497
getc とは珍しい関数を使うな。おぬしC者か?
しかし「open(FD,'http://www.2ch.net/')が動きません」とか質問する輩よりは
遥かに好感が持てるぞ。

まあ、特別な理由が無い限り、一行丸ごと読み込んで、
substrや正規表現で先頭文字だけ切り出すというのが賢明だろう。
500nobodyさん:04/02/16 12:35 ID:???
>>499
ごめん。3年前ぐらいにそんな質問したわ。
501nobodyさん:04/02/16 12:56 ID:???
クーーンノヤロローーゥ。目ん玉抜いて肥溜めにドッブーンだジョ
502nobodyさん:04/02/16 14:06 ID:???
大昔、Cで1文字読み取るときは、漢字の1バイト目だったら
もう1バイト読むってな処理を入れてたなぁ。
503nobodyさん:04/02/16 14:13 ID:???
$row = '修正後のレコード';
$id = 記事番号;

open(IN,"$logfile");
open(OUT,">$tempfile");

while(<IN>){
if (/^$id/){
print OUT $row;
}else{
print OUT $_;
}

close(OUT);
close(IN);
rename $tempfile,$logfile;

みたいにしてみたり。
504nobodyさん:04/02/16 17:42 ID:538nCWIA
perlから違うディレクトリにあるテキストを読み込んでいるんですが、
そのテキストのURLを直接ブラウザに打ち込むと、当然中身が見えます。
これを、cgiからは読み込めるけど直接URLからは見えないようにしたいんですが、いい方法はないでしょうか。
505nobodyさん:04/02/16 17:52 ID:???
パーミッションを変える。例えば600。
506nobodyさん:04/02/16 17:55 ID:???
>>504
予測しづらい場所に置く。
cgiとして実行させエラーを招く。
中を見られても平気なように暗号化等する。
直接見えない場所におく。DocumentRootの外。
Webサーバのアクセス制限機能を使う。htaccessでdeny等。
507nobodyさん:04/02/16 17:58 ID:???
スレ違いの話題はここらで終了
508497:04/02/16 19:21 ID:PRz8Y+FS
>>499 >>502
レスどうも。ちょっと質問文を訂正しときます。
× 1バイトならgetcを使いますが
○ 1バイトならgetcという関数がありますが

で結局、substrで2バイト読み込むとうまく行きました。↓な感じで。
ありがとうござました。

$first_char = substr($input{'yomi'}, 0, 2);
509nobodyさん:04/02/16 20:52 ID:d2i3jS1n
クラスメソッドの呼び出しで質問です。

test/Modules/Hoge.pm
-----------------------------
package Hoge;
use Exporter;
@ISA = qw( Exporter );
@EXPORT = qw( foo );
sub foo{
print "foo", "\n";
}
1;
-----------------------------
test/main.plx
-----------------------------
use Modules::Hoge;
foo();
-----------------------------
これだと、
Undefined subroutine &main::foo called at main.plx line 7.
と怒られます。
Hoge->foo();
だと問題ないですが、物の本ではこうやってインポートした場合、
foo(); で呼べるように書いてあります。
いろいろやってみた所、Hoge.pmをmain.plxと同階層においた場合は
foo(); で呼べました。
なぜでしょうか?
510名無しのごんべい:04/02/16 20:56 ID:XfIM5+aj
511nobodyさん:04/02/16 21:00 ID:???
bless
512509:04/02/16 21:06 ID:d2i3jS1n
>>511
ええ、
$obj = Hoge->new();
$obj->foo();
と無名ハッシュのコンストラクタ作ってオブジェクトメソッドとして
呼んだ場合はオーケーなのは確認してます。
知りたいのは、スクリプトと同階層に置いて、
use Hoge;
foo();
なら問題なくて、/Modules以下に置いた場合
use Modules::Hoge;
foo(); 
ならだめで、
use Modules::Hoge;
Hoge->foo();
としなければならないのでしょうか?
モジュールに対してuseしているのは同じだと思うのですが。
513509:04/02/16 21:16 ID:d2i3jS1n
>>512
use lib '/home//www/test/Modules/';
use Hoge;
foo();

でもうまく行きました。
う〜ん、なんとなくわかりますが、釈然としませんです。
514nobodyさん:04/02/16 21:25 ID:???
>>509
package Modules::Hoge;
にしないと、きちんとEXPORTされないみたい。

後、クラスメソッドの呼出は、Modules::Hoge::foo()
通常のメソッド呼出($obj->method())と記述分けた方がいいよ。
(引数が違う)
515509:04/02/16 21:38 ID:???
>>514
ありがとうございます。
確かにそうなりました。

でもpackage名にパス入れるって使いにくいですよね。
仰るとおり、
モジュールの宣言は、
package Hoge;
にして、使う方は、
use Modules::Hoge;
Hoge::foo();

にする事にします。
516nobodyさん:04/02/16 21:58 ID:???
>>515
パスじゃなくてnamespaceとして見た方がいいと思う。
共通するモジュール郡をまとめるといった役割があるので。

package Hogeとして、ファイルを Modules/Hoge.pmに置くなら、
use lib "./Modules"; use Hoge; でいいんじゃない?
517509:04/02/16 22:12 ID:???
>>516
おお、そかそか、なるほど。
なんだか少しずつ、すっきりしてきました。
ありがとうございました。
518nobodyさん:04/02/16 22:17 ID:vXlcR1H3
Apache1.3 + MySQL4.0 + Perl5でアップローダ掲示板を
作っていますが、アップされたファイルをBLOB型に入れる方法がわかりません。

BLOB型を使わないで鯖にファイルを作成しちゃう方法なら
cgi-lib.pl使ってできたんですが、BLOBに入れて管理したいそうです(お客は)。

cgi-libで取得したin{'file'}をBLOBに入れるには
どうすればいいんでしょうか。
$dbh->quote{in{'file'}};
ってやっただけでは、クォーテーションがうまくしょりされてないし、
バイナリをSQL文の中に書くことになって全然だめみたいです
519nobodyさん:04/02/16 22:47 ID:???
>>518
お客は、ってお金稼ぐような仕事をここで聞いていいのかよ、、、、
520nobodyさん:04/02/16 23:03 ID:???
クライアントの提案を2chでどうよって聞くヤツがあるか……
521nobodyさん:04/02/16 23:48 ID:???
>>518
俺普通にできてるよ。DBIは勝手にエスケープされるから注意な。
522nobodyさん:04/02/17 01:31 ID:???
grepなどでヒットした行にファイルポインタ?を持っていきたいのですが・・・
whileなどのループ文を使わないでできないでしょうか?
$line = (grep /^0123/, <FH>) [0]
523295:04/02/17 03:21 ID:???
>>496
有難う御座います。
ようやく「該当記事を読み込む」まで出来ました。
今度は「読み込んだ行を、新しく生成した行で上書きする」という作業なのですが、
@tmpdataの後ろに$line入れる、というのは分かったんですが、
@tmpdataって何が入ってるんですか?

foreach $line (@logs){
($id,$other) = split(/\,/,$line);
if($id == $num) {
$line = ("$num,$name,$ua,$value,$ip,$time,$res\n");# $lineに新しく変数に与えた配列を与える
push(@tmpdata,$line);
}else {
push(@tempdata,$line);
}
}

とやってみたんですが、修正をやると全ログが吹っ飛びます。
絶対根本的に勘違いしてますよね……。
524nobodyさん:04/02/17 03:29 ID:???
>>523

レスをよく読め。
>>498
>>503
525295:04/02/17 03:34 ID:???
>>524
あ、セミコロンだけだと思ってました。
こういう迂闊さが、エラーに繋がってるんですよね。
有難う御座います。がんばります。
526295:04/02/17 03:56 ID:???
>>496のやり方で、
「該当する行を特定」して、それを「それぞれの変数にいれ」て、
「修正用フォームの初期値」にして、というところまでできました。
このまま書き込み処理をすると、新規書き込みになってしまうので、

「該当する行を特定」(これは上記の方法でできますよね?)
して、その「行に上書き」をやりたいんですが、
自分自身の程度が低すぎて、(紹介いただいたリファレンスを読んでるんですが)
どういう処理を行えばいい、と仰られてるのかが把握できてないんです。
527nobodyさん:04/02/17 04:13 ID:???
>>526
少 し は 自 分 で 考 え ま し ょ う 。
528295:04/02/17 04:18 ID:???
>>527
頑張りますね。
529nobodyさん:04/02/17 04:27 ID:AZ62mJc8
>>522
while 使った方が簡単そう。

# matchしなかった場合は -1
my $pointer = ($_ = sub {
my ($fh, $regex) = @_;
my $pos = tell($fh);
return -1 if eof($fh);
return (readline($fh) =~ $regex) ? $pos : $_->(@_);
} -> (*FH, qr/^0123/);
seek(FH, $pointer, 0);

# match しなかった場合のpointerは、ファイル末尾
do { $pointer = tell(FH) } while (!eof(FH) and <FH> =~ qr/0123/);
530nobodyさん:04/02/17 05:01 ID:???
for (1 .. $a1) {
$hoge[$_] = splice (@data,$_,1);
}
こういう処理があって、$a1に何も入ってないときもあるんですが、
そのときにループを通らないでいいんですが、
ベンチとったところ以下のように、先に入ってるか判別した方が負荷が低いようです。
if ($a1) {
for (1 .. $a1) {
$hoge[$_] = splice (@data,$_,1);
}
}
そこで、以下のようにしてみたのですが、動きません
$a1 and for (1 .. $a1) {
$hoge[$_] = splice (@data,$_,1);
}
これは何故、またどのように書けばよいでしょうか?
531nobodyさん:04/02/17 06:12 ID:???
>>530
Q. 何故
A. for は制御構造であって式ではないから。
http://www.kt.rim.or.jp/%7ekbk/perl5.005/perlsyn.html

Q. どう書けば
A. if () { for ... } で我慢するか
$a1 and map { $hoge[$_] = splice @data, $_, 1 } 1 .. $a1;
のような行儀の悪いコードを書く。
532496:04/02/17 06:50 ID:???
おい、まだやってたのか!w 何か簡単な掲示板のスクリプトを見た方がいいのでは?

# $idにはフォームから送られた記事番号が、
# $new_XXXXにはフォームから送られた修正済みの内容が入ってるものとする
# (なので、連想配列$input{'hogehoge'}とか、好きに変えれ)。

foreach $line (@logs) {
 ($num,$name,$ua,$value,$ip,$time,$res) = split(/\,/,$line);
 if($id == $num) {
  $line = "$num,$name,$new_ua,$new_value,$new_ip,$new_time,$new_res\n";# $lineに新しい変数に基づく行を入れる
  push(@templogs,$line); # 修正済みのレスを一時配列に入れる
 }else {
  push(@templogs,$line); # 該当レス以外は何もせず一時配列に入れる
 }
}
↑これで修正済みの@templogsが出来ると思う。
後は@templogsをprintするとか、sortするとか、煮るなり焼くなり。@logは破棄。
533530:04/02/17 06:51 ID:???
>>531
丁寧なご解答、有難うございます。
理解できました
534nobodyさん:04/02/17 06:52 ID:???
 
535295:04/02/17 08:27 ID:???
>>532
重ね重ねすみません。本当に感謝しています。
記事番号の合致、修正時に生成された文字列、は上手くいってるんです(修正時の読み込んでるデータを書き出して、書き出せてることは確認してます)。
その生成された文字列を「元の場所に」で困難なんです。
ちょうど
> push(@templogs,$line);
の行のことなんですが、
「新しく生成された行」を「既存の行」に上書きするルーチンなんですか?
pushは「@templogsのあとに$lineを追加」という意味みたいですが、
@templogsが何を指してるのか、という次元で理解していないんです。
あとは、それを上書きさえ出来れば完成なんですが。

4月にperl初めて、いきなり掲示板を作ろう、ってのは無謀ですよねぇ。
536nobodyさん:04/02/17 09:07 ID:bkTGRGwk
質問させてください。
URLエンコードについてですが、UTF-8でエンコードするにはどうしたらいいでしょうか?
Googleでさがしてもぜんぜんヒットしないんです。

GoogleはUTF-8だし検索結果へ普通のリンクをはるときに困っています。
537nobodyさん:04/02/17 09:39 ID:???
>>535
@logs(ログ全部)の内容を@templogsにコピーする作業の中で
$id==$numの行だけは「古いものを使わないで新しいものと交換」してるわけ。

そうやって「必要なところを変更したログ一式」が@templogsに入ってるんだから
それをprintすればいいだけのこと。

”「新しく生成された行」を「既存の行」に上書きする”のも
”「新しく生成された行を含むログ一式」を「既存のログ一式」に上書きする”のも同じだろ。

なにか作りながらでもいいから
他人の書いたものを辞書と首っ引きで読むとかしてボキャブラリと読解力をつけなさい。
538295:04/02/17 09:46 ID:???
>>537
有難う御座います。あの部分は、
「@logs(ログ全部)の内容を@templogsにコピーする作業」なんですね。
今非常に酔っ払ってますので試行錯誤できませんが、後日必ず成し遂げて見せます。
本当に有難う御座いました。勉強しながら頑張ります。お世話ばかりかけて申し訳ありませんでした。
539532:04/02/17 10:03 ID:???
>>537
フォローさんくす。
レス書いてるうちに、フォローが来て、返事まで来ちゃったよ

>>536
↓のURL エンコード/デコードってやつじゃないかなぁ?
ttp://itbtech.itboost.co.jp/perl/perl_08.php
エンコードはやったことないけど。
540nobodyさん:04/02/17 10:09 ID:???
>>536
Googleの検索結果のURLなら、
実際に検索して、その結果のURLを貼ればいいじゃん? ダメ?
ttp://www.google.co.jp/search?q=%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C&ie=UTF-8&oe=UTF-8&hl=ja&lr=
541295:04/02/17 10:39 ID:???
>532

>537

>539

できました!完成しました!
大変感謝しております。
詰まってた理由はどうやら、「ファイルを開いて」読み込んで、書き込もうとしてた部分で、
一旦「読み込み用」で開いて読み込んで、閉じて、「書き込み用」で開いて書き込んで、閉じたら解決しました。
感謝です。有難う御座いました。
542529:04/02/17 10:41 ID:???
再帰版、もう少し短くできた。
やっぱり読み難いので、while使うのをお勧めするけど、
$pointer = ($_ = sub {
my ($pos , $fh, $match) = @_;
return (not eof($fh) and readline($fh) =~ $match)
? $pos : $_->(tell($fh), $fh, $match);
}) -> (tell(FH), *FH, qr/^0123/);
543nobodyさん:04/02/17 11:30 ID:???
質問よろしいでしょうか。
BBSのログの取り方についてなのですが、
フリーのBBSのソースを見ると、ログの区切り文字が<>となっているものが多いと思われます。
自分は\tを区切り文字としているのですが、<>が使われている頻度が高いということについて、何か理由があるのでしょうか?
544nobodyさん:04/02/17 11:45 ID:???
>>543
俺の周りは,(コンマ)が多い。
偶然だろ。
545nobodyさん:04/02/17 11:47 ID:???
>>543
Webブラウザからの入力内容をデコードする際に&lt; &gt;に一括変換することが多い。
だから、<と>は実質上入力できないから、区切り文字に使ってるんだと思う。
別に><でもいいわけだが。

あと、2ちゃんねるが<>を使ってるから。(←この影響は大きいと思う)
でも、オレは\tを使うけどね。
546544:04/02/17 11:48 ID:???
>>545
なるほど質問者じゃないが、目からうどん粉。
547nobodyさん:04/02/17 11:50 ID:???
>>545
いやいや、ken(ry
548nobodyさん:04/02/17 12:06 ID:???
>>547
なるほど。確かに2ちゃんねるのログ形式知ってる人がそんなに多いとも思えんな。
549nobodyさん:04/02/17 12:06 ID:???
俺は直接ログ見たとき見やすいから<>使ってるy
550529:04/02/17 12:14 ID:???
>>545
ログにHTMLを書き込む事もあるので、そう言った場合に>< とするのはまずいんじゃない?
<>は空タグなので通常のHTMLでは使われないけど、><だとタグが連続してる場合に困る事になる。

print LOG "$name<>$email<><hr /><p>$comment</p>\n"; # ok
print LOG "$name><$email><<hr /><p>$comment</p>\n"; # <p>タグの前がセパレータに解釈されてしまう

TABでも,でも事前にエスケープ等の処理をしないと駄目。
<>だと、まともなHTMLには現れる事がないのでエスケープ処理を省略出来る。
と言う事で、ログにHTMLを記録する場合に有効な方法だと思う。><>区切り

ちなみに、自分も\t派です。
551nobodyさん:04/02/17 12:28 ID:???
俺は\tかな。タブ区切りでExcelにデータ引っ張る事が多いから。
,(カンマ)だと小さいから見落とす事があるのよねー。
552nobodyさん:04/02/17 13:00 ID:???
>>542
一日考えたけど、こんなコード思いうかばなかった。
勉強なりました。
553nobodyさん:04/02/17 14:09 ID:???
requireについて質問です。
設定データ等のファイルをrequireする時、ある関数内でしかそのファイルを引用しなければ
関数内でそのファイルをrequireするのは作法としてOKでしょうか?
元々requireしているところからその関数を使うこともあるのですが…
554553:04/02/17 14:11 ID:???
うわ、なんか日本語が矛盾しちゃってますね…。
要は関数内でrequireしてしまうと呼び出しが複雑になってしまうので
それはアリなのかと言うことです。
555nobodyさん:04/02/17 14:27 ID:???
言ってることがうまく理解できないんだが、

#!/usr/local/bin/perl
require './jcode.pl';

sub main {
...
}

---------------------------------------

#!/usr/local/bin/perl

sub main {
require './jcode.pl';
...
}

どっちがいいかってこと?
556nobodyさん:04/02/17 14:31 ID:???
>>553-554
後で悩みたくなければ一番単純になるように作りなさい。
557553:04/02/17 14:34 ID:???
>>555
そういうことです。
下の場合は元々jcode.plを呼んでいるところに関数を呼び出す場合があるかなと。
そのファイル全体でjcode.plを使うような場合は迷い無く上の方法なのですが。

似たようなことでmy宣言もどこでやったものか悩みます。
先頭部分で一括してmy宣言するか、その都度宣言するか…。
558553:04/02/17 14:36 ID:???
>>556
ごもっとも…。
どうすれば単純になるのかケースバイケースなので判断が難しいですね。
559nobodyさん:04/02/17 14:49 ID:???
>>554
実験してみると良いよ。require は二度目は実行されない。
do だと二度目も実行され、関数が再定義されたり問題が起こる事がある。

560nobodyさん:04/02/17 15:58 ID:???
<>区切りは・・・確かKENTがそうだったような気が。
だから多いのかと思ってたわけだが。
561nobodyさん:04/02/17 22:23 ID:5JldbDcf
フォームタグにutnを付けるとDocomo端末のシリアル番号を取得することができますが
J-Phone(Vodafone)やau(EzWeb)で取得する方法というのはないでしょうか?
562nobodyさん:04/02/17 22:55 ID:???
>>561
俺はこのスレで扱う質問の範囲についてかなり寛大に捉えている人間なつもりだが
さすがにあんたのはスレ違いだと思う
563nobodyさん:04/02/17 23:22 ID:???
>>562
賢気に言わなくていい。
普通にスレ違いだから帰れ、でいい。
スレ違い野郎に気を使うことはない
564nobodyさん:04/02/18 00:00 ID:???
>>563はアホだとしても、>>562の問題意識は称賛に値すると思う。
565nobodyさん:04/02/18 00:20 ID:???
ttp://lriver.hp.infoseek.co.jp/works/swlist.html
このCgiのswform.cgiがうまく動かないんですけど、
誰か原因解明してくれる神様はいませんか?
自分じゃ到底無理です・・・
566nobodyさん:04/02/18 00:43 ID:???
>>530
evalかdoかsubでできるよ。
$a and do{
for (1 .. $a1) {
$hoge[$_] = splice (@data,$_,1);
}
};
# if推奨だろうけど。。

>>553
jcode.plを使わないことがあり、使わなければrequireしたくないなら、サブルーチン内でrequire。
でなければ、BEGINブロックか先頭あたりでrequire。
でいいんじゃない?
567nobodyさん:04/02/18 00:50 ID:???
>>562=>>564
自演乙
568!562 and !564:04/02/18 01:44 ID:???
>>567=>>563か。
569569:04/02/18 02:43 ID:???
そのようだな
570nobodyさん:04/02/18 02:55 ID:???
>>565
懐かしいなぁ。<CGI勉強し始めた動機がonline SW作成。
こう言うのは作者に尋ねるべきだと思うんだけど。

12行目 $retake = 0 <- セミコロン忘れ
で、とりあえずエラーは収まったよ。
137行目 if ($retake = 0) は == の typo っぽい。

Authorにも報告してあげよう。feedbackは任せた。
571nobodyさん:04/02/18 06:49 ID:???
>>570
スレ違いに回答はやめようや
キリないぜ
572nobodyさん:04/02/18 06:52 ID:???
>>565
>判らないことなどがあったら、メール、または掲示板にてお尋ねください。
って書いてあるだろうが。
作者に聞くのが筋だろ。
続きはそっちでやれよ。
573nobodyさん:04/02/18 11:48 ID:???
実は565が作者
574nobodyさん:04/02/18 12:08 ID:w3gtAc2I
リモートでユーザーエリアにモジュールをインストールしています。
MyConfig.pm を設定してCPANを使って問題なくインストールできているのですが、

あるモジュールで Test.pm がないから make test が通らずインストールできない、
といわれたので先に Test.pm をインストールしたのですが、その上で再度行っても
やっぱり @INC にTest.pm がないのでだめだ、とおこられました。

試しに、
use lib '/home/user_name/perl-lib';
って足してみたけどだめみたいで、何とかする方法はありませんか?

あと、サーバーにあるCPAN.pm が古いので新しくしたいのですが、
こいつを/home/user_name/perl-lib に入れて新しいの使う、
なんて事はできないんでしょうか?

すれ違いかもしれませんが、もしそうなら誘導して下さい。
575nobodyさん:04/02/18 12:25 ID:???
ここはコーディングのスレなのですが。
576574:04/02/18 12:31 ID:???
>>575
じゃ、「Perlモジュールについて」に移動します。
知ってたんですがあんまり動いてないようだったので。
失礼しました。
577nobodyさん:04/02/18 14:05 ID:???
動的なマルチメディアオンラインコンテンツっていうとFlashやShockWaveがあるけど
Perlはどこまでそれらに近づくことが出来るのだろう?とふと思った。
Perlでゲーム作ってるのだけど、やっぱりテキストベースのWebゲームが限界で(当然だが)
インタラクティブにしようとするとJavaScriptだの、他のものを混ぜなければいけない。

例えばオンラインで、マウスクリックのみでプレイできるオセロとかってPerlで作れるかな?
モジュールを使って盤面を画像ファイルで出力し、それらにリンクを張って指定、、、、とか。
Perlの限界はどこなのだろうか、と。
578nobodyさん:04/02/18 14:09 ID:???
そもそもレイヤー違うし。あとスレ違い。
579nobodyさん:04/02/18 15:51 ID:???
>>577
perl で ActiveX コントロール作ればいいじゃん。
flash や shockwave で不可能な処理までいじくれるぞ。

ActiveX を perl で作るための開発環境は、
Activestate の PerlDevKit とか
VisualStudio.NET + VisualPerl とか
いろいろある。

つまりだな、>>577 で言ってることは、「perlの限界」ではなく
「サーバサイドの限界」ということに他ならんのだ。
perl でなくても PHP でも Java Servlet でも、
サーバだけで動かしてる限りは同じ限界に直面する。
逆に perl でも、クライアントサイドで動かせば、
flash や shockwave と大差無くなるわけだ。

で、このスレは perl コーディングのスレなので、
「VisualPerl で StringBuilder オブジェクトに正規表現処理をかけたいんですが?」
とかそういう質問だったら歓迎される(たぶん)。
580nobodyさん:04/02/18 16:50 ID:97nPe/g9
Perl5で質問です。
001<>あいう<>3
002<>えおか<>2
003<>きくけ<>3
004<>こさし<>1
005<>すせそ<>2
といった配列データがあるときに、一番最後の 1〜3 の数字を参照して
降順並べなおすには、どうすれば良いんでしょうか?
581nobodyさん:04/02/18 17:12 ID:???
50000とか、数値データを 50,000 ってな感じにカンマを入れるのに簡単な方法は
ないでしょうか?
582574:04/02/18 17:23 ID:???
583nobodyさん:04/02/18 17:30 ID:???
>>581
printfとかsprintfだっていいし
584nobodyさん:04/02/18 18:31 ID:???
585581:04/02/18 18:44 ID:pwE4c3h3
うお、3人からもレスが。
ありがとです。

追加で質問なんですが、
require 'html_data.dat';

$text = 'hoge';

print "$html_data";

ってな感じで、 html_data.dat の中身は
$html_data = "<h1>$html_data</h1>";

ってなってます。これやると、$html_data に hoge が入らないで出力してしまいます。
どうすれば良いんでしょうか?
586nobodyさん:04/02/18 18:48 ID:???
なんかへんだぞ。"<h1>$text</h1>";?
587nobodyさん:04/02/18 20:40 ID:???
>>585
自分の質問をもう一度見直せ
588nobodyさん:04/02/18 20:56 ID:???
589nobodyさん:04/02/18 21:03 ID:FOUS2YU4
decoder.plの質問ここでしていいですか
配布元もう無いみたいなんで
590nobodyさん:04/02/18 21:39 ID:???
質問させてください。

BBSでも何でもいいんですが、管理者専用の管理メニューってあるじゃないですか。
そこへのログインはPOSTで行うのが普通だと思うんですけど、
管理メニューの中にも色々項目があったとして、
その中をフォームからsubmitしてページ遷移する時ってGETを使っている例が多いと思うんですが、
これって何か理由があるものなんですか?
管理画面まで全部POSTにするとQUERY_STRINGがアドレスバーに見えなくて、
不便になるからとかの理由なんですか?
591nobodyさん:04/02/18 21:42 ID:???
>>590
スレ違い

△▲ WebProg 初心者の質問 Part7 ▼▽
http://pc2.2ch.net/test/read.cgi/php/1073460282/
592590:04/02/18 21:43 ID:???
失礼しました。
593nobodyさん:04/02/18 22:29 ID:???
いろいろなソースを見ていたら
($accses{$ID}{'file'}) = substr($msg,6,6) =~ /(.*?)\000/;
のようなものを見つけたのですが、この
(変数) = 値;
みたいな形式はどういう意味なのでしょうか?
594nobodyさん:04/02/18 22:37 ID:???
@result= $string=~ /(hoge)/;

みたいな構図
595nobodyさん:04/02/18 22:45 ID:???
>>593
>>594の補足だが、
右辺の評価がスカラコンテキストと配列コンテキストで変わってくる場合に
()で括ってるかどうかの違いが重要になる。簡単な例だと

($x) = ('a','b','c');
 → $x には 'a' が入る (配列の1個目)

$x = ('a','b','c');
 → $x には 3 が入る (配列の要素数)
596593:04/02/18 23:18 ID:???
返答ありがとうございます。
ん〜と申し訳ありませんイマイチ理解のでもう一度質問させてください。
(変数) = 値;  の()は何を意味するものなのでしょうか?
@result= $string=~ /(hoge)/;  #@resultには文字列長か配列長のような数値が入る。

>>595
さんの補足して頂いたこともわかるのですが()が何を意味するのかがピンときません。
今私が知っている知識の中では()は優先的に評価されるものくらいに思っています。

($accses{$ID}{'file'}) = substr($msg,6,6) =~ /(.*?)\000/;
こうすることで$accses{$ID}{'file'}にはsubstrで切り出した文字列長が入ると言うことでしょうか?

なんと言うか質問の要点が纏まっていなくてすいません。要するに
($accses{$ID}{'file'}) = substr($msg,6,6) =~ /(.*?)\000/;

$accses{$ID}{'file'} = substr($msg,6,6) =~ /(.*?)\000/;
の場合$accses{$ID}{'file'}に入る値の違いみたいな感じです。
597nobodyさん:04/02/18 23:57 ID:???
Perl コンテキスト でgoogle検索して適当なページをじっくり読んでみれば
いいんじゃないのかな。
598nobodyさん:04/02/18 23:58 ID:BihWI3xE
>596
($accses{$ID}{'file'}) = substr($msg,6,6) =~ /(.*?)\000/;
substr($msg,6,6) =~ /(.*?)\000/の結果(文字列)が入る

$accses{$ID}{'file'} = substr($msg,6,6) =~ /(.*?)\000/;
数値(1)が入る
599nobodyさん:04/02/19 00:11 ID:???
>>596
この場合の () は、式の優先順位ではなく、配列を表す。
例えば、($a,$b,$c) = (7,8,9) だと、$aに7, $bに8, $cに9が入る。これが配列同士の代入。
じゃあ ($a) = (7,8,9) だとどうなる?
これも配列同士の代入で、余った後ろ二つが切り捨てられるので、$aには7が入る。

次、演算子の優先順位の話だが、
@a = $b =~ /regex/;
というケースだと、代入演算子 = よりもパターンマッチ演算子 =~ の方が
優先順位として高いので、$b =~ /regex/ が先に評価される。
つまりパターンマッチが行われる。
パターンマッチを評価した結果は
 スカラコンテキスト: true か false を返す
 配列コンテキスト: マッチした後方参照の配列を返す
この結果が、@a に代入されることになる。
「後方参照」てのが何なのかは google に聞いてくれ。

で、結論としては、>>598 の通りとなる。

別の例で説明すると、
$data = '7,8,9';
($a,$b,$c) = $data =~ /(\d+),(\d+),(\d+)/;
の時に、$aに7, $bに8, $cに9 が入る。
600nobodyさん:04/02/19 00:55 ID:???
split(/,/, $foo);
,で区切ることは出来るんですが、/で区切る場合はどうすればいいんですか?
601nobodyさん:04/02/19 00:58 ID:???
>>600
正規表現を勉強するのだ
602600:04/02/19 00:58 ID:???
区切り子変えたらいけました。
split('/', $foo);
603600:04/02/19 00:59 ID:???
>>601
さんくす。そういう手もありましたね。
なんか仕上げの段階で頭がパンクしてました。
604593:04/02/19 03:30 ID:???
>>579
>>598
>>599
あっなるほど!そういうことだったんですか。特に599さん、コーディングスレだというのに丁寧な説明ありがとうございます。
これで夜も眠れないで昼寝してしまうのは回避できそうです。
みなさんありがとうございました。
605nobodyさん:04/02/19 08:35 ID:???
>>599
593じゃないけど、勉強になりました。
606nobodyさん:04/02/19 18:17 ID:???
データベースのファイルロックについて質問です。
ファイルロック用の関数を用意して
sub Lock {
 unless( open(LOCK, "lockfile.lock") ){
  exit(1);
 }
  flock(LOCK, 2);
}

sub Unlock {
  close(LOCK);
}

このようにロックを行っているのですが
&Lock;
 #データベースから読み出し、書込み
&Unlock;

これで大丈夫でしょうか?
sleepを入れたりforで回したりしてチェックしてるのですが、
キチンと動いているか不安で。
607nobodyさん:04/02/19 18:19 ID:???
書き落としました。
使っているのは、MLDBMモジュールにBerkeley DBです。
608nobodyさん:04/02/19 18:42 ID:???
>>606-607
書込フラグが立っていないと flock() が効かない実装があったような
無かったような記憶があって、漏れは '>./lockfile.lock' にする事が多い。

ついでに。
http://perldoc.jp/docs/modules/DB_File-1.805/DB_File.pod
下の方。
609nobodyさん:04/02/19 18:59 ID:???
ま、こんなスレもある
【Perl】ファイルロック(排他処理)について語ろう
http://pc2.2ch.net/test/read.cgi/php/1024795138/
610nobodyさん:04/02/19 19:59 ID:???
ファイルを行単位で読み込んだ配列から、空行を削除したいんですけど、
$i = 0;
foreach $line ( @data ) {
if ( $line eq "\n" ) {
splice @data,$i,1;
}
$i++;
}
これだと駄目みたいです。どうしたらいいんでしょう。
611nobodyさん:04/02/19 20:02 ID:???
>>610
chmp @data;
@new_data = grep { $_ } @data;
612nobodyさん:04/02/19 20:16 ID:???
>>611
修正。
あれだと '0' の行がきえちゃうから。

chmp @data;
@new_data = grep { $_ ne ''} @data;
613nobodyさん:04/02/19 20:17 ID:???
ちなみに漏れならこうする。(つーか、こーゆーふーにしか出来ない・・・)

foreach (@data){
    chomp ;
    $_ or next ;
    @new_data = $_ ;
}
614nobodyさん:04/02/19 20:18 ID:???
> あれだと '0' の行がきえちゃうから。
あ! そっか・・・
615nobodyさん:04/02/19 20:20 ID:???
しかも間違ってるし・・・
push @new_data , $_ ;
吊ってくる
616nobodyさん:04/02/19 20:21 ID:???
>>613
push 忘れちゃだめ
617610:04/02/19 20:27 ID:???
あ〜、chompを使えばよかったんですか。
grepは初めて使いました。まだうまく使えてませんが、もう少し頑張ってみます。
618nobodyさん:04/02/20 03:01 ID:???
$ENV{'REMOTE_HOST'}が無効な鯖、ってあるんですか?
$ENV{'REMOTE_ADDR'}は取得できるんですが、$ENV{'REMOTE_HOST'}は空なんです。
619618:04/02/20 03:38 ID:???
gethostbyaddr使って解決しました。スレ汚しすみません。
620nobodyさん:04/02/20 09:07 ID:???
niftyの鯖とかだとgethostbyaddrは使えないね。
気をつけよう。
621618:04/02/20 09:09 ID:???
>>620
えー、てことはどっちも使えない、って鯖もあるわけですか?
うちは、$ENV{'REMOTE_HOST'}が無理でしたがgethostbyaddrでいけましたけど、
そういう奇特な状態ですとどうすればいいんでしょう。
622nobodyさん:04/02/20 09:33 ID:???
>>618-621
環境変数 REMOTE_HOST が定義されているか否かは
Web サーバの設定次第。負荷軽減の為に定義していない
サーバも多い。

それとは独立した設定で、負荷軽減やいたずら防止の為に
ネットワーク関係の関数やモジュールを使えなくしている
サーバもある。

両方が不可に設定されているサーバなら REMOTE_ADDR で
我慢するしかない。後者が可なら、IP アドレスからホスト名を
調べる関数 = gethostbyaddr を使って REMOTE_HOST と
同等の値を得る事はできる。

スレ違いの話なのでこれ以上は別のトコで。
623618:04/02/20 09:47 ID:???
>>622
いや、ちゃんと読んでよ。
「niftyの鯖とかだとgethostbyaddrは使えない」
 ↓
「どっちも使えない、って鯖もあるわけですか」
 ↓
「奇特な状態ですとどうすればいいんでしょう」

>調べる関数 = gethostbyaddr を使って REMOTE_HOST と
>同等の値を得る事はできる。
「niftyの鯖とかだとgethostbyaddrは使えない」

文盲が回答するのだけは勘弁してほしいよ。
624618:04/02/20 09:51 ID:???
「調べる関数 = gethostbyaddr を使って 」
文盲はあたしだ。
625618:04/02/20 09:52 ID:???
いや違う。
両方使えないのに、
「調べる関数 = gethostbyaddr を使って 」
ってのはやっぱおかしい。

文盲が回答するのだけは勘弁してほしいよ。
626nobodyさん:04/02/20 11:23 ID:???
配列について質問です。
ある配列の中に指定の数が入っているか確かめたいのですが
@foo = qw(1 11 111 1011 1234);
$check = 1;
@out = grep(/^($check)$/, @foo);
として、@outの要素数を調べると言う方法を考えました。
何となく綺麗でないし冗長な気がするのですが
もうすこし上手く書けないものでしょうか?
627nobodyさん:04/02/20 11:37 ID:???
>>625
621 >そういう奇特な状態(ENV及び関数無効)ですとどうすればいいんでしょう。
622 >両方が不可に設定されている(奇特な状態)サーバならREMOTE_ADDRで我慢するしかない。
>後者(関数)が可なら、gethostbyaddrを使って同等の値を得る事はできる。
~~~~~~~~~~~~~~~~~~~~~
アレ?

>>626
限界だと思う
$out = grep(/^($check)$/,@foo);
こっちのが好ましいか好ましくないか…
628nobodyさん:04/02/20 11:42 ID:???
$count = map {/$check/} @foo;
629nobodyさん:04/02/20 11:48 ID:???
630626:04/02/20 11:59 ID:???
やっぱり色々ありますね。奥が深いです。
参考になりました。
ありがとうございます。
631626:04/02/20 12:23 ID:???
やっぱり色々ありますね。奥が深いです。
参考になりました。
ありがとうございます。
632nobodyさん:04/02/20 12:27 ID:???
(;゚Д゚)< 20分も空けて連稿……
633nobodyさん:04/02/20 15:39 ID:???
数字なら
$out = grep $check == $_, @foo
でいいだろ。
634nobodyさん:04/02/20 16:24 ID:???
すんません。かなり初歩的な質問なんですが、
下のスクリプトは文法的にも、処理的にもあってますよね?
両方あったときに、両方あるときと片方あるときに両方入ったりはしないですよね?

if ( $AAA and $BBB ) {
# 両方あるとき
} elsif ( $AAA or $BBB ) {
# 片方あるとき
} else {
# どっちも無いとき
}

なんかふつーにやっててふと疑問に思った。
大丈夫だと思うんだけど。
635nobodyさん:04/02/20 16:54 ID:???
それで両方入ったらelsifの立つ瀬が無いだろう。
636634:04/02/20 17:02 ID:???
>>635
だよね。。w
すまんです。
でもスキーリした
637nobodyさん:04/02/20 17:47 ID:oxwyY0fI
decoder.plを使ったアップロードについて質問です
#-----------------CGI側-------------
#!/usr/bin/perl
require "./jcode.pl";
require "./decoder.pl";
#imgディレクトリにimgと言う名前で保存
&SaveFile("infinite","./img/","img");
#エラーメッセージ表示
print "Content-type: text/html\n\n";
print $fmsg;
exit;
#--------------ここまで--------------

html側
<html><body>
<FORM action="upbord.cgi"
method="POST" ENCTYPE="multipart/form-data">
<INPUT TYPE=FILE NAME=File>
<input type="submit" value="OK">
</FORM>
</body></html>

これだと、エラーメッセージは出ないのにアップロードできません
どこに不都合があるのか見当がつかないので
どなたかアドバイス宜しくお願いします
638nobodyさん:04/02/20 20:55 ID:???
>>637
スレッドタイトルを声にして最低10回は叫んでみよう。
639nobodyさん:04/02/20 21:16 ID:???
その decoder.pl というのを見てやろうと思ったのだが、

だめだ、
local 使ってたり、関数の入出力をグローバル変数で渡すようなスクリプトは、
俺では歯が立たん。すまん。
640nobodyさん:04/02/21 00:18 ID:???
Win32Apache2+ActivePerl5という環境です。
スクリプトはEUC-JPで書いているのですが、
CGIの出力文字コードがShift_JISになってしまいます。

原因はどのへんでしょうか?
641nobodyさん:04/02/21 00:35 ID:???
何か文字操作周辺のソースでも書いてみれ。
jcode'convertに放り込むのじゃダメなん?
642nobodyさん:04/02/21 00:37 ID:???
>>637
Winで標準入力からバイナリ受けるなら、
binmode STDIN が必須
643nobodyさん:04/02/21 00:42 ID:???
print "Content-type: text/html;Charset=euc-jp;\n\n";
とすることで解決しました。
ただ、PHPでは設定ファイル(php.ini)で一括して出力文字コードを設定できますが、
Perlではそのようなことは無理なんでしょうか?
644nobodyさん:04/02/21 00:47 ID:???
>>643
ソースやテンプレートをShift-JISで書けばShift-JISになる。
EUC-JPで書けばEUC-JPになる。当たり前のこと。

ヘッダーに文字コードを指定するのは言語でなくてHTTP仕様の範疇。
あるいは<meta>で文字コードを指定するのはHTML仕様の範疇。
そしてそれらを解釈するブラウザの範疇でもある。

言語に過剰な期待をしてないか?
645643:04/02/21 00:56 ID:???
>>644
スクリプトは確かにEUCで書いています。
今わかったんですが、出力は確かにEUCでした。
しかしブラウザが誤認してShift_JISに切り替えてしまいます。
metaにはもちろんeuc-jp書いてありますし、<!--美乳-->や<!--京-->とかでも効果無しでした。
646nobodyさん:04/02/21 01:32 ID:???
>>645
ApacheのAddDefaultCharsetがShift_JISになってるとか。
ってもうperlのコーディングの話じゃないね。
647nobodyさん:04/02/21 03:45 ID:???
0をカンマ区切りで$num個ファイルに書き出したいのですが、
どのようにするのがいいか浮かびません。
一応以下で可能なのですが、もっといい方法ありますか?
join ",", map 0,(1..$num);
648nobodyさん:04/02/21 03:48 ID:???
>>647
chop(my $str = "0," x $num);
649643:04/02/21 03:52 ID:???
>>646
それだぁ〜!ありがとうございました。
650647:04/02/21 04:04 ID:???
>>648
全然早いですねぇありがトンでした。

---------------------------------
$num = 2;
use Benchmark;
timethese (1000000,{TEST1 => "&test1",TEST2 => "&test2"});

sub test1 {
chop (my $str = "0," x $num);
#print $str."\n";
}
sub test2 {
my $str = join ",",map 0,(1..$num);
#print $str."\n";
}
---------------------------------
Benchmark: timing 1000000 iterations of TEST1, TEST2...
TEST1: 3 wallclock secs ( 2.34 usr + 0.01 sys = 2.35 CPU) @ 424989.38/s (n=1000000)
TEST2: 17 wallclock secs (13.00 usr + 0.05 sys = 13.05 CPU) @ 76645.97/s (n=1000000)
651nobodyさん:04/02/21 15:09 ID:???
$ref->{'HOGE'}->{'HOGE'}->{'HOGE'}

これくらい階層があるリファレンスって負荷とかひどいですか?
やらないほうがいいですか?
652nobodyさん:04/02/21 16:30 ID:???
質問です。
スクリプトの処理時間を計るものを書いたのですが、
正確な時間が表示されずに、たまに0.000秒などと表示されることがあります。
下記のように書いているのですが、何かまずい部分ってありますか?

#  計算時間測定開始(処理の最初に記述)
$CPU_start = (times)[0];

#  計算時間測定終了(終了部分、HTML出力部分に書く)
$CPU_end = (times)[0];
printf ("<DIV align=right>消費時間: %.3f CPU秒</DIV>\n", $CPU_end - $CPU_start);
653nobodyさん:04/02/21 17:00 ID:???
>>651
各ハッシュがO(1)だから、N階層の時はO(N)です。問題なし。
654nobodyさん:04/02/21 17:28 ID:???
>>652
use Benchmark;
655nobodyさん:04/02/21 21:08 ID:???
今のPerlはstrict.pmや-wスイッチを通るスクリプトを書け、
OOPを理解しモジュールを作れるようになって半人前、
更に汚染チェックを理解できてギリギリ一人前っす(´・ω・`)
656nobodyさん:04/02/21 21:23 ID:???
OOP化すると、負荷がやはりそれなりにかかるな。

use Crap qw(croak); しただけでもそれなりに負荷かかる
657nobodyさん:04/02/21 21:26 ID:???
ごめん655の板違いどころかサイト違いした……

因みにこれ少し前に会社でウチにPerl教えてくれた人の言葉っす。

658nobodyさん:04/02/21 21:58 ID:???
>>653
O(N)だから大丈夫というのは的外れなんじゃないか?
O(1)やO(N)がO(N*N)より遅くなることは当然あるんだから。

>>652
処理に掛かった時間が0.001秒未満ならそうなるが。
659nobodyさん:04/02/21 22:22 ID:/lsq+4++
#!C:/Perl/bin/perl

$personal{'name'}='高橋';
$personal{'age'}='18';

print "content-type:text/html\n\n";
print "<html>\n";
print "<body>\n";
print "%personal\n";
print "</body>\n";
print "</html>\n";

exit;

これだとただ%personalとだけ表示されます。
なぜですか?
660247:04/02/21 22:41 ID:???
ハッシュは展開されんから
661nobodyさん:04/02/21 22:55 ID:???
質問だ。
perlは3日位前から始めたからまだ何もわからない状態だ。
一応perlの本を買って勉強を始めたわけなんだけども、本に書いてある
とおりにcgiを作っても実際にブラウザで表示したときに反映されない。
制御文についての質問なんだけどもif文を使ってみたいのだが、

#!/usr/locl/cgi-bin/perl
print "Content-type: text/html\n\n";

print "年齢を入力してください。\n";
$age = <STDIN>;
chomp $age;
if ($age<20)
{
print "お酒は二十歳を過ぎてからだぞ。\n";
}
という条件分岐のCGIを作ってみたんだが、ブラウザで見たときに
全く反映されない。どなたかこんな稚拙な質問にも親身に答えてくださる
方がいたら解答願います。
ちなみに当方の環境はWindowsXP pro PerlはActivePerlをインストールしてます。
662nobodyさん:04/02/21 22:56 ID:???
>>655
サイト違いかも知れんが、否定する材料のない文だ。
がんばるべえ。
663nobodyさん:04/02/21 23:01 ID:???
>>661
>>1を100回声を出して読め。
そして、コーディングで困る事ができるようになってから来い。
664nobodyさん:04/02/21 23:02 ID:???
>>661
取りあえずSTDINにコンソールは割り付けられていない。
665nobodyさん:04/02/21 23:02 ID:???
>>661
<STDIN>は標準入力だぞ。
ブラウザ使いたかったんなら、フォームから値を投げる。
DOSプロンプト使うなら動くぞ。
666661:04/02/21 23:08 ID:???
>>663
すまん俺も今スレ違いだということがわかった。
「コーディング」の意味すらわからんのにこんなとこで
聞いてしまった。
>>664
ありがとうコンソールという言葉がわからないから具具って見る。
>>665
ありがとう。
確かにcgiを直接ダブルクリックしたらちゃんと動いた。
フォームからの値の投げ方をちょっと教えてほしいが
ずうずうしすぎるのでここは引こう。とりあえずなぜ
実行できないかはわかったありがとう。もう少し勉強してから
またきます。
667aishin:04/02/21 23:13 ID:V/k5Z5ps
質問させてください。

***********.ac.jp

というIPは、漏れなく学校だと聞いたことがあります。
そのIP(ホスト)をIP検索に掛けた場合、学校名まで出てきますか?

以前自分のホムペが嵐に遭いまして、嵐のIPがac.jpだったんです。
ログを保存していなかったので、実際に検索して確かめることが出来ません。
教えてください。よろしくおねがいします
668nobodyさん:04/02/21 23:14 ID:???
>>665
POSTのデータがSTDINから流れてくるのはどう説明するのか。
サーバの中の人がかたかたキーボードを打っているのかと。
669nobodyさん:04/02/21 23:15 ID:???
>>667
さっさとやれば良かろう。
670661:04/02/21 23:16 ID:???
フォームというのはHTMLのタグのことだろうか?
今手元の本を見ながらとりあえずこんなのを作ってみたのだが。
<html>
<head>
<title>お酒は20歳になってから</title>
</head>
<body>
<p>
<font size=4 color="lightseagreen">年齢はいくつですか?</font>
</p>
<from action="cgi\nennrei test.cgi" method="post">

<p>
<textarea name="toshi" rows="5" cols="50"></textarea>
</p>
<p>
お客様の年齢<input type="text" name="age" value="B-"><br>
</p>

<p>
<input type="submit" value="送信">
<input type="reset" value="リセット">
</p>
</form>

と本を片手にまねして作ってみたのだが、やはりブラウザでは
反応がない。こういった質問はどこのスレですればいいんだろうか?

671aishin:04/02/21 23:17 ID:V/k5Z5ps
>>669
そのIPはもう保存していないので、検索することが出来ないのです。
教えてください。お願いします。
672661:04/02/21 23:18 ID:???
ここは引こうとかいってたのについ書いてしまった。
上の質問は無視してください。
673nobodyさん:04/02/21 23:23 ID:???
>>671
実際にどっかの大学のページに行って試してみれば?
そのページのURIでWhoisして実際にその大学名が出てくれば君の探してたホスト名
のドメインも同じ結果になるんじゃないの。
674nobodyさん:04/02/21 23:24 ID:???
>>668
細かいとこで揚げ足取るんじゃね。
少なくとも>>661のソースにはPOSTだかGETだかのデータ受け取る部分何も書いてないからそう言った訳で。
あぁ、俺釣られすぎですか。
675nobodyさん:04/02/21 23:25 ID:???
>>671
今やってみたら学校名まで出てきた。
でも君がログを保存してないならもはやどうしようもないと
思うが。
676nobodyさん:04/02/21 23:31 ID:???
スレ違いだという話をした直後にスレ違いどころか板違いの質問が来るってのはネタとしか思えんのだが。
677aishin:04/02/21 23:33 ID:V/k5Z5ps
お返事ありがとうございました。
実は嵐にあう直前、学生である知人と多少揉め事がありまして。
それで「もしかしたら?」と思ったのです。
IPから学校名が出ると知り、なんとなく安心しました。
別に今後また嵐が来たからといって晒そうだとか、そんなつもりは微塵も無いのですが。

本当にありがとうございました。
678nobodyさん:04/02/21 23:42 ID:???
串の可能性も大いにありうるぞ。特に嵐ならなおさら。
679nobodyさん:04/02/21 23:58 ID:???
4桁の数字を作るのですが、
$num = "0001";
$num = $num + 1;
とすると、 $num は当然 2 になってしまいます。(0002にしたい)
どうゆう風にすれば、簡単に4桁を保ってくれるんでしょうか?
680247:04/02/21 23:59 ID:???
$num++;
681nobodyさん:04/02/22 00:03 ID:???
>>679
$num = "1";
if($num<1000){
$num="000$num";
}

10ってやったら5ケタになるけど。
適当に調整汁。
682nobodyさん:04/02/22 00:07 ID:???
>>679
printf("%04d\n", $num);
sprintf("%04d\n", $num);
683nobodyさん:04/02/22 00:12 ID:???
$num = sprintf "%04d", ++$num;
684nobodyさん:04/02/22 01:11 ID:???
sprintfも知らん香具師が教えようと思うな
685nobodyさん:04/02/22 01:14 ID:???
>>684
鬼の首を取ったところ悪いが、おもろいなお前、
686nobodyさん:04/02/22 01:19 ID:???
>>679
$num = 10001;
...
$num++;
...
substr("$num", 1);
687nobodyさん:04/02/22 01:39 ID:???
C出身の俺にとって、sprintfがそのまま出力できないってのが、なんか気分悪いな
いちいち変数に入れてるってのが、なんか、変な気分
688nobodyさん:04/02/22 01:45 ID:???
>>684
今初めてsprintfを知って調子づいたのかな?
689nobodyさん:04/02/22 01:48 ID:???
>>687
printfと勘違いしてないか?

printf:標準出力に
sprintf:変数に
fprintf:ファイルポインタに
690nobodyさん:04/02/22 02:32 ID:???
>>687の出身のCはいったいどんなのだろう
691nobodyさん:04/02/22 02:42 ID:???
千葉かな?
692nobodyさん:04/02/22 03:26 ID:???
誰か >>674 に標準入力の意味を教えてあげてください。
693nobodyさん:04/02/22 03:34 ID:???
(´-`).。oO(どうして>>692が自分で教えてあげないんだろう…)
694nobodyさん:04/02/22 03:49 ID:???
ああ、糞Perlにもprintfあるんね。
695nobodyさん:04/02/22 09:05 ID:???
>>694
いや、君がsprintfを知らないというのが問題なのですよ。
696nobodyさん:04/02/22 12:14 ID:???
headerってサブルーチンをちゃんと定義してるのにそれを呼び出してる行で
Undefined subroutine &main::header called at c:\mysites\hoge\admin.cgi line 75.
と、エラーをはくんですが、これはバグですか?
いや、その定義してある"sub header {"から"}"までを
全く同じものを直後にもう一つコピペすると動くんです。
(しかし上のものを削除したら動かず)
以前もこんなことがあって原因わからず、もう一度一から組み直した記憶があるんですが。
何か考えられる原因がわかるかた教えて下さい。
697nobodyさん:04/02/22 12:22 ID:5rbO7Je3
文字コードの判別がうまくいきません。
以下のようなコードを書いてみたのですが
$bufの値によってうまくいったりエラーになったりします。
-----
use Encode qw/ from_to /;
use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /;

my $buf = "これはテストです。";
my $enc = guess_encoding( $buf);
print $enc->name;
-----
例えばコード
my $buf = "これはテストです。";
だとうまくいくのですが
my $buf = "テスト";
だとエラーになります。

> Can't locate object method "name" via package "shiftjis or euc-jp" (perhaps you
> forgot to load "shiftjis or euc-jp"?) at ./test.pl line 10.

どういうことなのでしょうか?
使ってるperlはactiveperl 5.8.2です。
698nobodyさん:04/02/22 12:25 ID:???
>>696
sub header { の前でなにかヘンなことになってるんじゃないの?
699nobodyさん:04/02/22 13:05 ID:???
>696
明らかにバグですね。
あなたのプログラムの。
700nobodyさん:04/02/22 13:06 ID:???
>>697
jcode.pl の gedcord 使ったら?

参考
http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-1
701nobodyさん:04/02/22 13:07 ID:???
>>697
jcodeのgetcordでいいんじゃ?
702nobodyさん:04/02/22 13:11 ID:???
>>695
sprintfは知っていたがprintfはしらなんだ
703nobodyさん:04/02/22 13:17 ID:???
Perl使いにしては重箱の隅を突きすぎ
もっと大らかにあろうぜ、兄弟よ
704nobodyさん:04/02/22 13:21 ID:???
あきらかにバグでした・・私の。
何度も見直したつもりだったんですが、
headerルーチンがおかしいんだとそこばっかり見てました。
原因はその前の定義されてるルーチン内でprint <<EOD;を閉じてませんでした。
perlさんApacheさんすいませんでした。もう疑いません。許してください。
705nobodyさん:04/02/22 14:59 ID:???
>>704

今度から「あれ?」と思ったら
「ごめんなさい、降参です、すんませんでした」と
声に出して謝ってから見直してみるといいよ。

↑嘘みたいだが効果ある。部屋での探し物の時も俺はいつもやってます。
706nobodyさん:04/02/22 15:02 ID:???
>>705
やれやれ。
そんなのは個人個人で違うっつーの
自分流を人に押し付けても意味ない
707nobodyさん:04/02/22 15:37 ID:???
妙な流れのインターネッツですね。
708nobodyさん:04/02/22 16:18 ID:???
EUC-JPの"テスト"はShift_JISの"・ニ・ケ・ネ"に相当する。
で、判別がつかないから、"shiftjis or euc-jp"という文字列が返ってくる。
もちろんnameメソッドは呼び出せない。
709nobodyさん:04/02/22 16:37 ID:???
改行を制限しようと思い、下記のようにしたのですが、
$lf = $FORM{'mes'} =~ tr/\r//;
これだと、本文中の\rが削除されないので
置き換えをもう一度しなくてはいけないですが、
スマートにする方法は無いでしょうか?
710nobodyさん:04/02/22 16:39 ID:???
>>709
俺ならもう一回やる。
711nobodyさん:04/02/22 16:47 ID:???
やはり予め<br>に変換した物をsで置き換えるより、
2回trを使った方が良いみたいですね。
昔どこかでwhileを使ったやり方を見たのですが、あれはどうなのでしょうか?
712nobodyさん:04/02/22 17:04 ID:???
foreach (@AA) {
$count++ while $temp =~/\Q$_\E/g;

if ($count >= $aachk) {
$flag = 1;
last;
}
}
どっかのAAチェックと勘違いしてました。すみません(;´Д`)
713nobodyさん:04/02/22 17:05 ID:???

名前
紅堂幹人 /祁答院命 年齢
18
性別
男 結婚歴
独身で募集中
住所
日本 北海道 電脳街

職業
創作総合支援ElDorado Project総責任者

その他の情報...
[email protected]
714nobodyさん:04/02/22 18:47 ID:???
>>709
$lf = $d =~ tr/\r//d;
削るだけならこんなんでいいんじゃない?
でも、違うっぽい。

# 蛇足だけど\rってcarriage returnでは。
715nobodyさん:04/02/22 18:51 ID:???
>>714
macなんでしょう。
716nobodyさん:04/02/22 18:57 ID:???
@hoge = (一郎、次郎、三郎、四郎、五郎);

@hoge1 = (一郎、次郎、三郎);
@hoge2 = (四郎、五郎);

@hoge = (一郎、次郎、三郎、四郎);

@hoge1 = (一郎、次郎);
@hoge2 = (三郎、四郎);

のように分けるにはどうしたらいいのでしょうか?
717nobodyさん:04/02/22 19:10 ID:???
@hoge1 = $hoge[0..1];
@hoge2 = $hoge[2..3];
718nobodyさん:04/02/22 19:52 ID:???
>>717
@hogeの中身がわからない場合のやりかたが分からないんです。
719nobodyさん:04/02/22 20:01 ID:???
@hoge1 = @hoge[0..@hoge / 2];
@hoge2 = @hoge[@hoge / 2 + 1..@hoge];

きっちりした性格の人なら、
@hoge2 = @hoge[@hoge / 2 + 1..@hoge - (@hoge / 2)];
とした方が良いかも知れない。


720nobodyさん:04/02/22 20:02 ID:???
>>719
ごめん、offset,lengthじゃないから下3行は忘れて。

後、
@hoge2 = @hoge[@hoge / 2 + 1..@hoge - 1];
が本当の正解
721nobodyさん:04/02/22 20:09 ID:???
ありがとうございましす
722nobodyさん:04/02/22 20:11 ID:???
>>658
何を言ってるんだ?話ずれてるよ。

>>651はたかだかN=3だぞ。しかもO(N)だ。

たとえば、O(N^(N^N))とかだとN=3でも非常にまずい。
でもO(N)なんだから問題ない。そういう話だ。
723nobodyさん:04/02/22 20:29 ID:???
今さら釣られてる人がいるのは気のせいじゃないよね。
724nobodyさん:04/02/22 22:35 ID:???
>>706
「ないないの神様ないないの神様……」は駄目か?
人それぞれかも知れんが、そういうのは一般化していくものではないかと思ったりする。
725nobodyさん:04/02/22 23:15 ID:zz0SgufJ
カウンタでやるみたいなgif画像の連結で、
UNISYNの特許にふれてなく、
なおかつ、とほほさんのとこにあるような1文字ずつじょじょにでてくるタイプではないものって、
つくること可能ですか?(あるいはそういうライブラリすでにありますか?)
726nobodyさん:04/02/22 23:18 ID:???
UNISYS?
あの特許ってもう期限切れなんじゃなかったっけ?
俺違うこと話してる?
727nobodyさん:04/02/22 23:22 ID:???
>>726
海外ではね。
728nobodyさん:04/02/22 23:26 ID:???
>>725
Image-Magickとか、GDとか使え。
それでPNGで出力すればUNISYSにも頭下げなくていい。
数字だけ使う(2バイト文字を使わない)のなら、それで充分だろ。
729nobodyさん:04/02/22 23:32 ID:???
>>724 ×
730nobodyさん:04/02/23 00:51 ID:jeFmfteA
関数を文字列の中に直接展開することはできないのでしょうか?
シェルスクリプトでいうところの
echo `pwd`
みたいなことです。
731nobodyさん:04/02/23 00:55 ID:jeFmfteA
○echo "current directory is `pwd`."
×echo `pwd`
732nobodyさん:04/02/23 01:18 ID:???
733nobodyさん:04/02/23 03:35 ID:JILkvXUz
aaa.cgi?id=1
-----------------
use CGI;

my $pt_get = CGI::new();
my $str_get = $pt_get->param('id');
-----------------

外部からの引数を使いたいと思っているんですが、
たとえばいたずらで
-----------------
aaa.cgi?id=ももも
-----------------
とか、
-----------------
aaa.cgi
-----------------
とかやられた場合の対象方法とは、どのような物があるんでしょうか。

IsNumericの様な関数は無いみたいですし、
if ($str_get =~ /^\d/) {$str_get = 1;}(これでは全然駄目なようです)
また、そもそも引数が削られていた場合には、スクリプトが止まってしまいます。
引数が存在するかどうかを調べる方法は、あるのでしょうか?
734nobodyさん:04/02/23 04:29 ID:???
>733
データが破壊されないように、漏れてはいけない情報が漏れないように、だけ気を付ければいい。
正常な使い方をしない奴が困ったとしても自業自得なので無視。
スクリプトが止まるってのはクライアント側から見ての話だろ?
鯖側で暴走してなきゃ気にするな。

id=hogeってエントリがないなら$str_getは空。
空文字列には「数字以外の文字」は1つも入ってないので、駄目なのも当然。

つか、そのidを実際に使うところでエラー検知すれば?
その方が万倍簡単だと思う。
735nobodyさん:04/02/23 05:20 ID:R/+MOuJ2
@hogeのデータの3番目までを@fooに代入というのは下のようにできるのですが、
@foo = @hoge[0 .. 4];
なかに数字のデータが入ってて、それぞれにMBと単位をつけたものをfooに入れたいのですが、
上のソースに足す形で実現できないでしょうか?
@foo = @hoge[0 .. 4]."MB";
とだめもとでやってみましたが、やっぱりダメでした。

と書いてる間に下のようなコードが浮かんでテストしてみたんですが、
こういうのがベストですかね?
@foo = map ($_."MB",@hoge[0 .. 4]);
736nobodyさん:04/02/23 07:30 ID:???
>>714
改行=ラインフィードって思って適当に付けた変数でした。
そうでしたね(;´Д`)

何故か消えないと思ったら引数が足りてなかったんですね…
今度からもっと良く調べ留ようにします。
737nobodyさん:04/02/23 09:53 ID:???
>>735
いいんじゃね?
気になるなら、他の方法を考えてみて、benchmarkとってみるがよろし。
俺は、mapだのgrepだの使うときは、
@foo = map { $_.'MB' } @hoge[0..4];
みたいにする。{}で式の部分を明確にしておくと、後々のメンテナンス性が……と思ってるから。
ついでに言えば、極力ダブルクォートを使わずにシングルクォートを使う。
ダブルクォートの場合、中が展開できなくても展開チェックをする分、
シングルクォートよりも(ごくごく微妙に)遅くなるから。
ま、おまじないだけどさ。
738nobodyさん:04/02/23 11:09 ID:???
すいません、質問いいでしょうか。
ファイルが存在するかを調べるのに
if (-e $log) {
と書いているんですが、
これと逆の条件(ファイルが存在しないか)を判断する場合の書き方は
if (!-e $log) {
でいいのですか?
739nobodyさん:04/02/23 11:19 ID:???
いいよ。 unless (-e $log)でもいいし
740738:04/02/23 12:02 ID:???
>>739
ご丁寧に有難うございます。
741738:04/02/23 13:00 ID:???
ファイル存在判定について書かれてるんで、
便乗して質問。
-eで存在判定とか、-sでファイルサイズ取得っていうのはUNIXの機能でいいのですよね。
そうすると、Win系でPerl走らせてファイル存在判定やファイルサイズ取得っていうのは出来ないんですか?
742738:04/02/23 13:06 ID:???
補足です。
WinでPerl入れてファイル存在やらの判定で-eや-sを使ってるんですが、
普通に動くのでとまどってます。
それとも、UNIXとかの機能じゃなくて、Perlのコマンドというか関数みたいなものなんですか?
743738:04/02/23 13:07 ID:???
よく考えたらスレ違いですね。
スレ汚し失礼しました。
744nobodyさん:04/02/23 13:18 ID:???
>>738
ファイルテスト演算子はWindozeでも使える。
ちゃんとしたperlのリファレンスを読めよ。システム依存のものはちゃんとそう書いてあるから。
745nobodyさん:04/02/23 14:31 ID:???
>>744
win---sと記述するのが正しい。
746nobodyさん:04/02/23 14:41 ID:???
ちゃんとしたperlのリファレンスってどこにある?
747ヽ(´ー`)ノ:04/02/23 14:46 ID:???
man perldoc

ActivePerl でもマニュアル同梱されてるんじゃないの?
使ったことねーから知らないが。
748nobodyさん:04/02/23 18:03 ID:???
perldoc perlfunc

あたりでどうよ。確認してないがな。
749nobodyさん:04/02/23 18:23 ID:???
確認してから物を言え
750nobodyさん:04/02/23 20:31 ID:???
確認してみた。
何やらわらわら出てきたけど、結構便利かも。
751nobodyさん:04/02/23 22:31 ID:???
cronの実行ユーザをrootにしてたら、cronで起動されるcgiもroot権限で実行できるんですか?
752nobodyさん:04/02/23 22:36 ID:???
753nobodyさん:04/02/23 23:14 ID:???
>>751
cronで起動されるPerlスクリプトはCGIとは無関係
754754:04/02/23 23:28 ID:1QcE5wdS
$lines[$i] = "<p>aaaa</p><div>bbb</div><p>ccc</p>";
としているときに、<p></p>で囲まれた部分だけを抜き出したいのですが、

if ($lines[$i] =~ /<p>(.*)<\/p>/) {$p[$i]=$1;}
とすると最初に出てくる<p></p>で囲まれた部分しか抜き出せません。
すべて抜き出すにはどうしたら良いのでしょうか?お願いします。
755nobodyさん:04/02/23 23:36 ID:???
置換するときのオプション調べれ。
例;
$value =~ s/&/\&\;/g;
756754:04/02/24 00:40 ID:m+Kyz79R
なるほど、
if ($lines[$i] =~ /<p>(.*)<\/p>/g) {$p[$i]=$1$2;}
とすれば良いのですね
757nobodyさん:04/02/24 01:20 ID:T6QliHEz
初心者ですが、LinuxサーバでCGIの勉強をしているものです。
Perlでopenを使ってファイルを読み出し、画面表示したいのですが
絶対パスで指定しているのにファイルを開けません。
開きたいファイルも/var/www/cgi-bin/と同じようにCGIが使えるディレクトリ
じゃないといけないのでしょうか
758nobodyさん:04/02/24 01:34 ID:???
759nobodyさん:04/02/24 11:08 ID:QX0SjnDC
なんかよく聞くんですがWeb分野でのPerlって
もう時代遅れで終わってるんですか?
760nobodyさん:04/02/24 11:18 ID:???
>>759
コーディング以外の質問はスレ違い
761nobodyさん:04/02/24 11:22 ID:???
以上、釣り堀からでした。
762nobodyさん:04/02/24 11:22 ID:???
>>759
無理やりコーディングの質問にこじつけて答えると、
jcode.pl やら cgi-lib.pl やらはもう時代遅れで終わってると思うのだが
まあこれがないと困る環境もまだ多いのだろうな
763nobodyさん:04/02/24 12:43 ID:9cR3T++G
CGIで出力されるページ(HTML)にも、他のページと同様の外部.cssを
適用したいのですが可能でしょうか?出来ればその構文も教えて
頂きたいのですが。
764nobodyさん:04/02/24 13:02 ID:???
>>763
激しくスレ違いだが、可能。特別な構文などない
765763:04/02/24 13:20 ID:9cR3T++G
PRINT "<link rel"contents" href"xxx.css">";
で、良いんですかね?
766nobodyさん:04/02/24 13:51 ID:???
>>765
printでダブルクォーテーションを使うのであれば、HTML内のダブルクォーテーションはエスケープしろよ。
ヒアドキュメントで書くのもありかと。
767763:04/02/24 14:07 ID:9cR3T++G
PRINT '<link rel="contents" href="xxx.css">';
って事ですか?
768nobodyさん:04/02/24 14:07 ID:b1UF8qtA
>>766
> >>765
> printでダブルクォーテーションを使うのであれば、HTML内のダブルクォーテーションはエスケープしろよ。
> ヒアドキュメントで書くのもありかと。

おれならHTML::Template
だってCGIなんてHTML吐き出しがほとんどなんだもん。
769nobodyさん:04/02/24 14:14 ID:???
HTML::Template使えない鯖もあるのが大問題だ……。
Template.pm内では

use integer
use strict
use Carp
use File::Spec

ってなってるけど、これ全部PUTすればモジュール使用不可な鯖でも
使えるようになるんだろうか。
770nobodyさん:04/02/24 14:18 ID:???
>>768
俺の鯖モジュールNGだから、ヒアドキュメントの嵐なのです。
その発想に至らずスマソ。
771nobodyさん:04/02/24 14:22 ID:???
テンプレートくらい自分で適当に作れば良いやとか言ってみる。
772ヽ(´ー`)ノ:04/02/24 14:31 ID:???
>>768
少なくとも 5.8.x だと全部標準添付だな。
773nobodyさん:04/02/24 15:15 ID:???
>>769
> HTML::Template使えない鯖もあるのが大問題だ……。
> Template.pm内では
>
> use integer
> use strict
> use Carp
> use File::Spec
>
> ってなってるけど、これ全部PUTすればモジュール使用不可な鯖でも
> 使えるようになるんだろうか。
>
モジュール使用不可な鯖ってなに?
モジュール使用不可な鯖って自作.pmも置いてもuseできないサーバって事?
モジュール使用不可な鯖ってプラグマモジュールも使えないサーバって事?
ならPUTしてもだめなんじゃない。てかそんなサーバあるの?

ちなみにおれっちレンタルサーバはversion 5.004_04だけど
HTML::Templateの2.2がはいってた。
おれっちはtelnetでCPAN使って新しいの/home/usr以下にインストールして
使ってるけど。
でもPerlが古くてだめなのは手元のテスト機にインストールして、
そんままPUTして使ってるやつもあるよ。

よかったモジュール使用不可な鯖じゃなくて。
774773:04/02/24 15:24 ID:???
でもね、正直最近なんよ、HTML::Template使ったの、
えらそうに言ってるけど。
でも気が付いたよ、これ使ってPerlはアルゴリズムだけに集中できたら
ほんっと、楽だよ、楽。
だってレイアウト揃えたり、テーブル組みのHTML吐き出したりするのに
ヒアドキュメントとかqq{};とかのいじくりまわしの苦労がほとんどだったんだ、
って気が付いたよ。

今は画面遷移毎にDWでカッコイイページ作って、それtmplにして変数埋め込んで
TMPL_LOOPさせてさ、Perl側はちょっとそれ向けにデータ構造作ってやらなきゃ
ならんけど、楽だよ、ホント。

一回つかってみ、使った事ないなら。
775nobodyさん:04/02/24 15:50 ID:???
以上、釣り堀からの実況中継でした。
776nobodyさん:04/02/24 16:39 ID:???
自分しか使わないならテンプレートでもなんでも使ってるが、
配布するとなるとそうはいかん罠
777nobodyさん:04/02/24 17:37 ID:???
>>776
そう?配布するんだとテンプレートだめなの?
なんで?
オールインワンじゃないとだめなの?
モジュール依存するとないと動かないから?
でも、cgi何とかとかjcode何とかとかくっつけて配布したり、
ありか書いて、これあっち、あれそっち入れて666にして、とか
いっぱいあるじゃん。
あ、cgi何とかとかjcode何とかなら良くて、HTMLなんとかはだめなん?

なんで?なんで?なんで?

大変だね。なんでかしらんけど
778nobodyさん:04/02/24 17:46 ID:???
>>777
DQNでも使えるようにです。

……おかげで小汚いCGIと、自助努力もできない阿呆が増えたがな。
779nobodyさん:04/02/24 17:48 ID:???
 
 * こ こ は コ ー デ ィ ン グ 質 問 コ ー ナ ー で す *
780nobodyさん:04/02/24 18:03 ID:???
AND・OR検索がしたいのだが知識不足で書けない
@data = ファイルデータ
@word = 対象
781nobodyさん:04/02/24 18:19 ID:???
782nobodyさん:04/02/24 19:36 ID:???
>>780
本読め。grep とかのあたりを死ぬほど読め。
783nobodyさん:04/02/24 20:54 ID:???
文字列の最後の9文字(半角英語)を削りたいのですが、
for文でchopを繰り返すのよりも簡潔でスマートな方法は
あるでしょうか?
784nobodyさん:04/02/24 21:00 ID:???
>>783
$文字列 =~ s/^(.*)([a-zA-Z]{9})$/$1/g;

これでよくないか?
785nobodyさん:04/02/24 21:08 ID:???
print substr("12345678901234567890",0,-9);
786nobodyさん:04/02/24 22:55 ID:???
my $str = 'abcdefghijklmnopqrstuvwxyz';
timethese(1000000,{'TEST783'=>'&test1($str);','TEST784'=>'&test2($str);','TEST785'=>'&test3($str);', });
sub test1{
my $str = shift;
foreach(1 .. 9){chop($str);};
}
sub test2{
my $str = shift;
$str =~ s/^(.*)([a-zA-Z]{9})$/$1/g;
}
sub test3{
my $str = shift;
substr($str,0,-9);
}

Benchmark: timing 1000000 iterations of TEST783, TEST784, TEST785...
TEST783: 9 wallclock secs ( 8.93 usr + 0.00 sys = 8.93 CPU) @ 111957.01/s (n=1000000)
TEST784: 13 wallclock secs (12.63 usr + 0.00 sys = 12.63 CPU) @ 79189.10/s (n=1000000)
TEST785: 2 wallclock secs ( 1.94 usr + 0.01 sys = 1.95 CPU) @ 512295.08/s (n=1000000)

なんでも正規表現に頼るのはよくない。
787nobodyさん:04/02/24 23:06 ID:???
ベンチマークの結果って結構見かけるけど、
見方がわからないから意味サパーリ。
788783:04/02/24 23:20 ID:???
ありがとうございました。
substrでやってみます。
789nobodyさん:04/02/24 23:21 ID:???
>787
TEST785: 2 wallclock secs ( 1.94 usr + 0.01 sys = 1.95 CPU) @ 512295.08/s (n=1000000)
この結果で見よう。


TEST785:
ベンチマークを行なったテストの名前。

2 wallclock secs ( 1.94 usr + 0.01 sys = 1.95 CPU)
処理にかかった時間。少ないほどいい。

@ 512295.08/s
1秒当たりの実行回数。多いほどいい。

(n=1000000)
今回のテストで行なった試行回数。比較的どうでもいいが、少ないと参考にならないこともある。


つまり、>783,>784,>785の速度を見ると、>784は>783よりも更に遅いという事がわかる。
790nobodyさん:04/02/24 23:24 ID:???
>処理にかかった時間

これは大間違いですよ。だまされないように
791787:04/02/24 23:37 ID:???
>>789氏、解説感謝です。
実際にモジュール走らせて、調べてみます。

>>790
ならば、正しいのを教えていただけないでしょうか?
792787:04/02/25 00:23 ID:???
>>791
どうせ>>790なんか、教えて君が知ったかぶって正しいことを聞き出そうとしているに過ぎないんだよ。
自分らで調べるほうがタメになるぞ。関連資料とかも引っ張り出せるしね。
793783:04/02/25 00:27 ID:???
自演なのか、釣りなのか・・?
794nobodyさん:04/02/25 00:27 ID:???
必死なだww
795nobodyさん:04/02/25 00:28 ID:???
お前らみんな



         >>779

796nobodyさん:04/02/25 00:32 ID:???
質問です。
変数などでmyやlocalなどといった局所変数がありますが、
例えば一つのソース内で名前が一切競合しないグローバル変数を使う、
要するに名前が被らない変数名を使えば、全部グローバル変数でも問題ないですか?
797nobodyさん:04/02/25 00:44 ID:???
>>796
気にすんな。
798nobodyさん:04/02/25 01:23 ID:???
>>796
君が今やりたいと思うことを実現する上では、たぶん特段問題ない。

しばらく時間が経って、
その全グローバル変数のコードに何かしら機能追加しようと思い立ったときに、
君はプログラマとして一段階成長することになるだろう。
799nobodyさん:04/02/25 02:32 ID:???
グローバルにアクセスするのって時間かからない?
ベンチとってて思ったんだが
800nobodyさん:04/02/25 02:54 ID:???
801nobodyさん:04/02/25 03:26 ID:???
ourか、パッケージ名書くといいよ。
俺は省略パッケージ名書く派。$::aaaみたいな。
つか、変数はほとんど全てmyしてるけど。strictすれば完璧。
802nobodyさん:04/02/25 06:53 ID:???
>799
過去スレで、コンパイルの時に「直近で宣言された場所を探しに行く」という
話を見た気がするが、難しい事は俺にはわかんね。
803nobodyさん:04/02/25 08:09 ID:???
>>783
$moji = '文字列';
$moji = reverse($moji);
length($moji) - 9;
$moji = reverse($moji);
804nobodyさん:04/02/25 09:06 ID:???
>>799
ベンチの結果教えてくだされ。
少なくとも、普通に使ってる分には違いわからんからなぁ。
805nobodyさん:04/02/25 10:28 ID:???
@{$hoge{$foo}} = @bar; #1
$hoge{$foo} = [@bar]; #2
これらは両方代入できるんですが、これに追加の形でデータをpushしたいとき、
push(@{$hoge{$foo}},@bar2); #3
は入れれるものの
push($hoge{$foo},[@bar2]); #4
ではエラーになります。

1と2はなんとなくやってみたら動いたので結構使ってたのですが、
perlのお偉いさんっぽい人が書いたページを見てると
2のような代入方法だったのですが、
そもそも1や3の書き方はまずいのでしょうか?
806nobodyさん:04/02/25 11:01 ID:???
>>805
#4 はエラーメッセージを読めば自明だと思うがな。

 Type of arg 1 to push must be array
 訳: push の第一引数は配列でなければならない。

#1 は問題なく動作するが、$hoge{$foo} に配列リファレンスと
なる事を強制させて代入するというやり方は気持ち悪い。
#2 の方が素直に感じる。
807nobodyさん:04/02/25 11:13 ID:???
>>806
なるほど。質問する前にグーグルで調べてたときに
第一引数は配列でなければならないをどこかで読みました。
しかし、なぜか脳内でこれは関係ないとスルーしてました。。。馬鹿丸出しですね
で、そうなると
>強制させて代入するというやり方は気持ち悪い。
けれども、pushしたい場合は第一引数が配列では成らず致し方ないので
3の方法でよいということですよね。
有難うございます、勉強になりました。
808nobodyさん:04/02/25 12:46 ID:???
POSTで受け取ったデータのサイズはCONTENT_LENGTHで調べられますけど、
GETで受け取ったデータのサイズはどのように記述すれば調べられますか?

if ($method = "GET") {
  if ($ENV{"QUERY_STRING"} > 4096) {

こういう書き方で問題ないですか?
809nobodyさん:04/02/25 13:20 ID:???
810nobodyさん:04/02/25 13:25 ID:???
>>126あたりはテンプレに入れたらどうかね。
811nobodyさん:04/02/25 13:35 ID:???
>>810
>>126>>5-7 の厳選改訂版
812nobodyさん:04/02/25 13:50 ID:???
テンプレが長いのも問題だ。

>>808
length
813nobodyさん:04/02/25 16:22 ID:???
日本語の変数名ってつけれまつか?

my $これ = '鉛筆';
814nobodyさん:04/02/25 16:58 ID:???
>>813
試してから質問したか?
815nobodyさん:04/02/25 17:39 ID:???
Can't use global $^ツ in "my" at C:\kore.cgi line 1, near "my $・
Unrecognized character \xB1 at C:\kore.cgi line 1.
816nobodyさん:04/02/25 19:01 ID:???
日本語を変数名に使うなんてIMEの切り替えがウザったくなるだけだと思うが。
メジャーな言語で対応してるの、Javaぐらいしか思いつかん。
817nobodyさん:04/02/25 19:10 ID:???
C#も日本語OKだよ
818nobodyさん:04/02/25 19:34 ID:???
use utf8;
use encoding 'cp932', Filter => 1;
binmode $_ => ':encoding(cp932)' for *STDIN, *STDOUT, *STDERR;

my $スカラー = 'foo';
my @配列 = qw(bar baz);
print join ' ', $スカラー, @配列;
819nobodyさん:04/02/25 19:58 ID:???
フォームのデータを取得して表示したいです。

名前: に test と入れると 送信先の名前の項目に「test」と表示させたい。
(name)

POSTでデータを取得するとして下記のようにしているのですが、$nameにtestが入りません。
かなり省略して書いてはいますが(MIMEとか)基本的な部分は下記ですので
アドバイスいただけないでしょうか。


$form_data = $ENV{'REQUEST_METHOD'};
read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'});

@all_data = split(/=/, $formdata);

$name = $all_adta{'name'};

print <<HTML;
<html>
<body>名前は$nameです。</body>
</html>
HTML

exit;
820nobodyさん:04/02/25 20:01 ID:???
821nobodyさん:04/02/25 20:41 ID:???
とりあえず>820とかでお勉強するのは前提として。
一行目の処理も意味不明。
さらに、method=getの場合にはデータを受け取れない。
822nobodyさん:04/02/25 20:56 ID:???
>>821
いえ、POSTで受け取りです。1・2行目はPOSTで受け取る際の
標準入力の処理です。(たしか)
あ、form_dataは2行目以降、”_”を忘れてますね。。

まだ、配列の使い方が良く分からないので、勉強してみます。
823nobodyさん:04/02/25 21:14 ID:???
只今下記のようなコーディングで悩んでいます。

$char = <<'EOM';
<font color="red">1</font>\n
<font color="yellow">2</font>\n
<font color="blue">3</font>\n
EOM

%color = (
'red' => '#2131',
'green' => '#1324',
'blue' => '#2646',
);

#$char =~ s/(<font\scolor=")(.*?)(">)/$1$color{$2}$3/g; # *1
while($char =~ /(<font\scolor=")(.*?)(">)/){
 $char =~ s/(<font\scolor=")(.*?)(">)/$1$color{$2}$3/ if defined $color{$2};
 $char =~ s/(<fo)(nt\scolor=".*?">)/$1%$2/ if !defined $color{$2};
}
$char =~ s/<fo%nt/<font/g;
print $char;

__END__
続く
824nobodyさん:04/02/25 21:15 ID:???
こういった場合に「color=(?)」の(?)部分が%colorで定義している場合は
定義されているものへ置換、定義されていない場合は置換しないとしたいのですが
この例だとyellowもマッチし%colorにyellowが定義されていないため
「<font color="">2</font>\n」といった形になってしまいます。
何かいい方法はないでしょうか?
しっくりこない方法ですが*1を下記の通りにすると期待の動作になります。
---ここから---
while($char =~ /(<font\scolor=")(.*?)(">)/){
 $char =~ s/(<font\scolor=")(.*?)(">)/$1$color{$2}$3/ if defined $color{$2};
 $char =~ s/(<fo)(nt\scolor=".*?">)/$1%$2/ if !defined $color{$2};
}
$char =~ s/<fo%nt/<font/g;
---ここまで---
%colorをループさせて (red|green|blue)のような正規表現を生成するという方法も
考えたのですがもっと美しい方法は無いでしょうか?
825nobodyさん:04/02/25 21:17 ID:???
すみません、コピペミスです。
823は下と読み替えてください。

只今下記のようなコーディングで悩んでいます。

$char = <<'EOM';
<font color="red">1</font>\n
<font color="yellow">2</font>\n
<font color="blue">3</font>\n
EOM

%color = (
'red' => '#2131',
'green' => '#1324',
'blue' => '#2646',
);

$char =~ s/(<font\scolor=")(.*?)(">)/$1$color{$2}$3/g; # *1
print $char;

__END__
826nobodyさん:04/02/25 22:22 ID:???
>>823-825
my %color = (red => '#ff0000', green => '#008000', blue => '#0000ff');
my $color = join '|', keys %color;
$char =~ s/(<font\s*color=")($color)(?=">)/$1$color{$2}/g;
827nobodyさん:04/02/25 23:02 ID:Nk4N5SfD
>>825
$char =~ s/(<font\scolor=")(.*?)(">)/exists($color{$2}) ? "$1$color{$2}$3" : "$1$2$3"/eg; # *1

おらっ1行じゃ。精進せい。
828nobodyさん:04/02/26 10:08 ID:???
プッ
829nobodyさん:04/02/26 10:18 ID:???
>>828
屁こくなよ

やっぱりPerlの包括的なコーディングを、直にプログラムを見て勉強するなら
モジュールを眺めるのが良いのかな。
830nobodyさん:04/02/26 10:20 ID:???
モジュール関連はこっちでおながいします。

Perlモジュールについて
ttp://pc2.2ch.net/test/read.cgi/php/997829243/
831nobodyさん:04/02/26 10:50 ID:???
>>830
モジュールについて聞いてるんじゃなくて、
コーティングのお手本にするなら、つー話なんだが
832813:04/02/26 11:40 ID:???
${'これ'} = '鉛筆';
ゲット
833nobodyさん:04/02/26 12:42 ID:???
英単語の母音を抽出する関数,モジュール,またはPC-Unix・Windowsのツールってありますか?
適当な単語の母音を寄せ集めたテーブルでマッチングさせてたのですが
もっとスマートな方法が無いものかと思いまして…
834nobodyさん:04/02/26 12:58 ID:???
正規表現だけじゃ足りんの?
835nobodyさん:04/02/26 14:37 ID:???
【体の】過労の江頭2:50が大腸ガンを告白【張りすぎだよ…】
http://news2.2ch.net/test/read.cgi/news7/1076656479/l50
過労で倒れたタレントの江頭2:50(38)が、25日都内で会見を開き末期の大腸ガンであることを告白した。
過労で検診を受けた際に分かったと言う。
江頭は「今までも体を張ってパフォーマンスを続けてきた。例え自分が病気の体でも最期までこのままでありたい。」
と力強く語った。所属事務所によると今後も入院はせず今まで通り芸能活動を続ける予定。


836nobodyさん:04/02/26 15:18 ID:???
質問です。
現在2chやしたらばなどの>>774形式のアンカーを有効にするBBSを作ってます。
テキストを引数にして、
$_[0] =~ s/([^=^\"]|^)(\>\>([0-9]{1,3}))/$1<A href="$file?log_number=$3">$2<\/A>/g;
このように書いてます。
この場合3桁指定ですと、>>1,>>20,>>300などは正常にリンクします。
しかし、>>4000などと書かれた場合、>>400までリンクが貼られて、リンクの無い0が一つ余ってしまいます。
指定桁よりも多い桁(3桁ならば>>4000など)の場合だけ、リンクを一切貼らないように記述するにはどう書けばよろしいでしょうか?

837nobodyさん:04/02/26 15:41 ID:???
>>836
s{>>(\d{1,3})(?!\d)}
{<a href="$file?log_number=$1">&gt;&gt;$1</a>}g;
838nobodyさん:04/02/26 16:03 ID:???
>>837
成功しました。わざわざありがとうございます。
後方文字列否定の(?!\d)を使えばよかったのですね。
839nobodyさん:04/02/26 16:38 ID:???
EUC-JPの文字の入った$mojiの中に全角カタカナ以外の文字が入っていたらエラーを出すようなのは
どうしたらいいんでしょうか?正規表現でやりたいです。よろしくおねがします。
840nobodyさん:04/02/26 16:42 ID:???
http://pc2.2ch.net/test/read.cgi/php/1069245758/298-299
このように言われてしまったのでここで質問し直させて頂きます。
薦められたサイトを呼んでもまるで意味が分からなかったので・・・。
841nobodyさん:04/02/26 17:05 ID:???
文字列検索をPerlの正規表現で組んだのですが、
「傘」で検索すると「姿」までマッチしてしまいます。(逆もあり)
$s = "傘"

$_ = "姿";
print if(/\Q$s\E/io);
$_ = "傘";
print if(/\Q$s\E/io);

何でこういう事が起きるんでしょうか・・・
842nobodyさん:04/02/26 17:10 ID:???
>>841 =~ s/\$s = "傘"/$&;/;
843nobodyさん:04/02/26 17:17 ID:???
844nobodyさん:04/02/26 17:20 ID:???
>>843
あああぁぁぁあぁ!そうか!大文字と小文字の判別を無くしてるから・・・!
これは・・・・どうしたものか・・・・jperlかなぁ。。。。
845nobodyさん:04/02/26 17:37 ID:???
>>836です。重ねて質問申し訳ないです。

$_[0] =~ s/([^=^\"]|^)(\>\>([0-9]{1,3}(?![0-9])))/$1<A href="$file?logn=$3" target="_blank" class="inner">$2<\/A>/g;

このように記述して [ >>nnn ]のリンクは作る事には成功したのですが、
投稿内容が、

>>1>>20>>300

となっている場合、>>1>>300にしかリンクが貼られず、間のリンクが付きません。
カンマやスペースなどで間があれば全部貼られるのですが。
2chなどでは、>>1>>20>>300と記述しても全てにリンクが貼られるので、
そのように変更したいのですが、どのように記述すればいいのでしょうか。
846nobodyさん:04/02/26 17:44 ID:???
>>845
PHPだけどp2のソースのぞいてみるといいよ。
いまp2でこのスレ見てるけどそれらのレスポインタちゃんとリンクしてるから

p2 - PHPでつくった2ch Viewer (http://akid.s17.xrea.com/)
847nobodyさん:04/02/26 18:22 ID:???
確か2・3ヶ月くらい前にこのスレで
配列の重複チェックをハッシュを使ってやるってやつのソースを見て、
なるほどと思いそれ(↓)を使ってたんですが、
@tmp{@data} = 1;
print "重複" if (scalar keys %tmp < scalar @data);
今スクリプト見直してて思ったのですが、
scalar無くても(↓)動くと思う・・・というか問題なく動いたんですけど、
必要なんでしょうか?(環境によってとか)
@tmp{@data} = 1;
print "重複" if (keys %tmp < @data);
848nobodyさん:04/02/26 18:25 ID:???
PHPのissetをperlで書くとどうすればいいのでしょうか?
849nobodyさん:04/02/26 18:26 ID:???
>>845
>>1>>20>>300」を一回置換した時点で次の置換開始位置が
「... >>1</A> * >>20」 の * の位置にくる。その正規表現では
ここから
> => ([^=^\"]|^) にマッチ
> => \> にマッチ
2 => \> にマッチしない、と判定される為、後ろにずれていって
0 => ([^=^\"]|^) にマッチ
> => \> にマッチ
> => \> にマッチ
3 => [0-9] にマッチ、と、>>20 が飛ばされる。

>>837 をもう一度よく見てみ。
850nobodyさん:04/02/26 18:29 ID:???
>>848
defi(ry
851nobodyさん:04/02/26 18:29 ID:???
>>847
比較演算子の両オペランドはスカラーコンテキスト。

>>848
http://perldoc.com/perl5.8.0/pod/func/defined.html
852848:04/02/26 18:48 ID:???
すんませんした
ありがとうございました
853nobodyさん:04/02/26 18:58 ID:???
>>851
比較演算子は左も右もスカラーのコンテキストであると判断する
でしょうか?それとも
比較演算子は左も右もオペランドはスカラーでなければいけない
でしょうか?
多分前者ですよね。ありがとうございました
854nobodyさん:04/02/26 19:49 ID:???
>>849
ご丁寧に解説有難うございます。
もう一度良く見直してみます。
855nobodyさん:04/02/26 21:47 ID:???
>>839がやっぱりできません。

$moji =~ /(?:\xA5[\xA1-\xF6])/
これで全角カタカナにマッチするのは分かったのですが、
半角カタカナ以外にマッチするようにするにはどうしたらいいんですか?
856nobodyさん:04/02/26 21:48 ID:???
>>855
半角→全角
857839:04/02/26 21:57 ID:???
$mojiの中に全角カタカナ以外が含まれているかどうかを調べたいんです。
858nobodyさん:04/02/26 22:19 ID:???
>>857
「最初から最後まで全角カタカナが任意文字続く」という正規表現を書いて、
$moji がそれにマッチしなかったら、全角カタカナ以外が含まれている。

基本的な正規表現の文法については >>126 からご自由に勉強してくれ。
859839:04/02/26 22:21 ID:???
>>858
できました。ありがとうございます。
860nobodyさん:04/02/27 01:00 ID:28vfJb2l
>>769-774あたり

亀レスですが、
HTML:Templateは、HTMLフォルダつくってそのなかにTempate.pmするだけで使えますよ。
861860:04/02/27 01:01 ID:28vfJb2l
s/HTMLフォルダ/「HTML」という名前のフォルダ/
862nobodyさん:04/02/27 01:02 ID:???
>860
無理。
Niftyみたいな標準モジュールをインストールしてない
(使えなくしてるだけかもしれないけど)鯖では
Template.pmだけじゃ動かない。
863860:04/02/27 04:21 ID:28vfJb2l
>>862
え、そうなの?自分、cgiと同じならびにHTMLっていう名前のフォルダつくって、
そこにTemplate.pm置いて、useしたら動いたんだけど、
特殊な事情があるのかな?

おわゆるpure-perl(perlだけでつくられてるモジュール)なら置くだけでも
使えると思ってたけど、かんちがい?
864nobodyさん:04/02/27 05:19 ID:???
Template.pm内部で別のモジュールを呼んでいる場合、そっちもないと無理。
調べてみたらHtmlParse.pmとCGI.pmを使うらしい。
こいつらも置いておけば動くはず。
…こいつらも他のモジュール呼んでたりなw
865nobodyさん:04/02/27 07:05 ID:???
「一行掲示板」なる簡単な掲示板を作成しています。
掲示板の書き込みは送信ボタンを押したら出来るのですが
中身がない状態ですので、データをきちんと取得出来て無いように思えます。

お聞きしたいのは、例えばこのスレでソースを出したらアドバイスいただけるのでしょうか?
866nobodyさん:04/02/27 07:12 ID:???
>>865
お前が欲しいのはアドバイスじゃなくて、ソース書き直して欲しい、ってだけだろ?

送信したデータをメソッドで判断して受け取らなければならない。

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
とか
$buffer = $ENV{'QUERY_STRING'};
とか。
867nobodyさん:04/02/27 07:56 ID:???
>>866
いえいえ。それだと勉強になりませんので・・・。
ちなみにそのコードは書いてます。
掲示板と言っても割と複雑なので、ソースを見てもらって
アドバイスしていただいた方がいいのかと思いまして。。
FLASHスレでしたら必ず「fla見せてみ」って言われますので。。
868nobodyさん:04/02/27 08:07 ID:???
>865,>867
誤解していると思う。
アドバイスが欲しいならソースを晒すのは前提。
コーディングスレなのだから。
だけどアドバイスがもらえるかどうかはまた別。
869865:04/02/27 08:16 ID:???
>>868
わかりました。とりあえず、今悩んでいる点を書きます。
フォームにデータ(value)の値が反映されません。
とりあえず、気になる個所を書き出しました。
以下の処理でフォームからの$nameと$textの値を取得していると思うのですが
いかがでしょうか?ちなみにjcode.plやcgi-lib.plなどの外部ファイルは使用していません。
870865:04/02/27 08:17 ID:rkkyDF8k
## フォームデータを取得
if ($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN, $form_data,$ENV{'CONTENT_LENGTH'});

}else {
$form_data = $ENV{'QUERY_STRING'};
}

## フォームに入力されたデータの分解
foreach $pair(split(/&/,$form_data)){
($key,$value) = split(/=/, $pair);

$key =~ tr/+/ /;
$key =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;

$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;

$FORM{$key} = $value;
}

## フォームのデータを変換

my $name = $FORM{'name'};
my $text = $FORM{'text'};

$log = "$name<>$text\n";
871865:04/02/27 08:19 ID:???
## データを読み込み
open (DATAFILE,"$log_file");
my @all = <DATAFILE>;
close (DATAFILE);

unshift(@all,$log);

## ファイルにデータを書き込み
open (DATAFILE,">$log_file");
flock (DATAFILE, 2);
print DATAFILE @all;
flock (DATAFILE, 8);
close (DATAFILE);

(フォーム表示などのHTMLがあるとします)

## 画面表示
open (DATAFILE,"$log_file");
my @data = <DATAFILE>;
close (DATAFILE);

foreach(@data){
($time,$name,$text) = split(/<>/, $_);
&writeContents($time,$name,$text);

}
872nobodyさん:04/02/27 08:38 ID:???
どこまでが正常で、どこからが異常なのか?
ソース出すなら切り分けてから該当箇所のみを提示すべき。
873865:04/02/27 08:47 ID:???
>>871
すみません、、異常個所がわからなくて書き出しました。。
ただ、もう一度見直して書き直したらなぜか出来ました。お騒がせしました。。

あと、もうひとつお聞きしたいのですが、ブラウザの更新ボタンを押したら
書き込まれるのですが、更新ボタンを教えても書き込まれないように
するにはどうしたらいいのでしょうか?

print "Location: ./bbs.cgi\n";

などを上記の”##フォームに入力された〜”の上に記述して
自分自身を読み込んでLocationで回避しようとしたのですが、エラーになりました。
長々と書きましたが、教えていただければ幸いです。
(cokieで2重投稿を防止するとか以外に出来るだけ簡単な方法で)
874nobodyさん:04/02/27 09:24 ID:???
>ブラウザの更新ボタンを押したら書き込まれるのですが、

画面遷移がどうなっているかを言わないとわかるはずもなく。
例えば、2chみたく「書き込みました」とだけ表示するページがあるのか、
もしくは、書き込みボタンを押したら、すぐさまその書き込みが反映されたページが出てくるのか。
もし後者なら、メソッドをGETにして更新すると理由がわかるはず。
前者みたいに確認ページか何かを置いて、Locationなり<INPUT type="button" onclick="Javascript:location.href='$file'">とかを置くなりするのが簡単な解決策。
機能別にサブルーチンわけてれば、そんなところで悩んだりしないものだが。
875nobodyさん:04/02/27 09:31 ID:???
すみません、質問させてください。
次のようなスクリプトなんですが、なぜかPerl(Apache)が重くなって進まなくなります。
この部分を削れば正常に動作するのでPerlやApache自体の問題ではないと思うんですが、
どこか問題点はありますでしょうか?

(変数名は適当です)

if ($aaa) { $bbb[$ccc] = $_;$ccc++; }
else {
if ($ddd > $eee) { $aaa = 1;$bbb[$ccc] = $fff;$ccc++;$bbb[$ccc] = $_;$ccc++; }
elsif (($ddd == $eee) && ($ggg > $hhh)) { $aaa = 1;$bbb[$ccc] = $fff;$ccc++;$bbb[$ccc] = $_;$ccc++; }
elsif (($ddd == $eee) && ($ggg == $hhh) && ($iii > $jjj)) $aaa = 1;$bbb[$ccc] = $fff;$ccc++;$bbb[$ccc] = $_;$ccc++; }
else { $bbb[$ccc] = $_;$ccc++; }
}

構文のミスなどでエラーが出るならともかく、重くなって動かなくなるようなのは初めてです。
そういう時はどんな原因が考えられるんでしょうか・・・
全体として全然大きなスクリプトではないと思います。(ファイルサイズは約4kb)
876865:04/02/27 09:35 ID:???
>>874
後者です。サブルーチンは出来るだけ作らずにやってました(form部分は使ってますが)
アドバイスを参考に色々と改造してみます。ありがとうございました。
877nobodyさん:04/02/27 09:51 ID:???
>>875
if ($aaa) {

$bbb[$ccc] = $_;$ccc++;

} else {

if ($ddd > $eee) {

$aaa = 1;

$bbb[$ccc] = $fff;

$ccc++;

$bbb[$ccc] = $_;

$ccc++;

} elsif (($ddd == $eee) && ($ggg > $hhh)) {

$aaa = 1;

$bbb[$ccc] = $fff;

$ccc++;

$bbb[$ccc] = $_;

$ccc++;
878nobodyさん:04/02/27 09:51 ID:???
} elsif (($ddd == $eee) && ($ggg == $hhh) && ($iii > $jjj))

$aaa = 1;

$bbb[$ccc] = $fff;

$ccc++;

$bbb[$ccc] = $_;

$ccc++;

} else {

$bbb[$ccc] = $_;

$ccc++;

}
}
879nobodyさん:04/02/27 09:53 ID:???
>>865
>構文のミスなどでエラーが出るならともかく、
お前自分で何を言ってるかわかるか?
一回分解して見直してみれ。
880nobodyさん:04/02/27 09:54 ID:???
連稿スマソ。
>>877-878が言いたいことやってくれた。
>>878を見てもわからん?
881nobodyさん:04/02/27 10:12 ID:???
aaa bbb ccc ......
っておまい解り肉すぎ。書き込むときに変数名弄ったんだろうけど、
弄るんならわかりやすい変数名にして欲しかったなボクちゃんは。。
882nobodyさん:04/02/27 10:56 ID:???
for ($i = 0; $i < 10; $i++){
print $i;
}
こういう文の出力結果(123456789)をクリップボードにコピーしたいのですが、

use Win32::Clipboard;
for ($i = 0; $i < 10; $i++){
print $i;
Win32::Clipboard()->Set($i);
}
とすると9のみがクリップボードに入ってしまいます。
出力結果すべてをクリップボードに入れる方法はありますでしょうか?
883nobodyさん:04/02/27 11:07 ID:???
>>882
for文の構造を理解しよう。
1回目のfor文では$i=0で0が出力され、クリップボードには0が入る。
2回目のfor文では$i=1で1が出力され、クリップボードには1が入る。
すなわち、for文が回るたびにクリップボードの中身が入れ替わってしまっている。

use Win32::Clipboard;
for ($i = 0; $i < 10; $i++){
print $i;
$str .= "$i";  #  表示した文字列を連結して格納する変数
Win32::Clipboard()->Set($str);   #  0から9まで連結された文字列をクリプボードに突っ込む
}
884nobodyさん:04/02/27 11:30 ID:???
>>883
それ使ったこと無いけど
use Win32::Clipboard;
for ($i = 0; $i < 10; $i++){
 #print $i;
 $str .= "$i";  #  表示した文字列を連結して格納する変数
}
Win32::Clipboard()->Set($str);   #  0から9まで連結された文字列をクリプボードに突っ込む

こうじゃないの?
885882:04/02/27 11:43 ID:???
>>883-884
よく分かりました。ありがとうございました。
886875:04/02/27 15:59 ID:???
>>877-878
>>879-880
ありがとうございました。
elsifのところに一つ { がなかったのは書き込み時のミスです。
>>878の意図ははっきりとは分かりませんでしたが、改行はするようにします。

結局解決はしたんですが、もう一つ外側のループも含めた問題だったような気がします。
foreach $_(@hoge) {
....
}
として、....の中で@hogeの要素数が増えてしまうような形で、
これが無限ループになってたようです(と自分では納得していますが違うかも)


>>881 すいません。
887nobodyさん:04/02/27 19:29 ID:???
\L〜\Eや\U〜\Eって小文字や大文字にすることができるみたいですけど
使い方がいまいち分からないんです。
たとえば$testに'abc'という文字列が入っていて
これを\U〜\Eを使って大文字の'ABC'に変換したい場合
どんな風にやればいいのでしょうか?
888nobodyさん:04/02/27 21:42 ID:???
$test = "\U$test";
889nobodyさん:04/02/27 23:18 ID:+6x2s23v
SSIの制御構文(条件分岐)についてお伺いします。

<!--#if expr="QUERY_STRING_UNESCAPED =ほにゃらら" -->
上記の文で「もしクエリの中が空だったら」としたいのですが、
"ほにゃらら"部分に何を入れたら良いのでしょうか。

どこで質問すれば良いかわからないのでこちらで質問させて頂きました。
どなたか宜しくお願いしますm__m
890nobodyさん:04/02/28 00:15 ID:???
つか、SSIってGETで渡せたっけ?
891nobodyさん:04/02/28 00:19 ID:???
>>889
ここはperlスレ。SSIは関係無い。よそ逝きな。
892nobodyさん:04/02/28 00:23 ID:???
まあ ttp://pc2.2ch.net/test/read.cgi/php/1073460282 あたりが妥当だろう
893889:04/02/28 02:10 ID:3mzUKizI
>>890-892 御親切にどうもありがとう。教えて頂いた所で聞いてみます。
894nobodyさん:04/02/28 09:11 ID:???
>>888
サンクスです。
895nobodyさん:04/02/28 11:15 ID:???
掲示板で”次のページへ”というリンクを貼り、クリックしたら
次のページのデータが表示できるようにしたいです。
頭の中では現在のデータ(@data)と1ページに表示するデータ($nextpage)を比較して
@dataが$nextpageより大きければ$nextpageに@dataの内容を代入して
次のページに?page=$nextpageで表示したら良いかと思うのですが
なぜか一定の記事が投稿されると「次のページへ」が表示されるのですが
次のページへをクリックしても@dataが次のページに代入されません。

説明が下手で申し訳ありません。何か参考になるサイト、もしくは
アドバイスがありましたらよろしくお願いします。
896nobodyさん:04/02/28 11:20 ID:???
>>895

$ENV{"QUERY_STRING"} =~ /page\=([^\&]+)/;
$page = $1;

print("<a href=\"hoge.cgi?page=" .($page + 1) . "\">次のページへぷりきゅあ♪</a>");
897nobodyさん:04/02/28 11:22 ID:???
>>895
て言うか単純に設計ミスかコーディングミスなのでよく考えて見直しましょう。
としか。
898nobodyさん:04/02/28 11:45 ID:???
>>896-897
ありがとうございます、わかりました。
一つだけお聞きしたいのですが
>$ENV{"QUERY_STRING"} =~ /page\=([^\&]+)/;

とはGETで取得したデータをpageに代入すると言う意味でしょうか?
特に”=~ /page\=([^\&]+)/; ”がよくわからないのですが。置換でもないし・・。
899nobodyさん:04/02/28 12:27 ID:???
>>898
そんな感じ。正規表現の () と $1 の意味を検索するよろし。

$pageには数値しか入れない。って決まってるなら↓のほうがいいかもね。
$ENV{'QUERY_STRING'} =~ /page\=(\d+)/;
$page = $1;
900896:04/02/28 12:35 ID:???
>>899
ちょっと聞きたいんですが、文字列抽出ってマッチ + $1以外の方法ってあるんでしょうか?
いっつもそうやってるんですがもうちょっとシンプルなのがあるのかなと。
901nobodyさん:04/02/28 12:44 ID:???
デリミタが決まってるならsplitする
902899:04/02/28 12:50 ID:???
文字列抽出って汚染チェックも含めたいってことが多いから、
正規表現で $1 するのが一番シンプルだと思うんだけど。

って意味で899の場合は↓がより安全。
my $page = 0;
if ($ENV{'QUERY_STRING'} =~ /page\=(\d+)/) {$page = $1;}
903nobodyさん:04/02/28 13:04 ID:???
>902
=ってエスケープする必要あったっけ?
904nobodyさん:04/02/28 13:10 ID:???
>>903
疑わしきはエスケープ。

開発効率至上主義ですわ。
905nobodyさん:04/02/28 13:21 ID:???
必要ないものにまでエスケープを入れると可読性が下がると思ってしまう俺は、
保守効率至上主義。
906nobodyさん:04/02/28 13:32 ID:???
>>905 に同意。
エスケープするべきはメタ文字だけだろ?開発効率云々言う以前に、
基本技術がなってないよ。
907nobodyさん:04/02/28 13:33 ID:???
>>906
アホがいますな。
908nobodyさん:04/02/28 14:00 ID:???
>エスケープするべきはメタ文字だけだろ?開発効率云々言う以前に、
>基本技術がなってないよ。

(;゚Д゚)ポカーン…
909895:04/02/28 14:05 ID:???
>>899
やはりうまくいきません。。フリーCGIの掲示板のソースとか見たけど、
いまいち、上手く機能しません。。ページの移動は出来るのですが
移動後のページ(?page=1)に掲示板の書き込みデータが移行されません。。

ソースなのですが、865さんの>>870-871に似てます。フォームからのデータの取得を
cgi-lib.plを使って↓のようにしています。
(フォームデータを取得としている個所)
if ($ENV{'REQUEST_METHOD'} eq "POST"){
print "Location: ./bbs.cgi\n\n";

&ReadParse(*buffe);

$name =$buffe{'name'};
$url =$buffe{'url'};
$text =$buffe{'text'};
$page =$buffe{'page'};
910895:04/02/28 14:07 ID:???
そして”画面表示の個所に↓を追加してページを表示しています。

my $begin= $page * $pageview;
my $end= $begin + $pageview;

if($end > @data){
 $end = @data;
}

## 次ページへのリンク
if($end < @data){
 $nextpage = $page +1;
 print ("<a href=\"$ENV{'SCRIPT_NAME'}?page=".($nextpage)."\">次のページへ</a>");
}

後の個所は>>870-871さんのとだいたい同じです。
911nobodyさん:04/02/28 14:37 ID:???
>>909
>移動後のページ(?page=1)に掲示板の書き込みデータが移行されません。。

ここが意味不明なんだよな。なんだか
912nobodyさん:04/02/28 14:38 ID:???
>>909
>print "Location: ./bbs.cgi\n\n";

引数無しのURLに飛ばしているから、なのかもね。
913895:04/02/28 14:42 ID:???
>>911
例えば1ページに5回まで記事を投稿できるとします。
6回目を書き込むと”次のページへ”が現れて1番目の投稿記事が表示されます。
よくある、掲示板の仕組みですが、これが6回書き込むと”次のページへ”が
表示されるのですが、データが移行されずにそのまま書き込まれてしまいます。

>>912
その個所をコメントアウトしてみましたが、結果は一緒でした。。
914nobodyさん:04/02/28 14:48 ID:???
>>913
取りあえず$pageの中身確認。多分0なんだろうけど。
915nobodyさん:04/02/28 14:51 ID:???
$pageがどうかに関わらずforeachで@data全部表示させてるんじゃないだろうな、
ま さ か。
916ヽ(´ー`)ノ:04/02/28 16:09 ID:???
関係ないけど、Location って相対 URL イクナイ(・A・)んじゃないの?
多分動くだろうけど、RFC 的に。
917nobodyさん:04/02/28 16:16 ID:???
RFCでいいと明記されてるならいいんだろが
日本語がよくわからんぞ
918nobodyさん:04/02/28 16:21 ID:???
>関係ないけど、Location って相対 URL イクナイ(・A・)んじゃないの?
>多分動くだろうけど、RFC 的に(イクナイんじゃ?)。
という意味だと思われるが、この話までしてるとスレ違いだな。
919nobodyさん:04/02/28 16:54 ID:???
相対は動かないブラウザもある
920nobodyさん:04/02/28 18:12 ID:???
で?
921895:04/02/28 18:39 ID:???
>>914
いえ、1になってました。
>>915
foreachで表示してます。上にも書いてますが、ちょうど>>871の画面表示のように
@dataの値をforeachで取り出してそれぞれ表示するようにしてます。
for文で表示するよりこちらの方がいいと思いまして。
これだとまずいのでしょうか?
922nobodyさん:04/02/28 18:48 ID:???
>>921
一応聞くがちゃんと

foreach(@data[$begin..$end]){
}

になってるよな?

foreach(@data){
}

なんてバカな子としてないよな?
923895:04/02/28 19:27 ID:???
>>922
バカなことしてます・・・。
しかし、なぜ@dataに[$begin..$end]を入れるか分かりません・・・。
924nobodyさん:04/02/28 19:31 ID:???
>>923
冷静に考えろ。

pageからdataの表示開始位置を求める
pageからdataの表示終了位置を求める
dataをそのままを表示する
925895:04/02/28 20:02 ID:???
>>924
なるほど。。しかし、かといってその文を追加すると
最初からページが数行表示され、書き込みが反映されなくなります。
最初に$beginと$endを指定しているのですが・・。

なんとなく意味はわかるんですけど、どうやってコーティングに
反映させるかわからない。いわゆる勉強不足・経験不足ですね・・・。精進します。。
926nobodyさん:04/02/28 20:29 ID:???
>>925
と言うか論理的におかしいんだよと。
じっくり考えろ。

処理を実現するにはどんな機能を組み合わせればいいか考える。
後はパーツとなる単機能をどうやって実現するのか、それは質問しに来ても誰も咎めないだろう。
927nobodyさん:04/02/28 20:45 ID:???
Perlで複数行を一括してコメントしたい場合はどうすればいいですか?
一行の場合は#ですが複数行の場合はどうすればいいでしょうか?
928nobodyさん:04/02/28 20:47 ID:???
Location ネタでスマンがちょっと言わせてくれ。

print "Location:$Location:\n\n"; って書いたんだが、飛ばない。
飛ばないばかりか何も表示しない。
print "$Location:\n\n"; って書くとちゃんと飛ばしたいアドが表示されるんだが・・・


と、1週間ほど悩んだ事も有ったな〜
なんか懐かしいのでカキコ
929928:04/02/28 20:48 ID:???
=pod
Perlで
複数行を
一括して
コメントしたい
場合は
どうすれば
いいですか?
=cut
930nobodyさん:04/02/28 20:59 ID:???
>>928
931nobodyさん:04/02/28 21:20 ID:???
=cut
>>927











=cut
932nobodyさん:04/02/28 21:37 ID:???
F_INSERT 0x0001 ファイルのレジューム記録を許可する。(APPE)
F_OVERWRITE 0x0002 ファイルの上書きを許可する。
F_RENAME 0x0004 ファイルのリネームを許可する。
F_CREATE 0x0008 ファイルの作成を許可する。
F_DELETE 0x0010 ファイルの削除を許可する。
F_READ 0x0020 ファイルの参照を許可する。
D_DELETE 0x0040 ディレクトリの削除を許可する。
D_CREATE 0x0080 ディレクトリの作成を許可する。
D_VIEW 0x0100 ディレクトリの参照(ディレクトリ内のファイル名表示)を許可する。
D_MOVE 0x0200 下のディレクトリへの移動を許可する。
F_RATEFREE 0x0800 ディレクトリ内をレートフリーにする。
F_ALLFOLDER 0x1000 このディレクトリ以下のディレクトリでも、同じ設定を使用する。
設定値は、十進数で記述すること。

あるFTPDの仕様なのですが、数値がどういう設定を示しているか調べる方法を教えて下さい。

例>60416 は何がONで何がOFFなのか
933nobodyさん:04/02/28 21:52 ID:???
>>932
……FTPDの質問なんだよね? なんでPerlスレに?
934932:04/02/28 21:56 ID:???
Perlでどうやって書くか知りたいのです。
935932:04/02/28 21:59 ID:???
$F_INSERT
$F_OVERWRITE
$F_RENAME
$F_CREATE
$F_DELETE
$F_READ
$D_DELETE
$D_CREATE
$D_VIEW
$D_MOVE
$F_RATEFREE
$F_ALLFOLDER

この変数に、許可なら1を、不許可なら0を代入してもらえるような
プログラムを書きたいのですが
936nobodyさん:04/02/28 22:06 ID:???
自分で勉強しなさいよ。
ここはコーディングの質問スレであって、コードを自動生成してくれるスレじゃないんだ。
>>1を10回音読して。
937nobodyさん:04/02/28 22:58 ID:???
perl というよりアルゴリズムの話だよな。
ビット操作は昔のCプログラマなら基本だったが、
最近は二進数の仕組みも知らない人がperlでスクリプト書きたがるからなあ。

$F_INSERT = $nantara & 1 ? 1 : 0;
$F_OVERWRITE = $nantara & 2 ? 1 : 0;

とかそんな感じで考えてみそ。
もっと頭良く見せたければループをうまく使え。
なにを言われてるのかわからなかったら、
ttp://www.rfs.co.jp/sitebuilder/perl/02/bit.html あたりを読んで勉強汁。
938nobodyさん:04/02/28 22:59 ID:???
>>937
perlは8bit以上のテキストファイル処理用スクリプト言語です。

939932:04/02/28 23:12 ID:???
sりがとう
940nobodyさん:04/02/28 23:13 ID:???
>最近は二進数の仕組みも知らない人がperlでスクリプト書きたがるからなあ。
そんな餌で釣れますか?
941nobodyさん:04/02/28 23:15 ID:???
>>937
割にマスクを10進で書いてたりとか厨っぽさが目立つな。
942nobodyさん:04/02/28 23:17 ID:???
>>937
激しく鯖が見つからないのだが・・
943nobodyさん:04/02/28 23:25 ID:???
>937
>最近は二進数の仕組みも知らない人がperlでスクリプト書きたがるからなあ。
スマン。
俺がPerl始めたのは5年以上前だが、当時はまさにそんな感じだった。
二進数とかビット列とか意識しないで使えるのはPerlの強みだと思うな。
944nobodyさん:04/02/28 23:30 ID:???
>>937=>>943
同意する人いないからって自演は良くないよ
945nobodyさん:04/02/28 23:36 ID:???
必要がないなら覚える必要もなし。
俺は必要だったから覚えた。
946nobodyさん:04/02/29 01:43 ID:???
下のperlスクリプト、このままじゃうまく動いてくれない。
一行目の "my" を外すとうまく動く。
なんでじゃ。

my $var = 1;
my $var_name = 'var';
print ${$var_name};
exit;

947nobodyさん:04/02/29 01:53 ID:???
>>946
my で宣言した変数はシンボルテーブルに無いから、シンボリックリファレンスでは参照でけない
948nobodyさん:04/02/29 03:47 ID:5ZnPxLYN
   /        \
  /   ______\
/  /           \
|  \    __    ___ヽ
|   /   __\ || /__/
|   |   ヽ  ●) ヽ  ●)
∩\|     ̄ ̄  | | ̄ ヽ
ヽ∂     _/(   |)  ノ
 ∪     /     ヘノ  ヽ    ________________
  (_      /二二二/   /
    ヽ   //    /   < おめーが死ねよ
    \    \   ヽ     \________________
      \     ̄ ̄ /
       ヽ─||||||||||

949nobodyさん:04/02/29 03:59 ID:5ZnPxLYN
      ∧_∧      /浩\
     _( ´∀`)    (゚∀゚  )
  三(⌒),    ノ⊃     ( >>1 )   糞スレは・・
     ̄/ /)  )      | |  |
.     〈_)\_)     (__(___)

         ∧_∧  /浩\
         ( ´∀`) (゚∀゚  )
       ≡≡三 三ニ⌒) .>>1 )    立てんなって・・
        /  /)  )  ̄.| |  |
        〈__)__)  (__(___)

           ∧_∧  ,__ /浩\
          (    ´)ノ ):;:;)∀゚)   言ったろうが
          /    ̄,ノ'' >>1 )
         C   /~ / /   /
         /   / 〉 (__(__./
         \__)\)
                      ヽ l //
            ∧_∧(⌒) ――>>1―――
            (    ) /|l  // | ヽ   ヴォケがーー!
           (/     ノl|ll / / |  ヽ
            (O  ノ 彡''   /  .|
            /  ./ 〉
            \__)_)
            ( ´∀`)
           ⊂    ⊃
            | | |
            (__)_)
950nobodyさん:04/02/29 04:01 ID:5ZnPxLYN
               _,......,,,_
               ,、:'":::::::::::::::::``:...、
           /::::::::::::::::::::::::::::::::::::::\
          i::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
            !::::::::::::::::::::::;‐、:::::::::_::::::_::::';
         |::::::::::::::::::::::|  :: ̄      ``!
         r''ヾ'::::::::::/  ::          |
         l r‐、\::/  _,,、ii_;;_、    _,,,l、
         ヽヾ〈    ::= -r:;;j_;、`/ :;'ィ;7
          !:!_,、    :: ` ー  : |: `´/     何かもう必死でしょ?
         ,./ヽ |  、_  ::  ,: 'r' :i |:  /       最近のPerlオタ
       ,../ `ヽ;_  i | '"、_:::__`:'‐'. /
        / ``'ー 、_\  ! `::` ̄''`チ`シ
    /ー 、_    `\:、_ :: ` ̄/
   /     ``ヽ、   ヽ`'7‐--'゛

                /⌒⌒γ⌒ 、
               /      γ   ヽ
               l       γ   ヽ
              l   i"´  ̄`^´ ̄`゛i |
          r、r.r 、|   |         | |
         r |_,|_,|_,|ヽ  / ,へ    ,へ ヽ./
         |_,|_,|_,|/⌒!、/   一   一 V
         |_,|_,|_人そ(^i       |     .|   ・・・松本君、何が言いたいん?
         | )   ヽノ |   /( 、, )\  )
         |  `".`´  ノ  ヽ ヽ二フ ) /
         人  入_ノ丶        .ノ
       /  \_/\ | \ ヽ、_,ノ
951nobodyさん:04/02/29 04:02 ID:5ZnPxLYN
□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□■■■■■■■■■■■■■□□□□□□□□□□□
□□□□□□□■■■■■■■■■■■■■■■□□□□□□□□□□
□□□□□■■■■■■■■■■■■■■■■■■□□□□□□□□□
□□□□□■■■■■■■■■■■■■■■■■■■□□□□□□□□
□□□□□■■■■■■■■■■■■■■■■■■■■□□□□□□□
□□□□■■■■■□□□□□□□□□□□■■■■■■□□□□□□
□□□□■■■■□■■■□□□■■■■□□■■■■■□□□□□□
□□□■■■■□□□□□□□□□□□□□□□■■■■■□□□□□
□□□■■■■□□■■■□□□■■■□□□□■■■■■■□□□□
□□□■■■□□■□□□□□□□□□■□□□□■■■■■□□□□
□□□■■■□■□□■■■■□□□□□■□□□■■■■■□□□□
□□■■■■□□□□■□□□□□□□□□□□□□■■■■■□□□
□■■■■□□□□□■■■■□□□□□□□□□□■■■■■□□□
□■■■■□□□□□□■■■■■■□□□□□□□■■■■■■□□
□■■■□□□□□■■■□□□□■■□□□□□□■■■■■■□□
□■■■□□□□□■□■■■■■□■■□□□□□■■■■■■□□
□■■■■□□□■■□■□□□□□□■■□□□□□■■■■■□□
□■■■■□□■■□□■■■□□□□■■□□□□■■■■■■□□
□■■■■■■■■□□■□□□□□□□■■□■■■■■■■■□□
□■■■■■■■■□□■■■■■□□□■■■■■■■■■■■□□
□■■■■■■■■□□□□□□□□□■■■■■■■■■■■■□□
□□■■■■■■■■■■■■■■■■■■■■■■■■■■■□□□
□□■■■■■■■■■■■■■■■■■■■■■■■■■■□□□□
□□□■■■■■■■■■■■■■■■■■■■■■■■■■□□□□
□□□■■■■■■■■■■■■■■■■■■■■■■■□□□□□□
□□□□□■■■■■■■■■■■■■■■■■■■□□□□□□□□
このスレは終了しました。以後、ナにも書き込まないようにお願いします。
952nobodyさん:04/02/29 04:03 ID:5ZnPxLYN
                   _ /- イ、_
           __        /: : : : : : : : : : : (
          〈〈〈〈 ヽ     /: : : : ::;:;: ;: ;:;: ; : : : ::ゝ
          〈⊃  }     {:: : : :ノ --‐' 、_\: : ::}
   ∩___∩  |   |      {:: : :ノ ,_;:;:;ノ、 ェェ ヾ: :::}
   | ノ      ヽ !   !   、  l: :ノ /二―-、 |: ::ノ  パンチ5分の2が裂烈!
  /  ●   ● |  /   ,,・_  | //   ̄7/ /::ノ
  |    ( _●_)  ミ/ , ’,∴ ・ ¨  〉(_二─-┘{/
 彡、   |∪|  /  、・∵ ’  /、//|  ̄ ̄ヽ
/ __  ヽノ /         /   // |//\ 〉
(___)   /         /    //   /\ /
       /          /        / 
953nobodyさん:04/02/29 04:05 ID:5ZnPxLYN
               ズドドドドドドドドドド!!!
                    ゜ヾ´      ″
   書き込む奴は死ね    =―≡ ̄`:∵∧_∧´‘
          _  Λ_≡―=', (    )∴∵゛、゜¨
        , ≡ ) ( ゜Д゜r⌒)  _/ / ̄    _
      ´∴‘≡く / ∧   | y'⌒  ⌒ ヽ _Λ(  ≡―=‥、,、
     ″″    \/  Λ_|  / >946| | ゜Д゜ )`=―≡―
     “         ( ゜Дー' |   |ヾノ   //
             =―≡ ̄`:, | ,  | ( ̄=―≒‥,,
         ,゛“=―≡―=',/  ノ )∵`=≡―=
                ∴/´/ / |  | ,'ゞ       マックノーウチ !
              ゛〃/ / / \|  |   ヾ
                /(  |  (  |
               /  |  |  |\ \
              / / |  |   | ヽ/⌒〉
             (_  「 _) (_〈_/
今後、このスレは書き込むごとに荒れます。絶対に書き込まないようにお願いしますね。
954nobodyさん:04/02/29 04:09 ID:5ZnPxLYN
                           /´      ̄`ヽ,        .../
        \                / 〃  _,ァ---‐一ヘヽ      .../
         \               i  /;;;;;;;;;;     リ}      ../
           \.                |   〉;;;;;;;;-‐ノ  '''ー {! ∧__T _ ,,,r -r-T‐-、
            \            |   |;;;;;;; ‐ー  くー |"~。 r *o:*::f:::r:::..l. |
   ::::::::::::::       \    __,-,,-、  ___ヤヽリ;;;;;   ,r "_,,>、 ゚'}::::::::*o;;;ro ot _f_ヽ丿
   ::::::::┃二\     _\__/| | l |ヾ-"~  ヽ_」;;;;;  ト‐=‐ァ' !,,..-v--'''''''"V"~~ ┴
   :::::::┃. \\  l⌒l二|-l ..uUU""l----' ''ゝi、   ` `二´' 丿:::::::::::::::|
   :::::::┃-=-`9|、  "~ ...| ヽ  l ̄”/:::: __.、__|`'' ー--‐f '´:::::::::::::::::::|
  ::::::::::┃ヽ _ ヽ      |  |  / ..,-" //| ;;   ::::  ;; l l ` ;  ::::::|
  :::::::::::┃i".ヾ, |      ..| /  |  / ;; | | l   ;;;;  _//  `;; 、::|
   ::::::::┃||" /l___     | /   | /  l; | |   "〜-""~ //     `,
   ::::_/|\:~/| |   . |/   |/-   /|.|       //  ;; ;;   `,
    |  |_  ,,,,|  |   ../   . |  \ | |____    _//  ;  l|    `,
    |  | ""    |   /   ;' .|  /"/o  "" " " o\  ";.|:::::::::  l_ 
    |   | 金    l ... /   ;; |;;;;;". l/::::::::::::::::::::::::::::::::::`l :::::: l::::: _ - ".l
    .|   | 正    |  |   .;; l  / ::::::::::::::::::::::::::::::::::::::: `l :::l/    ;;` ; 
    |   | 日    | .`l    "_ノ"\ ::::::::::::::::::::::::::::::::::::::::::| / `;;   ;;; l
書き込んだ奴は殺す!
955nobodyさん:04/02/29 08:17 ID:???
hisasiburinikitana
956nobodyさん:04/02/29 12:57 ID:Bg+9grdn
ファイル入出力に関する2つの質問です
ファイルからデータを読み込んでデータを処理した値をファイルに出力したいのですが、
読み書きモードがいまいちよく解りません。

質問1)+>は読み書きで、オープン時にファイル内容を空に・・・とありますから、
↓これでいいのかな?と思ったのですが・・・
-----------------------
open (FH,"+>$filename");
処理
print FH $data;
close(FH);
-----------------------
データが読み込めてない(空の状態)のようでダメでした。
オープン時データを空にし、中のデータを読めないのなら、
単純に書き込みモード(>)と同じのような気がするのですが何のためにあるんでしょう

質問2)それで、次に
+< (読み書きモードで、オープンしたファイルはそのままの状態)
を使い↓のようにしてみました。
-----------------------
open (FH,"+<$filename");
処理
truncate(FH,0); #いらない?
seek(FH,0,0);
print FH $data;
close(FH);
-----------------------
truncateでファイル内容を0にしないといけないと思ってたのですが、
上のソースで期待通りの動きをしてくれています。
seekでファイルポインタを先頭にしているのですが、
それだけで中の内容は消えるのでしょうか?
957nobodyさん:04/02/29 13:00 ID:???
>956
truncateしないと不都合が起きる。
例えば、
ABCDEFGHIJK
というファイルに
12345
という書き込みをした場合、
12345FGHIJK
となってしまう。
それを避けるには、一度ファイルを空にする必要がある。
ファイルの中身が必ず変更前より大きくなるのなら、いらないかもね。
958nobodyさん:04/02/29 13:24 ID:???
ここで質問するか.htaccessスレか非常に迷ったのですが、
結局Perlで組むものなのでこちらで質問させて頂きます。

.htaccessのErrorDocumentでエラーメッセージとばす先を
Error.cgiに設定しているのですが、
ErrorDocumentで飛ばすと、URI欄に入力したアドレスが、http://〜/Error.cgiに切り替わってしまいます。
なので、ビジターがどんなURIを入力してエラーになったのかを取得して表示したく、Error.cgi内でReffererを読んでみたのですが、
それではビジターがURIを入力する前のページのURIが返ってきてしまいました。

これを解決する方法はPerlでは無いでしょうか。
959nobodyさん:04/02/29 13:39 ID:???
>>958
apacheスレへ。
960nobodyさん:04/02/29 13:52 ID:???
>>957
有難うございます。
テストしたのが更新前と更新後共に、文字長が同じだったので気づきませんでした。
+>についてわかる方いましたらお願いします。
961nobodyさん:04/02/29 14:37 ID:???
>960
+>はまっ更にしてから書き込んだ後に読み込む為のもの。
+<は読み込んだ後に書き込む為のもの。
962nobodyさん:04/02/29 15:10 ID:???
1byte文字や 2byte文字が混合してる文字列に対して、
5文字目までを取り出すみたいな処理はできますでしょうか?

例えば、
「1あ2い3う4え5お6か7き8く9け」 のようなテキストがあれば、
「1あ2い3」 としたいです。
963nobodyさん:04/02/29 15:12 ID:???
2バイト文字ってのが何語のどのタイプのコードなのかさえわかればできるな
964962:04/02/29 15:20 ID:???
>>963
日本語のEUCコードを想定してます。
965nobodyさん:04/02/29 15:24 ID:???
>>964
あるバイトがEUC1byteコードなら次のバイトもEUCです。
966nobodyさん:04/02/29 15:28 ID:???
967nobodyさん:04/02/29 15:55 ID:???
>>961
有難うございます。しかしごめんなさい・・・よくわからないです。

>+>はまっ更にしてから書き込んだ後に読み込む為のもの。
無い頭で解釈してみると
1|例えば+>でファイルを開き(この時点でまっさら?)
2|$tempという値を書き込み、
3|それを読み込む?
それだと読み込んだもの(3)は$tempと一緒(2)じゃないんでしょうか?
なんの意味無いような・・・。

何か利用したソースを少し書いていただけませんでしょうか

さっきから検索しまくってるんですが、
「>」や「<」の説明は山ほど出てくるのですが、
「+>」とかがなぜか説明してくれているサイトが見つからないんです。
968nobodyさん:04/02/29 16:03 ID:???
>967
open(FILE,"+>file.txt");
print FILE "あいうえお";
seek(FILE,0,0);
while(<FILE>){
print $_;
}
close(FILE);

何の意味もないと思うのは、想像力が足りないからだと思う。
こういう使い方が有効になるシーンというのもあったりするものだよ。
ただ、確かにそういうシーンが少ないのも確か。
だから説明サイトも少ないんだろう。
969nobodyさん:04/02/29 16:03 ID:???
て言うか読み書き可能ストリームってキモい。
970nobodyさん:04/02/29 16:23 ID:???
>>968
あぁ解りました。機能的には>967そのものなんですね。
しかし考え付く範囲では全く用途は無いですね。
何はともあれ解決しました。長々とすいませんでした。
971962:04/02/29 17:55 ID:???
>>965,966
解決しました。ありがとうございます!
972nobodyさん:04/02/29 19:22 ID:???
perlをはじめ立ててで取りあえず本に載ってたとおり打ってみたのですが
出力結果が何回やっても1なんです。counter.datから1行目の数字を
読み込んでインクリメントして表示してファイルに書き出す、
ってことなんだとおもうんですが何が間違ってるのかわかりません。
誰か原因を教えていただけませんか。

#!/usr/local/bin/perl --

$datafile = "./counter.dat";
open DATAFILE, "+<$datafile";
flock DATAFILE, 2;

seek DATAFILE, 0, 0;
$count = <DATAFILE>;
$count++;

printf("%4d", $count);

seek DATAFILE, 0, 0;
print DATAFILE "$count\n";

flock DATAFILE, 8;
close DATAFILE;

exit;
973nobodyさん:04/02/29 19:25 ID:???
ageとこう。
974nobodyさん:04/02/29 19:26 ID:???
まちがえた。
975nobodyさん:04/02/29 19:33 ID:???
>>973
+>
976nobodyさん:04/02/29 19:34 ID:???
>>972
とりあえず、counter.datが読み取り属性付いてたりしないよな。
977nobodyさん:04/02/29 19:35 ID:???
$で始まるスカラ変数は初めの1行しか代入されないから
シークしないで
$count=<DATAFILE>;
これでよい
978nobodyさん:04/02/29 19:43 ID:???
>>975
http://www.futomi.com/cgi-bin/lecture/perl5ref.cgi?MODE=DISP&FUNC=open

>>976
パーミッション777にしてみたけどいっしょでした。

>>977
だがしかし改善はされなかったのです。
979977:04/02/29 19:57 ID:???
>>978
いや、、俺はその「1」しか〜〜ってことを指摘したんじゃなく、
ただ
seekが無駄だ、って言っただけです
980nobodyさん:04/02/29 20:12 ID:???
>972
counter.datの中身は書き変わってるの?
counter.datの最終更新時間とかはチェックした?
981nobodyさん:04/02/29 20:40 ID:???
解決しました。counter.datのパスなんですが、counter.pl(っていうファイル名だったんですけど)
からの相対パスではなくてSSIで呼び出す元のshtmlファイルからの相対パスを記述しないと
ダメだったようです。どうもお騒がせしました。ありがとうございます。
982nobodyさん:04/02/29 20:45 ID:???
そろそろ次スレ立ててね。
次はPart33だから間違えないようにおながいしまつ。
983nobodyさん:04/02/29 22:04 ID:???
>>982
そろそろプログラム技術板にあるスレ一本に絞ろうぜ。
984nobodyさん:04/03/01 00:04 ID:???
0chとかFSWikiとかをお手本にしながら練習しているのですが、
一体どんな風に書けば人様に見せられるようなスクリプトになるんですか?
985nobodyさん:04/03/01 00:44 ID:???
Perlの本買ってきて、とりあえず書いてるとおりに書き写して
リファレンスを読みながらプログラムを追っかける、っていう方法で勉強
しているんですが、書き写したプログラムが動いてくれません。
InternalServerErrorとなります。perlのパスとパーミッションの設定は合ってます。
ApacheのエラーログにはPremature end of script headers: bbs.cgi とあります。
自分で間違いを探すだけのスキルはありません。ここで頼んでもいいですか?

ソースはhttp://f3.aaacafe.ne.jp/~whitenn/ここの、up827.zipです。
986nobodyさん:04/03/01 00:56 ID:???
書いてある通りに書き写せば絶対動くわけではない。
987nobodyさん:04/03/01 00:59 ID:???
わかってるよ。プログラムの本って案外誤植多いし。だからここでたのんでるんだよ。おねがいヘルプ。
988nobodyさん:04/03/01 01:02 ID:???
989nobodyさん:04/03/01 01:08 ID:???
>>988
そこに書いてあることは全部クリアしてます。
990nobodyさん:04/03/01 01:18 ID:???
とりあえずそのbbs.cgiじゃなくて普通のスクリプトは動くのか?
991nobodyさん:04/03/01 01:19 ID:???
はい。よそでひろってきたbbsはうごいてます。
992nobodyさん:04/03/01 01:31 ID:???
perlのパスは/usr/local/bin/perlで間違いないのか?
993nobodyさん:04/03/01 01:33 ID:???
バッチリ合ってます。パーミッションは755です。ログファイルは666です。
ログファイルは本に書いてあったとおり空テキストをぶっこみました。
994nobodyさん:04/03/01 01:34 ID:???
あとjcode.plは確かにあるのか?
995nobodyさん:04/03/01 01:36 ID:???
SSI用につくったものを直で見に行ってもInternalServerErrorが出るので
他スレできいたらHTTPヘッダがないからだって教えてもらったことがあるんです。
その辺があやしいんじゃないかなあと思ってるんですが。
インタプリタがHTTPヘッダを吐き出すところにたどりつくより前に
なにかのエラーが起きてるんじゃないかなーと。勘でしかないですが。
996nobodyさん:04/03/01 01:38 ID:???
jcode.plはcgi-bin/に、bbs.cgiはcgi-bin/testbbs/に置いてます。
997nobodyさん:04/03/01 01:39 ID:???
じゃあrequire '../jcode.pl';にしろよ
くだらないことで俺の手を煩わせるな。
998nobodyさん:04/03/01 01:45 ID:???
あ゛・・・・
修正したつもりだったんですが・・・(汗


本当にごめんなさい。こんな時間まで本当にありがとうございました。すみませんでした。
999nobodyさん:04/03/01 01:47 ID:???
999
1000nobodyさん:04/03/01 01:48 ID:???
記念カキコ v(^-^=)
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。