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

Perlコーディング初心者質問スレ Part 56

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/09/16(日) 19:49:43ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0514nobodyさん2007/11/09(金) 17:49:37ID:???
tokuhirom自重
0515nobodyさん2007/11/09(金) 18:08:33ID:???
Perl死んじゃうん?
0516nobodyさん2007/11/09(金) 18:57:53ID:???
(・∀・)ニヤニヤ
0517JAPU ◆lVJAPUTeX. 2007/11/09(金) 18:59:46ID:???
>>511

use utf8;
0518nobodyさん2007/11/09(金) 19:09:09ID:8S2oyKnm
>511
use dan;
で解決するよ。
0519nobodyさん2007/11/09(金) 19:26:50ID:???
tokuhirom の直近の発言をコピペすることによりスレを荒らす tokuhacks.
0520nobodyさん2007/11/09(金) 21:31:54ID:???
plaggerのソース読めって言ってるやつのほとんどはplaggerのソースが読めない
0521nobodyさん2007/11/09(金) 22:28:46ID:???
コード解説読めってならともかくコード読ませたってしょうがないだろ。Perlなんだから
0522nobodyさん2007/11/09(金) 23:35:40ID:8S2oyKnm
tokuhiromのソース読めって言ってるやつのほとんどはtokuhiromのソースが読めない
0523nobodyさん2007/11/09(金) 23:39:07ID:???
プラガー(笑)
0524nobodyさん2007/11/10(土) 10:49:28ID:Z9OcedPC
web上の圧縮ファイル(.lzh)をダウンロードして保存、
さらにその圧縮ファイルを解凍するスクリプトを作りたいです。

例えば、LWP::Simpleを使った場合
my $dat = get('http://hoge.com/071110.lzh');
の後はどう処理していけばいいでしょうか?
0525nobodyさん2007/11/10(土) 11:02:39ID:???
> の後はどう処理していけばいいでしょうか?

lha 書庫を解凍する処理を行えばよい。
0526nobodyさん2007/11/10(土) 11:03:28ID:???
>>524
はい。
http://www.google.co.jp/search?q=lzh+%E8%A7%A3%E5%87%8D+perl&ie=utf-8&oe=utf-8
0527nobodyさん2007/11/11(日) 02:16:45ID:???
2chみたいに携帯から固有のIDを作りたいんですが
どうすればいいんでしょうか。
0528nobodyさん2007/11/11(日) 07:14:50ID:???
>>527
i-mode:UTN
EZweb:HTTP_X_UP_SUBNO
Y!:UA
0529nobodyさん2007/11/11(日) 14:32:10ID:4iiY3aOI
正規表現について質問です。
urlからファイル名だけを取り出したいです。
例えば、$urlという変数に下の3つのurlがあった場合は
hoge1.html, hoge2.html, hoge3.htmlを取り出したいです。

http://localhost/hoge1/hoge1.html
http://localhost/hoge1/hoge11/hoge111/hoge2.html
http://localhost/hoge2/hoge21/hoge3.html

下のように自分でやってみたのですが、localhostの前の/から取得してしまいます。
if( $url =~ /\/(.*\.html)$/ ){
print $1 . "\n";
}

どうすればやりたい事ができますか?
教えてください、お願いします。
0530nobodyさん2007/11/11(日) 14:35:11ID:???
ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。

あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
05315292007/11/11(日) 14:47:19ID:???
>>530
レス有難うございます。

>ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。
なるほど。でも頭では理解できてもそれをコーディングするとなると・・・
.*の部分を弄ればいいのかなぁ。

>あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
はい、このパターンは今回ありえないっす。
05325292007/11/11(日) 14:58:10ID:???
条件文を下のコーディングに変更したらできました。
if( $url =~ /\/([^\/]*\.lzh)$/ ){

正規表現すげー
>>530さんアドバイスありがとうございました。
0533nobodyさん2007/11/12(月) 08:03:25ID:???
.*?も覚えたらいいとおも
0534nobodyさん2007/11/12(月) 16:33:29ID:XNEEDQVz
そのファイルがバイナリなのかテキスト(shift-jis,euc,utf8)なのかを判断するにはどのようにしたら良いのでしょうか?

最初、linuxの fileコマンドを使用していたのですが誤認識がよくあり使えません。
バイナリなのかテキストなのかだけ分かればいいのですがperlでそれを行うにはどのようにしたら良いのでしょうか?
0535nobodyさん2007/11/12(月) 16:42:39ID:???
ファイルテスト演算子
0536nobodyさん2007/11/12(月) 18:17:28ID:XNEEDQVz
>>535
有難う御座います。
試してみましたが、EUCだったり10文字程度のcp932などの場合に誤認識するようです。
0537nobodyさん2007/11/12(月) 18:33:52ID:???
\0が含まれてればバイナリでいいんでないの
それ以外だと各文字コードの仕様を調べて
全データがそれに矛盾してないか判断するしかないと思
0538nobodyさん2007/11/12(月) 18:39:12ID:???
正規表現使えばいいじゃない
0539nobody2007/11/13(火) 03:52:36ID:fKqfq45H
ttp://www.jpopfan.co.jp/uranai/uranai000.htm
上のサイトのようなゲームをperlで作りたいと思っています。
htmlのみでも十分なゲームだとは思いますが、あえてCGIゲームとして作りたいです。
(学校の授業の自由課題であるので・・・)

一応以下のようにhtmlは作ってみました。

<html>
 省略
<body>
<h1>オーケストラ楽器別診断</h1>
<p>次の質問にお答えください♪</p>
<form action="/nussknac/cgi-bin/kadai.cgi" method="post">
<dl><dt>お名前</dt>
<dd><input type="text" name="name" value=""></dd><br>
<dt>Q1. あなたはプライドが高いほうですか?</dt>
<dd><ul>
<li><input type="radio" name="answer1" value="Yes" checked>Yes</li>
<li><input type="radio" name="answer1" value="No">No</li>
</ul></dd></dl>
<p><input type="submit" name="send1" value="送信"><br></p>
</form></body></html>
0540nobody2007/11/13(火) 03:57:04ID:fKqfq45H
539の続きです。
HTMLのフォームから情報をCGIに送り、最初の質問に対してYesならAの質問、NoならBの質問・・・というように
答えによって質問を分岐させるように作りたいです。
if文でひたすら分岐するというイメージはありますが、どうすれば、送信ボタンを押した時に次の質問ページにリンクさせる事ができるかが分かりません。
質問ページは一つ一つ作りたいです。
よろしくお願いします。
0541nobodyさん2007/11/13(火) 04:18:50ID:???
そういうアルゴリズムも含めて課題になってるんじゃねーのか・・・まぁいいけどさ。
で、htmlはともかくどこまでperl書いたのよ。まさか1行も書かずに相談しにきてるわけじゃあるまい?
0542nobodyさん2007/11/13(火) 06:54:14ID:???
何日か前に別のスレでも見たけど、ここで聞いてて課題間に合うの?
0543nobodyさん2007/11/13(火) 08:58:39ID:???
あみだくじでいいのか、選択によってポイントがたまってその結果で振り分けられるのか。
色々ロジックはあると思うけど、そこら辺はどうするのかな
0544nobodyさん2007/11/13(火) 09:17:32ID:???
>542
提出日まで1〜2週間とかなら大丈夫じゃない?

その昔、C言語の授業があって、その授業終了直後に提出したら怒られたことがあったなあ(笑)
ごめん、確かに授業聞いてませんでした。
0545nobodyさん2007/11/13(火) 09:19:51ID:???
あみだくじでいいなら、
<li><input type="radio" name="answer" value="Aの質問のURL" checked>Yes</li>
<li><input type="radio" name="answer" value="Bの質問のURL">No</li>
ってして、
print "Location: answerの値\n\n";
でリダイレクトさせていけばいいだけでは?
0546nobodyさん2007/11/13(火) 10:36:02ID:???
HTMLでおk
0547nobodyさん2007/11/13(火) 11:10:10ID:???
リンク元のURLに%??%??〜が含まれてる場合に、その文字をデコードしてUTF-8として表示しようとしています。
元の文字コードがUTF-8のときは問題なく表示できるのですが、
文字コードの判別を含めてやる場合どうやったらいいのでしょうか?
Perlのバージョンは5ですが、プロバイダ(@nifty)のサーバーのため標準モジュールを使用できません。
いきなり変換が難しいならUTF-8か否かを判別できれば、
UTF-8の場合→直デコード
UTF-8でない場合→直デコード→jcode.plで変換
でいいのかもと考えているのですが、UTF-8か否かの判別法がわかりません。
よろしくお願いします。
0548nobodyさん2007/11/13(火) 15:19:48ID:lcS1D/Cp
539です。
一応perlでは以下のように作りました。
#!/usr/local/bin/perl

use CGI;
$query = new CGI;

$q1 = $query->param('answer1');
if ($q1 eq Yes) {
open(F, ">>q2.html");
} else {
open(F, ">>q3.html");
}

でもこれだとエラーが出てしまいます。
どのように直せばいいでしょうか。
リンクのさせ方など教えて下さい。
課題提出は12月までです。
違うスレには書いていないので私ではないです。
0549nobodyさん2007/11/13(火) 15:34:47ID:???
use constant Yes => 'Yes';
0550nobodyさん2007/11/13(火) 15:56:31ID:???
課題は自分でやれwww
0551nobodyさん2007/11/13(火) 16:29:42ID:???
>>54
こんな感じはどうよ。適当に書いたからちゃんと動くかどうか知らんけど。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use FileHandle;
use File::Spec;

my $cgi = CGI->new;
my $fh = FileHandle->new;
my $html_dir = '/path/to/html/dir';
my $output = $cgi->header( -type => 'text/html' );
my $fn = q{};

if ( $cgi->param('answer1') eq 'Yes' ) {
    $fn = 'q2.html';
}
else {
    $fn = 'q3.html';
}

$fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
my $data = do { local $/; <$fh> };
$fh->close;
$output .= $data;

print $output;
0552nobodyさん2007/11/13(火) 16:30:23ID:???
レス番ミスった。
誤 >>54
正 >>548
0553nobodyさん2007/11/13(火) 16:31:27ID:???
さらに訂正。
誤 $fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
正 $fh->open( File::Spec->catfile( $html_dir, $fn ) '<');
0554nobodyさん2007/11/17(土) 14:33:33ID:GlJQ98hk
http://oshiete.new-akiba.com/archives/2007/01/webarchivedlwarrick.html
ここを見ながらコマンドプロンプトを操作しているのですが
ダウンロードされる段階まで行っても
Can't locate strict.pm in @INC (@INC contents: .) at C:\Program Files \warrick\warrick.pl line8.
BEGIN failed--compilairion aborted at C:\Program Files \warrick\warrick.pl line8.
と出ます。

意味もそもそも分からないのですが、解決方法教えてください
0555nobodyさん2007/11/17(土) 15:24:40ID:???
>>554
エラーの原因は@INCが空になってるから。なんでそうなってるのかは知らん。
ActivePerlを入れ直してみたら?

あとここはコーディングスレだからスレ違いだと思わなくもない。
0556nobodyさん2007/11/17(土) 20:14:46ID:???
>>555
最新版入れてみたけど同じでした
質問スレいってきます
0557nobodyさん2007/11/17(土) 20:58:37ID:???
>>にアンカを3つだけつけたいんだけど、これだと同じとこにリンクをかけてしまいます。
どうすればいいんでしょうか。
for($i=0;$i<3;$i++)
{
$str=~s/>>[0-9]{0,10}[-]{0,1}[0-9]{0,10}/<a href="$_[1]p=$&">$&<\/a>/;
$str=~s/p=>>/p=/;
}
0558nobodyさん2007/11/17(土) 22:00:49ID:???
$i = 0; $buf =~ s/(>>\d+)/$i++ < 3 ? "LINK:$+" : $+/egs;
05595562007/11/17(土) 22:23:56ID:???
>>558
ありがとうございます。
そんな書き方知りませんでした。
05605572007/11/17(土) 22:26:54ID:???
>>559
556じゃなくて557でした
0561nobodyさん2007/11/18(日) 19:50:49ID:???
自作モジュールをロードするときに、BEGINブロックで@INCに追加してからBEGINの外でuseするのは外道
05625612007/11/18(日) 19:51:25ID:???
↑
「ですか?」が抜けた。
すまぬ
0563nobodyさん2007/11/18(日) 20:25:36ID:???
>>561-562
外道かどうか知らんが、普通は use lib でしょ。
0564nobodyさん2007/11/19(月) 06:13:08ID:s0DcKkZM
これからプログラムをやりたいと思ってます。
いまからやるならperlは覚えたほうがいいですか?
0565nobodyさん2007/11/19(月) 06:19:02ID:???
PHPでいいよ
05665612007/11/19(月) 08:54:57ID:???
>>563
ありがt
0567nobodyさん2007/11/20(火) 11:38:30ID:PLctc9ni
多重起動の禁止はできたが、解放がうまくいかない。
どこが悪いか教えてください。

#登録&多重起動禁止
use Win32::API;
use Win32::Mutex;
my $mutex = Win32::API->new("kernel32","CreateMutex",["N", "N", "P"], "N");
die "二重起動" if(Win32::Mutex->open('TestProgram123'));
$mutex=Win32::Mutex->new(1, 'TestProgram123');


#解放
my $releacemutex = Win32::API->new("kernel32","ReleaseMutex",["N"], "N");
$releacemutex->call($mutex);
05685762007/11/20(火) 14:43:38ID:PLctc9ni
自己解決

Win32-API使わなくてもできるのねぇ
0569nobodyさん2007/11/21(水) 03:27:48ID:???
むしろ何の為のラッパーだよ
0570nobodyさん2007/11/23(金) 21:52:32ID:BH2PwYj+
質問失礼します。

AとBの文字があるとき、文字列の中のBAを全てABにしたいときはどのような置換をすればいいのでしょうか?

例えば、
$s = "AABABABBBA";
と文字列があったら、
$s = "AAAAABBBBB";
にしたいのです。

$s =~ s/BA/AB/g;とすると、置換後を判定してくれないので、困ってます……
0571nobodyさん2007/11/23(金) 21:58:25ID:???
>>570
たとえば。
$ perl -e '$s = "AABABABBBA";while($s=~s/BA/AB/g){}print $s;'
0572nobodyさん2007/11/23(金) 22:00:18ID:???
>>570
その場合、これ以上置換できなくなるまで「$s =~ s/BA/AB/g;」の処理を行わなければならない。すなわち、ループである。
s/BA/AB/g;は、置換を行った回数を返す。つまり、0を返すまで処理を継続したいのだから、while文が使える。
したがって、次のようになる。
while($s =~ s/BA/AB/g;){}

whileのあとの{}の中に何も入っていないが、これでお望みどおり動くようである。
0573 ◆TWARamEjuA 2007/11/23(金) 22:31:04ID:????2BP(6825)
sortって云う手もあるよなぁ♪
print join "", sort split "", "AABBABABBBABAABBAABABABABA";
05745702007/11/23(金) 22:36:47ID:???
>>571-573
返信ありがとうございます。
無事whileを使う方法で出来ました。
0575nobodyさん2007/11/24(土) 07:56:01ID:???
>>574
遅レス。
他の文字が存在しないと云う条件下なら、素直に文字数カウントするって手もある
perl -le 'my $s = "atataaattttatatat" ; print "a" x ( $s =~ s/a/a/g ) . "t" x ( $s =~ s/t/t/g ) ;'
ま、他の文字が存在してても外側ループ一個つけるだけだけどね。

蛇足だと思ったんだが、、、、
0576nobodyさん2007/11/25(日) 15:53:28ID:???
ちょっと分からないので質問させてもらいます。
手作りで掲示板みたいなのを作ってるんですけど
Location:で二重投稿を禁止したくて書いたんですが投稿したあとにLocation:って文字が表示されて飛ばないんですけど
なんでしょうか?
普通なら飛ぶのに飛びません・・・。

誰か分かる方が居れば教えてください。
0577nobodyさん2007/11/25(日) 16:07:12ID:???
>>576
content-typeの前に書いてみ
0578nobodyさん2007/11/25(日) 16:35:27ID:???
>>577
出来ました。
ですが書き込みがされなくなりました・・・。
0579nobodyさん2007/11/25(日) 17:55:01ID:???
そもそもがどんな仕組み何だかわかんねーと答えようがねーよw
こっちはエスパーじゃないんだからさw
0580nobodyさん2007/11/25(日) 18:30:55ID:???
>>579
http://www.uploda.org/uporg1129660.txt
これなんですが上手く動作しなくて・・・。
0581nobodyさん2007/11/25(日) 18:47:07ID:???
一番最初に

print "Content-type: text/html\n\n"; # データ形式

を書いてるのが不味いような気がするのは気のせいかな。
0582nobodyさん2007/11/25(日) 18:47:57ID:???
>>581
他のところに置いたりすると上手く動作しないんです・・・。
0583nobodyさん2007/11/25(日) 18:50:17ID:???
あと、$locationって変数、どこで使ってるんだろ。
0584nobodyさん2007/11/25(日) 18:55:24ID:???
勉強し直しておいで。
0585nobodyさん2007/11/25(日) 18:55:39ID:???
あ、それは書き忘れましたがKENTWEBさんのところのをちょっと借りたやつです。
# リロード
if ($location) {
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\r\n";
print "Content-type: text/html\n";
}
print "Location: $location?\n\n";
exit;
}
これがサブルーチンのwriteの最後に置いてました。
0586nobodyさん2007/11/25(日) 18:56:09ID:???
とりあえずヒントは、
・Location: はHTTPヘッダに出力する
・ヘッダとボディの区切りは空行で示す
0587nobodyさん2007/11/25(日) 19:08:15ID:???
前も書いたけど、kentwebのってデリミタに<>使うの好きだねえ。データがでかくなってくると、
2バイトも勿体無いと思う。
0588nobodyさん2007/11/25(日) 19:10:08ID:???
>586
難しそうですが頑張ってみます。
0589nobodyさん2007/11/25(日) 21:12:48ID:???
2バイトさえ気になるような人はデミリタに何使うんだろ。
0590nobodyさん2007/11/25(日) 21:13:37ID:???
デリミタねw
0591nobodyさん2007/11/25(日) 21:51:10ID:???
タブ?
0592nobodyさん2007/11/25(日) 21:57:24ID:???
俺はタブ。excelにも貼るだけで、データやりとりできるし。
0593nobodyさん2007/11/26(月) 01:21:50ID:???
俺は適当に,にしてた
0594nobodyさん2007/11/26(月) 09:34:29ID:???
>>593
CGIでHTMLを吐く前提なら、 , を入力されると面倒なことになるんだよな。
< > なら < > ってできてしまうからいいんだけど。
0595nobodyさん2007/11/26(月) 09:35:03ID:???
↑失礼
< > なら &lt; &gt; ってできてしまうからいいんだけど。
0596nobodyさん2007/11/26(月) 17:00:07ID:???
, は&#44;でいいんじゃね?俺もタブ使うけど
0597nobodyさん2007/11/26(月) 19:49:54ID:???
ちょいと質問を。

今ソフトバンククリエイティブのCGI/perl ハンドブック第3版
のCGIサンプルで掲示板を作ったのですが掲示板にメッセージが書き込まれなかったらエラーを出そうと
思って四苦八苦しているんですがperl6はよく分からなく苦戦しています。
誰かこの本を持っていて、分かる方がいればご教授お願いします。
0598nobodyさん2007/11/26(月) 20:23:48ID:???
>>597
その本持ってないから知らないけど、本当にperl6ですか?

#このスレはご教授ってOKなんだっけ?

0599nobodyさん2007/11/26(月) 21:19:36ID:???
こんばんは。
LWPで、現在取得しているURLの情報を参照する方法ってあるでしょうか。

ttp://www.xxx.ne.jp

というURLを取得したときに、いくつかリダイレクトされて、

ttp://www.xxx.ne.jp/cgi-bin/test.cgi?id=aaaa&pass=bbbb

こんな感じのURLになってるのですが、この ? 以降の情報を取得したいのです。
$responoser->base
では、 ? より前のURLしか返してくれません。
教えてください。
0600nobodyさん2007/11/26(月) 23:26:29ID:???
>>598
その使い方も間違ってない以上、突っ込む方が野暮or空気が読めないでおk
0601nobodyさん2007/11/27(火) 03:23:29ID:???
質問します

他のサーバー上のテキストファイルを読み込ませたいのですがopen関数ではできないんでしょうか?
0602nobodyさん2007/11/27(火) 03:33:26ID:???
できない
0603nobodyさん2007/11/27(火) 03:49:49ID:???
>>601
あんたすげーな
0604nobodyさん2007/11/27(火) 06:16:45ID:???
童貞で40歳まで行ったら妖精になれるよりすごい発想
0605nobodyさん2007/11/27(火) 07:36:33ID:???
ただ、PHPでは同じような方法でできるこの不思議。
0606nobodyさん2007/11/27(火) 08:12:36ID:???
だれか599についての回答を・・・
0607nobodyさん2007/11/27(火) 09:01:18ID:???
>>599=606
リダイレクトされるためには適切なHTTPヘッダが返っているはずだからそれ調べる。
0608nobodyさん2007/11/27(火) 11:02:47ID:???
>>599 >>606
うちの環境では、3回リダイレクトを経て、?&引数がもっさりついたurlに飛ばしても、
print $response->base();
で、引数(’?’以降%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8Aとか)がついた
URLを表示できたけど・・・。

ActivePerl 5.8.8-build822(XPsp2)
LWP/5.808
0609nobodyさん2007/11/28(水) 05:14:00ID:???
ブログの自動投稿プログラムを作りたいと思ってるんですが、大まかな仕組みも分からず困っています。
どなたかご教授願えませんか?
ちなみに、用途はバーチャルな人間の日記を作りたいと思っています。

日記を出力するアルゴリズムは別に用意しますので、
それをブログの投稿画面に自動でログインして書き込むようにしたいのです。

ローカルからでも構わないのですが、
できれば安いレンタルサーバーから行えれば良いなと思ってます。

検索で『自動投稿』としたらたくさん見つかったのですが、どれもアフィリエイター用のもので、
結構値段も高いですし、記事を予め用意しないとダメなので私がしたいようには出来そうにありません。
06106092007/11/28(水) 05:16:24ID:onMmaiK+
よろしくお願い申し上げます。m(__)m
0611nobodyさん2007/11/28(水) 05:24:30ID:???
ひょっとしたら、atom っていうのを勉強したら道が開けるんですか?
0612nobodyさん2007/11/28(水) 05:26:27ID:???
日記を出力するアルゴリズム ←これがきになる
0613nobodyさん2007/11/28(水) 09:39:10ID:???
日記を出力するアルゴリズム ←ってのはもしかして勝手に日記を書いてくれるプログラムだろうか
■ このスレッドは過去ログ倉庫に格納されています