Perlコーディング初心者質問スレ Part 56
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0482nobodyさん
2007/11/02(金) 17:17:33ID:???すげー!、シェルスクリプトですよね?
sshができない場合はこんな感じで利用すればいいのかな
system("nkf -s log.txt > log.sjis.txt");
1つ気になるのがjcode.plなど元の文字コードを指定するのがあると思うのですが、
&jcode::convert(\$_, 'sjis' ,'utf8');
nkfでは気にしなくても自動判別完璧なのでしょうか?
0483nobodyさん
2007/11/02(金) 17:34:58ID:???0484nobodyさん
2007/11/02(金) 17:51:47ID:???use Perl6::Slurp;
use Jcode;
$c = slurp "log.txt";
Jcode::convert(\$c, "sjis", "utf8");
open($fh, ">", "log.sjis.txt");
print $fh $c;
>>482
jcode, Jcode, nkfは、判別できる場合は判別してくれる。
0486nobodyさん
2007/11/05(月) 07:24:22ID:???コマンドプロンプトだとnslookup -> set type=***
UNIXならhost -t ***
でクエリタイプを設定できるんですけど、PERLの場合はどうやるのでしょうか。
0487nobodyさん
2007/11/05(月) 10:55:44ID:???http://search.cpan.org/~olaf/Net-DNS-0.61/lib/Net/DNS.pm#Find_the_nameservers_for_a_domain.
0488nobodyさん
2007/11/05(月) 11:20:15ID:6nXAnQ+nopen(FILE,">".$workFname) or die "Cannot Output File: ";
あらかじめファイルを持たせておいて、書き込み権限を与えておけば
成功しますが、新規にファイルを作成できません。
どうすればいいのでしょうか。
0489nobodyさん
2007/11/05(月) 12:21:09ID:???0491nobodyさん
2007/11/05(月) 13:19:35ID:???0492nobodyさん
2007/11/05(月) 13:22:45ID:???できれば相対パスのままで動くようにしたいです。どうすれば解決できるか分かる
方はおられませんか。まあ、あまり解決策が複雑なら、とりあえずあきらめてこの
ままにしておくつもりですが。
0493nobodyさん
2007/11/05(月) 14:36:06ID:???まず「何を」相対パスにしようとしているのかくらい書こうぜ。
あと「自分の環境」は書かなきゃ誰にも伝わらない。
0494nobodyさん
2007/11/07(水) 09:25:24ID:R3XG8Srf0496nobodyさん
2007/11/07(水) 11:46:06ID:R3XG8Srf#!perl/bin/perl
use strict;
sub kansu{
my $ref1 = shift;
my $value1;
foreach $value1($$ref1) {
print $value1 . "\n";
}
}
sub main{
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
usort_kansu(@databox1);
}
main();
0497nobodyさん
2007/11/07(水) 11:47:42ID:???正: kansu(@databox1);
0498nobodyさん
2007/11/07(水) 12:36:16ID:???「言語的意味で」正しく挙動させるには
foreach $value1($ref1) {
(多分)あなたの望んだ挙動にするには
ソースの殆どに手を入れる必要がある。
∴ 本読んでからどうしても分らんかったら
質問し直せ
0499nobodyさん
2007/11/07(水) 14:24:36ID:???#!perl/bin/perl -w
use strict;
sub kansu {
my $ref1 = shift;
# my $value1;
foreach my $value1 (@$ref1) {
print $value1 . "\n";
}
}
sub main {
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
kansu($ref1);
}
main();
0500nobodyさん
2007/11/07(水) 15:22:14ID:vLJSXT0R.qmailからperlスクリプトを呼び出しているのですが、その場合エラーログを取るにはどうしたらよいのでしょうか?
不正終了しているようなのですが、原因がつかめません。
0501nobodyさん
2007/11/07(水) 15:43:21ID:???if ($@) {
open(LOG, ">>/path/to/ログファイル名") or die;
print LOG "WARNING: $@";
close(LOG);
}
こういうスクリプトをqmailから呼び出せばどーよ
>499
forearch行を書き換える条件だからforearch my $value (@_){ って書いて欲しかったのかと・・
0502501
2007/11/07(水) 15:59:10ID:???こうか
0504nobodyさん
2007/11/07(水) 18:20:14ID:???ログが見えないならプログラムを置くべきではないと思う。
0506500
2007/11/07(水) 19:59:45ID:???qmailのログとはmaillogでしょうか?
スクリプトからは何もログを吐いていないんです。
sudoでapache権限で実行してるからログ吐かないのかな。
0507nobodyさん
2007/11/07(水) 20:05:11ID:???0510500
2007/11/07(水) 22:29:30ID:???いえ。
.qmail内でperlのみsudoしてapache権限で動かしてます。
qmailはvpopmail権限で動かしてますよ。
>>507さんでログ取れました。m(__)m
0511nobodyさん
2007/11/09(金) 15:33:58ID:???0514nobodyさん
2007/11/09(金) 17:49:37ID:???0515nobodyさん
2007/11/09(金) 18:08:33ID:???0516nobodyさん
2007/11/09(金) 18:57:53ID:???0518nobodyさん
2007/11/09(金) 19:09:09ID:8S2oyKnmuse dan;
で解決するよ。
0519nobodyさん
2007/11/09(金) 19:26:50ID:???0520nobodyさん
2007/11/09(金) 21:31:54ID:???0521nobodyさん
2007/11/09(金) 22:28:46ID:???0522nobodyさん
2007/11/09(金) 23:35:40ID:8S2oyKnm0523nobodyさん
2007/11/09(金) 23:39:07ID:???0524nobodyさん
2007/11/10(土) 10:49:28ID:Z9OcedPCさらにその圧縮ファイルを解凍するスクリプトを作りたいです。
例えば、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:???はい。
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:???どうすればいいんでしょうか。
0529nobodyさん
2007/11/11(日) 14:32:10ID:4iiY3aOIurlからファイル名だけを取り出したいです。
例えば、$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 とかの引数は考えなくていいよね?
0531529
2007/11/11(日) 14:47:19ID:???レス有難うございます。
>ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。
なるほど。でも頭では理解できてもそれをコーディングするとなると・・・
.*の部分を弄ればいいのかなぁ。
>あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
はい、このパターンは今回ありえないっす。
0532529
2007/11/11(日) 14:58:10ID:???if( $url =~ /\/([^\/]*\.lzh)$/ ){
正規表現すげー
>>530さんアドバイスありがとうございました。
0533nobodyさん
2007/11/12(月) 08:03:25ID:???0534nobodyさん
2007/11/12(月) 16:33:29ID:XNEEDQVz最初、linuxの fileコマンドを使用していたのですが誤認識がよくあり使えません。
バイナリなのかテキストなのかだけ分かればいいのですがperlでそれを行うにはどのようにしたら良いのでしょうか?
0535nobodyさん
2007/11/12(月) 16:42:39ID:???0536nobodyさん
2007/11/12(月) 18:17:28ID:XNEEDQVz有難う御座います。
試してみましたが、EUCだったり10文字程度のcp932などの場合に誤認識するようです。
0537nobodyさん
2007/11/12(月) 18:33:52ID:???それ以外だと各文字コードの仕様を調べて
全データがそれに矛盾してないか判断するしかないと思
0538nobodyさん
2007/11/12(月) 18:39:12ID:???0539nobody
2007/11/13(火) 03:52:36ID:fKqfq45H上のサイトのようなゲームを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>
0540nobody
2007/11/13(火) 03:57:04ID:fKqfq45HHTMLのフォームから情報を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:???提出日まで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:???0547nobodyさん
2007/11/13(火) 11:10:10ID:???元の文字コードがUTF-8のときは問題なく表示できるのですが、
文字コードの判別を含めてやる場合どうやったらいいのでしょうか?
Perlのバージョンは5ですが、プロバイダ(@nifty)のサーバーのため標準モジュールを使用できません。
いきなり変換が難しいならUTF-8か否かを判別できれば、
UTF-8の場合→直デコード
UTF-8でない場合→直デコード→jcode.plで変換
でいいのかもと考えているのですが、UTF-8か否かの判別法がわかりません。
よろしくお願いします。
0548nobodyさん
2007/11/13(火) 15:19:48ID:lcS1D/Cp一応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:???0550nobodyさん
2007/11/13(火) 15:56:31ID:???0551nobodyさん
2007/11/13(火) 16:29:42ID:???こんな感じはどうよ。適当に書いたからちゃんと動くかどうか知らんけど。
#!/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;
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ここを見ながらコマンドプロンプトを操作しているのですが
ダウンロードされる段階まで行っても
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:???エラーの原因は@INCが空になってるから。なんでそうなってるのかは知らん。
ActivePerlを入れ直してみたら?
あとここはコーディングスレだからスレ違いだと思わなくもない。
0557nobodyさん
2007/11/17(土) 20:58:37ID:???どうすればいいんでしょうか。
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:???0561nobodyさん
2007/11/18(日) 19:50:49ID:???0562561
2007/11/18(日) 19:51:25ID:???「ですか?」が抜けた。
すまぬ
0564nobodyさん
2007/11/19(月) 06:13:08ID:s0DcKkZMいまからやるならperlは覚えたほうがいいですか?
0565nobodyさん
2007/11/19(月) 06:19:02ID:???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);
0568576
2007/11/20(火) 14:43:38ID:PLctc9niWin32-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:???たとえば。
$ perl -e '$s = "AABABABBBA";while($s=~s/BA/AB/g){}print $s;'
0572nobodyさん
2007/11/23(金) 22:00:18ID:???その場合、これ以上置換できなくなるまで「$s =~ s/BA/AB/g;」の処理を行わなければならない。すなわち、ループである。
s/BA/AB/g;は、置換を行った回数を返す。つまり、0を返すまで処理を継続したいのだから、while文が使える。
したがって、次のようになる。
while($s =~ s/BA/AB/g;){}
whileのあとの{}の中に何も入っていないが、これでお望みどおり動くようである。
print join "", sort split "", "AABBABABBBABAABBAABABABABA";
0575nobodyさん
2007/11/24(土) 07:56:01ID:???遅レス。
他の文字が存在しないと云う条件下なら、素直に文字数カウントするって手もある
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:って文字が表示されて飛ばないんですけど
なんでしょうか?
普通なら飛ぶのに飛びません・・・。
誰か分かる方が居れば教えてください。
0579nobodyさん
2007/11/25(日) 17:55:01ID:???こっちはエスパーじゃないんだからさw
0580nobodyさん
2007/11/25(日) 18:30:55ID:???http://www.uploda.org/uporg1129660.txt
これなんですが上手く動作しなくて・・・。
0581nobodyさん
2007/11/25(日) 18:47:07ID:???print "Content-type: text/html\n\n"; # データ形式
を書いてるのが不味いような気がするのは気のせいかな。
■ このスレッドは過去ログ倉庫に格納されています