Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0696693
2005/07/08(金) 21:16:59ID:nSk2Gtk0ありがとうございます。さっそく帰ったら試して見ます。
test3.txt内の変数の数が増えても、同じ考え方で問題ないんですよね?
0697nobodyさん
2005/07/09(土) 00:00:25ID:???そうそう、こんな感じで。
$omae = "200";
%data = ('namae' => $namae, 'omae' => $omae);
# あとは同じ
0698693
2005/07/09(土) 02:20:01ID:Kb/ss4Wfありがとうございます!
無事に動きました。
あとは、これを理解して、自分の物にします。
どうもありがとうございました。
0699nobodyさん
2005/07/09(土) 02:24:20ID:???0700nobodyさん
2005/07/09(土) 08:01:17ID:???<どうでもいこと>クォートがいらないのは"=>演算子の"左辺値が"英数字のみで構成されているとき"のみ</どうでもいいこと>
0701nobodyさん
2005/07/09(土) 09:26:13ID:???0702nobodyさん
2005/07/09(土) 09:28:58ID:???0703nobodyさん
2005/07/09(土) 12:41:54ID:???/^-?[a-zA-Z_]+\w*$/
数字で始まったり、先頭のマイナスの直後が数字だったりすると数値として解釈される。
さらにその後がアルファベットだったりすると構文エラーになる。
ハッシュの要素参照の{}も同じだね。
構文エラーになる分には気が付くからいいけど、01=>'a'とか、0_2=>'b'とか、-03=>'c'とかするとはまるよ。
0705502
2005/07/10(日) 09:22:13ID:???囲まないでもできますけど、自動でクオートしてくれてるってこと?
while(<>){
$hash{(split[0])} = (split)[1];
...
なんて。
0708nobodyさん
2005/07/10(日) 20:48:08ID:???0710nobodyさん
2005/07/12(火) 06:26:14ID:???0711nobodyさん
2005/07/12(火) 06:56:22ID:???0712nobodyさん
2005/07/12(火) 07:31:37ID:???0713nobodyさん
2005/07/12(火) 10:05:30ID:???0714nobodyさん
2005/07/12(火) 12:04:24ID:???0715nobodyさん
2005/07/12(火) 12:59:07ID:???0716nobodyさん
2005/07/12(火) 13:30:25ID:???スルーが吉。
一人二役以上で自演して荒れてるように見せるかもしれないけど、
全部スルーするのが吉。
0717nobodyさん
2005/07/14(木) 11:35:37ID:0L4aMOkE↑のMobileMiniBlog Ver1.0というのを使いたいんですが、
必要最低限の設定をしてからローカルでテストしてみても、表示結果が
</TR>
</TR>
</TR>
</TR>
</TR>
というものになってしまいます。
初期設定のままでも同じです。
サンプルでは
ttp://moritomo.k2.xrea.com/cgi/diary.cgi
のようなものになるらしいんですが…。
どこをいじればいいのか教えていただけないでしょうか?
よろしくお願いいたします。
※分からないことがあったら問い合わせるようにとスクリプトの中にメールアドレスが
書いてありますが、この作者はなんかエロいので怖くて問い合わせできません…。
0718nobodyさん
2005/07/14(木) 12:24:32ID:???CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0720nobodyさん
2005/07/15(金) 08:49:12ID:cv7TvBaQ0721nobodyさん
2005/07/15(金) 10:38:50ID:???簡単なシュミレータを作ってCGIとして公開したいと思っているのですが
一時間に一回程度のペースでクライアントのアクセスのあるなしにかかわらず
perlで更新させるにはどう書けばよいでしょうか
どなたか詳しい方ご教授お願いします。
0723nobodyさん
2005/07/15(金) 13:24:06ID:???どーすりゃいいですか。
0725723
2005/07/15(金) 14:25:42ID:???みたいなのが詰まっている配列mogeがありまして、
urlの値でいくつか重複がある(のを区別できる)ようなので、
それ含む$moge[m]を削除したいのです。
(つまり $moge[n]{url} と $moge[m]{url} が同じときに $moge[m]を削除したい)
grepを使うんでしょうが、右辺をどうやればいいのかわからないのです。
0726nobodyさん
2005/07/15(金) 14:50:58ID:???@in_array = (
{url=>'http://hoge.hoge1/',title=>'うんたら1',time=>1111111}, #<--重複
{url=>'http://hoge.hoge2/',title=>'うんたら2',time=>1111122},
{url=>'http://hoge.hoge1/',title=>'うんたら4',time=>1112222}, #<--重複
{url=>'http://hoge.hoge3/',title=>'うんたら3',time=>1112332},
);
#順番が入れ代わってもいい場合かつ後入優先
$tmp_hash{$_->{url}} = $_ for @in_array;
@out_array = values %tmp_hash;
#順番が入れ代わってもいい場合かつ先入優先
$tmp_hash{$_->{url}} = $_ for reverse @in_array;
@out_array = values %tmp_hash;
#順番を入れかえない場合後入優先
$tmp_hash{$_->{url}} = [$_,$i++] for @in_array;
@out_array = map{$_->[0]} sort {$a->[1] cmp $b->[1]} values %tmp_hash;
#順番を入れかえない場合先入優先
$tmp_hash{$_->{url}} = [$_,$i++] for reverse @in_array;
@out_array = map{$_->[0]} sort {$b->[1] cmp $a->[1]} values %tmp_hash;
0727nobodyさん
2005/07/15(金) 14:52:11ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_extract_just_the_uniqu
my %saw;
@moge = grep !$saw{$_->{'url'}}++, @moge;
0729723
2005/07/15(金) 15:24:57ID:???おおお、ありがとう!
つまりurlの値をキー名にしたハッシュを作って、値のリストを得るのか!
726のほうは725のをコンパクトにしたものと見ていいのかな。
++のところで何が起きているのかよくわかりませんが。
0732nobodyさん
2005/07/17(日) 09:29:37ID:???testサブルーチンでmyを付け忘れているのですがエラーも警告もでません。
これを回避するためにはどうのような記述をしたらいいのでしょう?
use warnings;
use strict;
my $x = 100;
test();
print "Content-Type: text/html\n\n";
print $x;
sub test{
$x = 10;
}
0733nobodyさん
2005/07/17(日) 11:00:09ID:???レキシカルスコープの有効範囲についてよく勉強することを
薦めるが、この場合最初のmy $xの有効範囲はファイルの終わり
までになるので、testサブルーチンの中からも見えてしまう。
回避するための記述の仕方はいろいろあるんじゃないかと思う
が、オレはmainサブルーチンを作ることにしてるな。これなら
testサブルーチンでエラーになるはず。
use warnings;
use strict;
main();
exit;
sub main {
my $x = 100;
test();
print "Content-Type: text/html\n\n";
print $x;
}
sub test{
$x = 10;
}
0734nobodyさん
2005/07/17(日) 11:05:17ID:???>>733
わざわざサブルーチン作らんでも。
use warnings;
use strict;
{
my $x = 100;
test();
print "Content-Type: text/html\n\n";
print $x;
}
sub test{
$x = 10;
}
で逝ける。
0735nobodyさん
2005/07/17(日) 12:07:38ID:???なるほど、サブルーチンにしろブロックにしろ
メインルーチンをブロックに押し込めて
メインルーチンとサブルーチンのスコープを外すわけですね。
一瞬、ブロックを外れたmyは、use strictの場合
警告だしてもいいんじゃないのかなとか思ったんですが
>>733-734のような書き方をすれば
1つのソースファイル内のみで定義されているサブルーチン間で
共通の変数を使いたいときにブロックの外でmyを使えば
ourみたいに他のソースファイルに影響を与えないわけですね。
てかPerl、奥深すぎ。
わかりました、ありがとうございました。
0736nobodyさん
2005/07/17(日) 13:33:31ID:???生産地、商品、価格のカテゴリーがあるとして
○生産地フォルダ→商品ファイル→価格
という方式と
○生産地ファイル→商品リスト→価格
という方式と
○生産地リスト→商品+タグ+価格でデータ取得時にタグを取るプログラムを書く方式
の3つの方法があるとしてどれくらい負荷が違うものなのですか?
私がやりたいのはもう少しだけ複雑なデータなので大差が無いならわかりやすい一番上の方式をとりたいです。
ご教授よろしくお願いします。
0739nobodyさん
2005/07/17(日) 22:31:36ID:???varsと違って、チェック機構そのものはレキシカルスコープをもつから。
0740nobodyさん
2005/07/18(月) 14:44:31ID:???アンダースコアから始まるのはプライベート、とかあるけど、
ハイフンから始まるのは何か意味ってあるの?
0741nobodyさん
2005/07/18(月) 21:50:58ID:???名前付きパラメータの場合によく見かけるな。↓なんかそうだ。
ttp://search.cpan.org/~snowhare/Class-NamedParms-1.04/lib/Class/NamedParms.pm
慣習としてどっかに書いてあるのかは知らない。
0742nobodyさん
2005/07/20(水) 09:58:16ID:???<a href="$script?mode=help&no=$no>ほげ</a>
$scriptはスクリプトURLが入ります。→OK
mode=helpはhelpモードへ入ります。→OK
しかし&以下、no=$noがうまく動作しません。
$noは任意の数字が入ります。そして、それを・・・
print "<form method='$method' action='$script' name=help_form>";
print "<input type=hidden name=no value='$in{'no'}'>";
この$in{'no'}'へ入れたいのですが、動かしてみるとvalue=''になってしまい
数値が入力されません。
どうすれば動作するようになるでしょうか・
#リンクの書き方??
0743nobodyさん
2005/07/20(水) 10:13:24ID:???ダブルクォート
0744nobodyさん
2005/07/20(水) 11:00:01ID:???2行目をコピペして以下のように$in{'no'}に
値を入れて実行すると
$in{'no'} = 100;
print "<input type=hidden name=no value='$in{'no'}'>";
結果は
<input type=hidden name=no value='100'>
となって正常に見えるので、間違ってるのはここではないな。
$in{'no'}に値はちゃんと入ってるか?
0745nobodyさん
2005/07/20(水) 11:05:58ID:???なぜ空なのかはエスパーじゃないからわからない
0746nobodyさん
2005/07/20(水) 21:03:22ID:???<a href="$script?mode=help\&no=$no">ほげ</a>
にしてみては?
下の文は no=$no が機能してないから空なんじゃないの?
0747746
2005/07/20(水) 21:04:09ID:???<a href="$script?mode=help\&no=$no">ほげ</a>
0748742
2005/07/20(水) 22:26:23ID:???シングルクオートをダブルクオートにしても、クオートなしにしても、
リンクのno=$noが入ってこない。valueが空なのです。
>>746
試してみます。
0749nobodyさん
2005/07/20(水) 22:30:25ID:8r7NrGN/print で <img> を書くと Internal Server Errorになる気がします。
何か対処方法はありますか?
0750nobodyさん
2005/07/20(水) 22:31:43ID:???0751742
2005/07/20(水) 22:31:58ID:???アンカータグの中の$noは、スクリプトの中から取得した数字で
そこはちゃんと数字が入っています。
だから本当は、このスクリプトを動かすと、
<a href="〜cgi?mode=help&1">クリックすべし</a>
という形になります。で、&以下の1の部分が、リンクタグをクリックした
先のフォームの中の
print "<input type=hidden name=no value='$in{'no'}'>";
ここに入る・・・予定だったのに入らない。
フォームボタンなんかだったら$FORM{'no'}とするところですが
0754nobodyさん
2005/07/20(水) 22:52:11ID:???0755742
2005/07/20(水) 22:54:20ID:???正直、よくわかりません(^^;
<form〜>を使ってれば$FORM〜になるという理解。
#それでも$inになってることもあるので自信は0%。
0756742
2005/07/20(水) 22:58:28ID:???・・・なんでだろう。
ぐぐりの旅へイッテキマス。
さんきゅーでした>ALL
0757749
2005/07/20(水) 23:07:02ID:???0758nobodyさん
2005/07/20(水) 23:07:39ID:???0761nobodyさん
2005/07/21(木) 06:13:37ID:???0762nobodyさん
2005/07/21(木) 10:15:20ID:???0763nobodyさん
2005/07/21(木) 19:16:23ID:00deyUp9初心者向けのperlの本を買って、カウンタや掲示板が作れる事は分かったのですが、そういう類のものは別に作りたくありません。
というか、perlを覚えるとどんな便利な事があるのか
本を読んでもいまいちピンときません。でも覚えたいです。
皆さんは「あぁ、perlを覚えてよかったな〜」と思ったのはどんな時ですか?
また、最も簡単にその気分を味わう方法があったら教えてください。
0764nobodyさん
2005/07/21(木) 20:05:00ID:???0765nobodyさん
2005/07/21(木) 20:10:56ID:???0768nobodyさん
2005/07/22(金) 12:55:10ID:Nv8MLct4どのように作れば良いかご存知でしょうか
『1時間に一度データを集計し、その結果によってデータベースを作成。
その結果をあらかじめ登録してあったメールアドレスに転送する』
というものを作成したいのです。
メールアドレスへの転送や、集計などは出来ているので
『1時間に1度CGIを起動する方法』を教えてください。
よろしくお願いします
0769nobodyさん
2005/07/22(金) 13:29:40ID:???タスクスケジューラなりcronなりに登録する。以上。
0770nobodyさん
2005/07/22(金) 15:09:15ID:???#パールのパス
無限ループ{
&ここで集計してメール;
寝る(参千六百秒);
}
テストするには
ぱーる 寝ろ!どっとしーじーあい & で起動。
0771nobodyさん
2005/07/22(金) 15:40:28ID:???0772nobodyさん
2005/07/22(金) 21:21:31ID:zirnRNb/BBSを晒しまくるアホがいるので、ダミーのCGIを置きたいのです。
で、その内容なのですが、
#!/usr/bin/perl
print <<"_HTML_";
HTMLの案内文章
_HTML_
と、たったこれだけです。
サーバーにアップするとエラーになります。
パーミッションは755にしました。
ちゃんとアスキーモードで転送しています。
コードがおかしいのでしょうか?すみませんが助力お願いします。
0773nobodyさん
2005/07/22(金) 21:28:52ID:???>>1
> 3: こんなエラーが出て上手く行かなかった。
http://www.harukaze.net/~mishima/perl/cgi-debug-env/deb-tech.html
0774nobodyさん
2005/07/22(金) 21:32:38ID:???怪しいかもしれませんが)、これに「全角、半角スペース」を追加する場合、「|$nobashi」
のあとに「|$space」といったものを追加すれば問題ございませんでしょうか。
また、スペースのコードを教えていただけますと幸いです。
$eucpre = qr{(?<!\x8F)};
$eucpost = qr{
(?=
(?:[\xA1-\xFE][\xA1-\xFE])* # JIS X 0208 が 0文字以上続いて
(?:[\x00-\x7F\x8E\x8F]|\z) # ASCII, SS2, SS3 または終端
)
}x;
$hiragana = '\xA4[\xA1-\xF3]'; # ぁ〜ん
$katakana = '\xA5[\xA1-\xF6]'; # ァ〜ヶ
$kanji = '[\xB0-\xFE][\xA1-\xFE]'; # 漢字(実際に割り当てのない領域も有るが問題はない)
$nobashi = '\xA1[\xBC\xBD\xC1]'; # ー−〜
if($name !~ m/^$eucpre(?:$hiragana|$katakana|$kanji|$nobashi)+$eucpost$/){}
0775nobodyさん
2005/07/22(金) 21:33:22ID:???ヒント。
えーとね、ブラウザに表示する内容はそれだけなんだけど、
その前にまずその内容が「どういったものか」をブラウザに伝える必要があるのだよ。
0776nobodyさん
2005/07/22(金) 21:41:20ID:zirnRNb/指摘ありがとうございます。
URL、よく読んでみます。
>>775さん
ヒントありがとうございます。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
とかじゃ……ないですよね?
他のスクリプトがどうやっているかよく見てみます。
0777nobodyさん
2005/07/22(金) 21:42:19ID:???pHPがずっといいぞ。
二日で理解できた。
0778775
2005/07/22(金) 21:53:12ID:???><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
>とかじゃ……ないですよね?
じゃないっす。
> 他のスクリプトがどうやっているかよく見てみます。
うむ、これは非常にいい心がけだ。
いくつかのスクリプトでhtml出力(とくに最初のヘッダあたり)をしてる部分を
眺めてみれば、すぐ見当がつくと思うぞ。ガンバレ。
0780772
2005/07/22(金) 22:02:16ID:???print "Content-type: text/html\n";
これですね!
>>778
さらなるアドバイスありがとうございました。
本当に助かりました。
0782nobodyさん
2005/07/23(土) 00:06:44ID:???0783nobodyさん
2005/07/23(土) 00:08:31ID:???0784nobodyさん
2005/07/23(土) 11:31:34ID:???0785nobodyさん
2005/07/23(土) 12:54:43ID:???#!/usr/local/bin/perl -w
# usage: perl script file line_num
use strict;
my($file, $target) = @ARGV;
-f $file || die "No such file: $file";
open FILE, '<' . $file or die $!;
my $line;
do { $line = <FILE> } until $. == $target;
close FILE;
print $line;
__END__
0786nobodyさん
2005/07/23(土) 18:26:12ID:???$table = '<table>'を読み込んでくれず、空白になっています。
$table = '< table>'なら読み込んでくれるしまた別の箇所なら$table='<table>'を読み込んでくれます。
print "Content-type: text/html\n\n";も最初に記述しています。
タグを消すようなサブルーチンも入れておらず頭を抱えています。
原因が分かず、変な質問文ですが考えられる原因はどういったものがあるでしょうか?
0787nobodyさん
2005/07/23(土) 18:27:32ID:???$table = ''<tr><td>めいーん</td></tr></table>';
↑上書きしている
0788nobodyさん
2005/07/23(土) 18:36:08ID:???sub table {
$table = '<table>';
$nottable = '< table>';
print $table;
print $nottable;
}
の結果が< table>のみなんです。
0789nobodyさん
2005/07/23(土) 18:42:54ID:???そうか?うちでは、
$ perl
sub table {
$table = '<table>';
$nottable = '< table>';
print $table;
print $nottable;
}
&table();
<table>< table>
だけどな。
0790nobodyさん
2005/07/23(土) 18:48:31ID:???上のサブルーチンだけを別のファイルに移して書くと結果はそうなるのですが
そのファイルを今書いてるやつで書くとそうなるので訳が分からないのです・・・
タグを消すプログラムなんて入れてないし別のファイルを参照もしてないのですが・・・
0791nobodyさん
2005/07/23(土) 18:57:01ID:???説明足らなくてすみません。
0794nobodyさん
2005/07/23(土) 20:12:58ID:???0795nobodyさん
2005/07/23(土) 20:21:46ID:???とりあえず use strict; と perl -w しておけ、って感じ。
■ このスレッドは過去ログ倉庫に格納されています