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

Perl 初心者コーナー Part24

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆fBgbHI04bQ 03/06/07 22:30ID:GbQKLcPE
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


CGIだけど、なんか質問ある? Part 10
http://pc2.2ch.net/test/read.cgi/php/1048686475/
【Perl,CGI】参考書籍 第三版
http://pc2.2ch.net/test/read.cgi/php/1030209573/
CGIに依存しないPerlの話題一般/Part2
http://pc2.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は、【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0567nobodyさん03/06/18 16:01ID:???
>>566
あのさあ、何でこのスレで質問したのかをまず教えてくれない?
0568nobodyさん03/06/18 16:02ID:???
>>566
板違い
056956603/06/18 16:03ID:???
>>567
掲示板などのスクリプトの中にperlで
半角英数字が連続したときに自動改行してくれる
構文など有るんでしょうか、と書きたかったのです。すみません。
0570DBMのBSD DB(Berkeley DB)はMySQLより早いのか?03/06/18 16:04ID:kZ9NfMGd
http://www.ecopig.jp/comucale/index.htm
上記ダウンロードより
DBMのフィールドを自分で作る(分割する)と、
Berkeley DBは、MySQLより早いのか?
この件についてどなたか、教えて下頂けませんか?
0571nobodyさん03/06/18 16:05ID:???
>>566
板違いも甚だしくてワロタ
<td style="width: 80px;table-layout:fixed;">
とか。
ブラウザ依存だから期待せぬように。
0572 03/06/18 16:09ID:???
$_="TooLongLongLongString";
s/([a-zA-Z0-9\-_\?\.]{5})/$1\n/g;

かな。この場合5文字で改行。
0573nobodyさん03/06/18 16:34ID:???
違うと思うが
0574nobodyさん03/06/18 16:46ID:???
>>569
2バイト文字が混在した文字列を途中で分割するのはわりと面倒なので、
そういうのは普通ブラウザの表示に依存させてしまうことが多い。
んで、>>566の質問については板違いにつき、ここでは答えない。
0575nobodyさん03/06/18 17:45ID:???
system("ls");
で、得られたファイル名前、ディレクトリ名前を配列に代入したいんですが
どうすればいいでしょうか?
0576nobodyさん03/06/18 18:21ID:???
>>575
split(/\n/,`ls`);
0577nobodyさん03/06/18 19:49ID:fCn6DpDd
Cookieについてなんだけど、次の簡単なコードなんだけど、
IEだけが機能してくれない、Opera、Mozilaは問題ないんだけど、
誰かわかりません?、オナガイします、マジでひとつ。


#!/usr/bin/perl -w

print <<"END";
Content-type: text/html
Set-Cookie: DATA=0123456789; expires=Mon, 30-Dec-2020 23:59:59 GMT


END

foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"<br>\n";
}
0578nobodyさん03/06/18 19:57ID:???
while(1) {
print "ぬるぽ\n";
}
こんな感じに半角でインデントして、
>>578
自分へのアンカーをつけてポップアップで読む
0579nobodyさん03/06/18 20:10ID:???
>>577
>>1に書いてある3つの手順をちゃんと踏んでおくようにね。
あなたの場合、1番目と3番目が書いてない。
0580nobodyさん03/06/18 20:22ID:???
>>577
> Content-type: text/html
不要。
よってPerlとは関係なし。
逝って良し。
058144303/06/18 20:24ID:???
えっと、>>443です。
みなさん色々ありがとうございます。
2日間調べてやっと原因が解りました。
>>463さんが言ったようにサーバー側の設定の問題でした。
$ip = $ENV{'X_FORWARDED_FOR};に変えたら
ちゃんと違ったIPが取得できるようにました。
$useragent = $ENV{'HTTP_USER_AGENT'};でユーザーエージェントも
取得したんですが、私はWindows xpなのにWindows NTになっていました。
こういうもんなんでしょうか?
0582nobodyさん03/06/18 20:25ID:???
>>570
どっちが速いとかの問題じゃない訳で、設計しだいな訳で、Perlと関係ない訳で。
0583nobodyさん03/06/18 20:29ID:???
>>581
Operaだと2000とXPがちゃんと認識されます。
IEだと、2000はNT5.0、XPがNT5.1と識別されます。

って言う話だ。
確かめたわけじゃないが。
0584 03/06/18 20:39ID:???
http://dream.lib.net/room/
ここで配布してあるチャットの個人会話を覗き見する方法わかる?
ファイル名はわかってるんだけど、拡張子がCGIにされてるから見えない…
0585_03/06/18 20:45ID:???
http://homepage.mac.com/hiroyuki44/
0586nobodyさん03/06/18 20:48ID:???
>>584
無理。
0587nobodyさん03/06/18 20:56ID:???
>584
FTPでログを見る。
管理人にしかできないがな。
0588nobodyさん03/06/18 21:21ID:???
>>584
クラックする方法があったぞ、確か
0589nobodyさん03/06/18 21:50ID:???
てきすとの中にURLがある場合、URLに自動でリンクを張るにはどうすればいいのでしょうか?
(2chみたいに)

なお、テキストの中には、2つ以上URLがある可能性もあります。
0590nobodyさん03/06/18 21:59ID:???
>>589
置き換えろ、以上。
0591nobodyさん03/06/18 22:01ID:???
>>589
置き換えろや。
最後にgつけろ
0592nobodyさん03/06/18 22:07ID:???
>>589
Perlメモ嫁
0593nobodyさん03/06/18 22:22ID:8AjElXD0
コーディングのお供に
http://mypage.odn.ne.jp/home/dongrico
059454303/06/18 22:45ID:???
一日じっくり調べてみました。

system("/usr/bin/test -f /path/file"); #ファイル存在確認コマンド

これでfileという名前のファイルの有無を確認できますよね?
0595nobodyさん03/06/18 23:01ID:???
>>594
実際に試せ。自分の目で確かめろ。
ついでに「ファイルテスト演算子」でググれ。
0596nobodyさん03/06/18 23:02ID:???
@aray = qw[12\tあ 5\tい 3\tう 4\tえ 1\tお];
↑のような配列があった時これを "12 5 3 4 1" の部分を見て
下のような数の大きい順にソートするようなスマートな方法は無いでしょうか?
@array = qw[1\tお 3\tう 4\tえ 5\tい 12\tお];


059754303/06/18 23:06ID:???
>>595
そうしたいんですけど家に環境ないんです。
・゚゚・o(iДi)o・゚゚・。

検索はしてみますね〜♪
ありがと〜

他にも助言お願いします。
0598nobodyさん03/06/18 23:15ID:???
>>597
`/usr/bin/test -f /path/file`

backtick
0599nobodyさん03/06/18 23:42ID:???
ローカルでは問題無いのですが、サーバにアップしてテストすると、
余計な改行コードが加えられてしまいます。
お願いします。

$match = 0;
open(votelog,"+<vote.log");
@votelog = <votelog>;
$last = @votelog + 0;
for($num=0;($num<=$last)and($match==0);$num++){
($name) = split(/\,/,$votelog[$num]);
if($namekey eq $name){
$votelog[$num] =~ s/\n//;
$votelog[$num] =~ s/\r//;
($name,$comment,$votenum) = split(/\,/,$votelog[$num]);
$votenum = $votenum+1;
$votelog[$num] = "$name,$comment,$votenum\n";
$match = 1;
}
}
seek(votelog,0,0);
print votelog @votelog;
close votelog;
060059603/06/18 23:53ID:???
>>596
文字が含まれてても普通に
@array = sort {$a <=> $b} @array;
でやってくれるんですね。。
では↓な場合にスマートに数字の大きい順で
ソートする方法あればお願いします。
@aray = qw[a\t12\tあ b\t5\tい c\t3\tう d\t4\tえ e\t1\tお];
0601nobodyさん03/06/19 00:03ID:???
>>599
何も言わず氏ね
060254303/06/19 00:25ID:n1s+2eOn
家のRedhatでやってみました。
以下のどちらの場合もだめでした。

system("/usr/bin/test -f /path/file"); #ファイル存在確認コマンド
system(`/usr/bin/test -f /path/file`); #ファイル存在確認コマンド

どうしてでしょう?
ご助言くださいませ。
syntax error near unexpected token `system(上記)'
と表示されてしまいます。
0603nobodyさん03/06/19 00:29ID:???
>>602
確かに test コマンドもシェルではファイルテストに使うが、
Perlerなら

-e "/path/to/file" and print "存在したポ\n";
0604nobodyさん03/06/19 00:29ID:???
>>600
正規表現使いなさいよ。
0605nobodyさん03/06/19 00:30ID:???
>>602
>>598
0606nobodyさん03/06/19 00:31ID:???
>>602
なあ、なんでsystemなんか使うわけ?
しかもそのリスト・・・
0607nobodyさん03/06/19 00:41ID:???
>>602
うちのActivPerlでも駄目でありました
060849203/06/19 00:44ID:???
謎が解けました。
ループ中にエラー処理はさむと
比較しなくていいものまで反応してエラー出してました。
パスワード間違いの場合はリロードさせる(何もしない)事で回避しましたが
エラー表示やっぱ出したいな……。
0609nobodyさん03/06/19 00:51ID:???
>>608
それは比較のやり方が間違ってるだけだろう
0610nobodyさん03/06/19 00:53ID:???
>>597
用意しろ。最低限の義務だ。

>>599
「chomp」や「binmode」で調べろ。あとこれ読め。
ttp://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

>>600
print join '/',
map $_->[0],
sort { $b->[1] <=> $a->[1] }
map [ $_, /\\t(\d+)\\t/ ],
@aray;
061154303/06/19 00:55ID:???
OSのコマンドを使うにはsystemコマンドと本に書いてあったものですから・・・
いま603さんにいわれたとおりに

#! /usr/bin/perl
-e "/path/path/ファイル名" and print "ok\n";

でokが表示されました。
ありがとうございました。
Perlerっていうのもカッコイイ(゚∀゚)~

やっと次に進めます。
まだとっかかりにすぎないけど
がんばります!
061254303/06/19 00:57ID:???
>>610
Linuxですが用意しました。
本番機はHP-UXなのですが
PerlのVerが同じ5なら問題ないですよね?
061354303/06/19 01:20ID:n1s+2eOn
>>603
あれ?
「-e」というのは「test -e」とはまったく別なんでしょうか?
ファイルが1つの場合は611で成功したのですが、複数のファイルの存在確認をする必要があるため、
if文で一つでもファイルが確認できなかった場合にはエラーを表示するようにしたいのですが。

ファイル存在確認フロ−(下手でごめんなさい)

ファイルA −−
  y|    n |
  ↓ |
ファイルB −−
  y|    n |
  ↓ |
ファイルC −−
  y|    n |
  ↓ ↓
正常終了 異常終了
exit(0)    exit(100)
061460303/06/19 01:26ID:???
for (@files){
        -e $_ or die;
}
061559603/06/19 01:32ID:???
>>610
どうもありがとうございます。

が、思った結果とはちょっと違うです。。
しかしなんとなくスマートに書く方法がわかったような気がします。
061654303/06/19 01:44ID:???
>>614
ありがとうございます。

さらに@filesで指定したファイルがすべてあった場合には
exit(0)で抜けて、足りなかった場合にはexit(100)で抜けるような
if文を加えることはできませんか?
061760303/06/19 01:47ID:???
こう?

for (@files){
        -e $_ or exit(100);
}
exit(0);
061854303/06/19 02:04ID:???
>>617
あ、できてます!
どうもありがとうございます\(^▽^)/
ただ上記だと「-e $_ or exit(100);」の方が
@filesが存在した場合に返す終了ステータスですよね?
exit(100)はファイルがない場合の異常終了ステータスにしたいので
ご教授頂いたexit(100)とexit(0)を入れ替えればよろしいですかね?

@filesの部分は本でわかっていたのですが
「-e」や「$_」というのはまったくどういうものか
わからなかったので…
061960303/06/19 02:07ID:???
入れ替えなくていいと思うが・・・
まア、実際に試せばわかるけど
0620nobodyさん03/06/19 02:17ID:???
>>618
自分で調べようとかいう気はないようだな。
>>595でも「ついでに「ファイルテスト演算子」でググれ。」とレス
もらってるのに。
062154303/06/19 02:20ID:???
>>619
あ、本当だぁ。
ごめんなさい。完璧でした。
本当にありがとうございましす。

これでファイルの存在確認の方は
終了コードをシェルに渡すことができると思うので
完璧みたいです。

今度はファイル削除…
同じ要領でいいのだろうけど
そのまえに「-e」や「$_」を理解しなくては…
062254303/06/19 02:24ID:???
>>620
いえ、調べました。
すぐにひっかかったページをみると
一見してtestコマンドのようにみえたので
「-e」はtest -eかと思って、できるだけ略さずに書こうと思ったら
×でした。

それでtestコマンドではないのだろうと考えてお願いした次第です。
0623nobodyさん03/06/19 03:14ID:???
-e が他の予約語と対等だとは、普通思わん罠
0624nobodyさん03/06/19 03:30ID:???
>>623
だから「ファイルテスト演算子」という言葉が出てきたのだが。
入門本ばかり眺めているんだろうな鬱。
0625nobodyさん03/06/19 03:31ID:???
スペースだけに一致する正規表現はスペースそのものだけしかありませんか?
0626nobodyさん03/06/19 03:40ID:???
\s
0627nobodyさん03/06/19 04:10ID:???
>>625
/^ +$/ でも /^\x20+$/ でも /^\040+$/ でも /\Qスペース\E/ でも
ご自由に。

>>626
\s == [ \t\n\r\f]
0628nobodyさん03/06/19 04:33ID:???
>>612
5 と言っても色々あるし、Linux でも Win でも何でもいいけど、
少なくとも手元のテスト環境で問題なく動くようになってから
本番機にもっていく事が大事。
0629nobodyさん03/06/19 11:39ID:???
すみませんが、どなたか、Perlで2つのファイルの差分を抽出する
方法をお教え下さいませ。

はてなアンテナ(ttp://a.hatena.ne.jp/)でやっているような、
htmlファイルの中の更新(追加or変更)された部分だけを抜き出して
来る方法です。定番的な一番効率の良いやり方はないでしょうか?
0630nobodyさん03/06/19 11:43ID:???
>>629
ttp://search.cpan.org/search?query=diff&mode=all
0631nobodyさん03/06/19 15:15ID:???
すみませんが、perlでアクセス解析作っているのですが、
ブックマークと、URL直打ちを見分ける方法ってありませんか?
JSの力を借りなければなりませんか?
0632nobodyさん03/06/19 15:26ID:???
>>631
IEならfavicon.icoを読みにいっているかも。
って事で板違い。ヴァー。
0633nobodyさん03/06/19 15:33ID:???
>>632
板違いですか。
スマセン
ありがとうございました
063454303/06/19 20:19ID:???
こんばんは。
昨夜はありがとうございました。
家のLinuxで試して成功したので
本番機でテストしたのですが見事に失敗…
以下のように表示されていました。

syntax error near unexpected token `$_ or'

慌てて本番機のPerlのVersionをみてみたらVersion 4でした。
家のテスト環境はVersion 5だったのですが、これが原因でしょうか?

手持ちの本はVersion 5を前提に書かれていますが
エラーを返してきた部分については
特別Versionについては触れられていませんでした。
0635nobodyさん03/06/19 20:29ID:???
>>634
いまだに、4のサーバなんてやめちまえ!
0636nobodyさん03/06/19 20:48ID:???
Perl4なんてまだあるのかよ。
ある意味驚きだな。
063754303/06/19 20:48ID:???
>>635
さ、さすがにそれは…
やっぱりVersion 4は「$_」に対応していないんですか?
0638nobodyさん03/06/19 21:04ID:???
>635-636
俺のプロバスペースもPerl4だぞ。

>637
$_は使える。
0639nobodyさん03/06/19 21:04ID:???
>>638
やめちまえ!
ていうか、myもつかえないんだよね?
0640nobodyさん03/06/19 21:07ID:???
>639
うん、myは使えない。
かなり不便。
$a ||= 1;もできない。
省略形はかなりピンチかもしれないから、「-e $_ or exit(100);」は
「unless(-e $_){exit(100);}」とかにした方がいいかもしれない。
0641nobodyさん03/06/19 21:13ID:???
>>640
and/or/not 演算子は Perl4 には無かったような記憶が。
if/unless 修飾子は使えた筈。
あと組み込み関数も split とか括弧を省略出来ないものが多い。

一番いいのは赤ラクダ本を手に入れる事だが、
とりあえずコレ読んどけ。>543
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_124.html
0642nobodyさん03/06/19 21:34ID:???
4から5への改良点は、痒いところに手が届く感じのが多いから、
5に慣れてから4コンパチで書くのは辛いな
0643nobodyさん03/06/19 22:58ID:7O2enBqm
質問。
Perlで
SDBM_Fileを使ってるんですけど、
MDBM_Fileにそのまま変えられますか?
SDBMになくてMDBMにある制限みたいなものってあるでしょうか?
0644nobodyさん03/06/19 23:06ID:QrRxrm0K
sub aaa{
my $abc = 255;
&bbb(\$aaa);
}

なんか変になるんですけど、これって有効にならないんですか?
0645nobodyさん03/06/19 23:06ID:QrRxrm0K
間違えた。

sub aaa{
my $abc = 255;
&bbb(\$abc);
}

これ。
0646nobodyさん03/06/19 23:13ID:7O2enBqm
>>645
何が変になるのかわからん限りはなんとも・・・。

きたれ!
http://ex.2ch.net/test/read.cgi/entrance/1055942024/
ファイアーエンブレム風のネトゲツクローヨ
0647nobodyさん03/06/19 23:14ID:???
>>646
なんでここでそのアドレスが・・・
0648nobodyさん03/06/19 23:17ID:???
>>655
myしてある変数のリファレンスは無理だよ
0649nobodyさん03/06/19 23:25ID:7O2enBqm
>>647
なにか心当たりが?
0650 ◆hMJAPH9PWA 03/06/19 23:26ID:???
>>645
何の問題もないように見えるけど?
それが間違っていると思うのなら、間違いなく何かを勘違いしているよ。

>>648
それは問題ない。
というか、出来なきゃ困る。
065160303/06/19 23:28ID:???
>>645
sub bbb{ } が定義されてないから当然
0652nobodyさん03/06/19 23:33ID:???
>>649 ROMってるよ。がんがれ、某コテくん(?)
0653nobodyさん03/06/19 23:34ID:???
sub bbb{ } の中身がわからんとなぁ
0654恐らく03/06/19 23:37ID:???
sub bbb
{
print "なんか変\n";
}
065564503/06/19 23:43ID:???
すみません。
どっか他の所で重大な間違いをしてたっぽいので、しっかりデバック取ってきます。
065654303/06/20 00:38ID:???
>>640
できました。
下の記述でfileが無い場合は100で
fileがある場合は0で終了するようになりました。

------------------------------
#! /usr/bin/perl
@files = ("/home/path/file",);
for (@files){
unless(-e $_){exit(100);
}}
exit(0);
------------------------------

今度はファイル削除用のを作ります。

これまで相談して気になるのは、
なぜ皆さんがsystemコマンドを使わなかったのか
ということです。

お話していなかったのですが、実際のオペレーションでは
ファイル存在確認の後、ファイル削除をおこなうので
systemコマンドであればcommandを書き換えるだけで済むのかなぁと。

なにか理由があるのでしょうか?
0657nobodyさん03/06/20 00:45ID:???
>>656
簡単に言えば、systemを使わないのは特に必要ないから

それとちょっと気になるんだけど

>>621に書いてあった
>これでファイルの存在確認の方は
>終了コードをシェルに渡すことができると思うので

シェルという語が出てきてるけど、どんなことやってるの?
シェルからperlプログラムを実行して戻り値を受け取るわけ?
0658nobodyさん03/06/20 01:20ID:???
お前ら>>1読んでんのか?

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。


これから質問する奴は

1:○○
2:△△
3:××

と書け。それ以外は皆放置しろ。
どうせ>>1も読まない奴はスレ違い・板違いがほとんどだしな。
0659nobodyさん03/06/20 01:24ID:2h2vJ76G
すいません。質問させてください。

1:○○
2:△△
3:××
0660nobodyさん03/06/20 01:45ID:???
あ、ぼくもいいですか?

1:○○
2:△△
3:××
066154303/06/20 02:40ID:???
>>657
>シェルという語が出てきてるけど、どんなことやってるの?
>シェルからperlプログラムを実行して戻り値を受け取るわけ?

まさしくそのとおりです。
657さんのいうとおりの動作をさせたいのです。

それを前提にしても
汎用性という意味(?)でsystemコマンドよりも
656記載のもののほうがよろしいでしょうか?
0662nobodyさん03/06/20 03:31ID:???
 なあ、いいだろ
1:○○ だめよ、こんなところで
2:△△
3:××
0663nobodyさん03/06/20 04:00ID:PsiyBD1J
すいません。
$bst .= 'W' unless($bst =~ /W/);
の意味が分から無くて困っています。
CGIゲームで、このプログラムにより、
攻撃力が1だけ上がるのですが、
10位上げたいので。
ポイントは戦闘中だけ上がると言う事なので、
難しいんだと思いますが。
0664nobodyさん03/06/20 04:04ID:???
ゲームは分からないけど、

$bstがWにマッチしなければ、$bstにWを追加
$bst .= 'W' unless($bst =~ /W/);
0665nobodyさん03/06/20 05:04ID:???
1:自分はエロエロ画像が見たい。
2:それでグーグルとか使って検索をやってみたが・・・
3:それだとなぜかグロ画像ばかりが出て上手くイかなかった。
0666nobodyさん03/06/20 06:09ID:???
>>665
解決:一つエロエロサイトを見つけて、そこのリンク辿ってがんばれ。
マジレス:くだらんネタはよせ。
■ このスレッドは過去ログ倉庫に格納されています