Perlコーディング初心者質問スレ Part 42
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/05/25(水) 06:36:28ID:PVpWgcdf【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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 しておけ、って感じ。
0797nobodyさん
2005/07/23(土) 23:17:28ID:???0798nobodyさん
2005/07/24(日) 00:37:08ID:???0799nobodyさん
2005/07/24(日) 06:19:52ID:???ttp://allabout.co.jp/career/cgiperl/closeup/CU20050131A/index4.htm
500エラーがでますた。
鯖はxrea パ−ミッションは755
どのへんが問題でしょうか?
0800nobodyさん
2005/07/24(日) 07:27:11ID:???0802801
2005/07/24(日) 08:48:27ID:???モジュールも入ってるし。
恐らくdataディレクトリとか作ってないんだろ。
0803nobodyさん
2005/07/24(日) 08:51:23ID:???0804nobodyさん
2005/07/24(日) 12:28:38ID:???0805nobodyさん
2005/07/24(日) 18:07:55ID:???AddType cgi-script-debug .cgi
これでデバッグモード
スペルは違う鴨
0806799
2005/07/24(日) 19:04:15ID:???Can't locate XML/RSS.pm in @INC (@INC contains: ./mylib /usr/lib/perl5/5.00503/i686-linux /usr/lib/perl5/5.00503 /usr/lib/perl5/site_perl/5.005/i686-linux /usr/lib/perl5/site_perl/5.005 .) at tmp.pl line 6.
BEGIN failed--compilation aborted at tmp.pl line 6.
dataディレクトリは作ってあります
モジュールがないってことなんでしょうか?
でもxreaではインストールしてあるみたいですが。
0807nobodyさん
2005/07/24(日) 20:16:20ID:???0808nobodyさん
2005/07/24(日) 21:14:47ID:???この根拠は?
0809nobodyさん
2005/07/24(日) 21:24:43ID:???ttp://sb.xrea.com/showthread.php?t=9748
0810nobodyさん
2005/07/24(日) 21:42:23ID:???799 の使っているサーバは s151 なのか? s151 には Perl 5.8.7 が
入っている筈だが、何故 @INC には 5.005 のディレクトリしか無いんだ?
http://www.s151.xrea.com/server_info.cgi
XML::RSS は Pure Perl な一ファイルのモジュールなんだから、
無ければ自分のスペースに置いて use lib すればよかろうに。
http://search.cpan.org/~kellan/XML-RSS-1.05/
スレ違いな話題なんでこれ以上続けたいなら下のスレへでも行ってくれ。
CGI設置について質問 【Part2】
http://pc8.2ch.net/test/read.cgi/php/1104624784/
0811nobodyさん
2005/07/24(日) 21:56:39ID:???0812nobodyさん
2005/07/24(日) 22:08:41ID:???0814nobodyさん
2005/07/25(月) 03:28:32ID:???ここの 318 書いた俺の方が勝ち組
0815nobodyさん
2005/07/25(月) 15:03:30ID:???local ($hogehoge , %hoge2);
というふうに、local宣言をしても、有効範囲の宣言がされていないぞ
(゚Д゚)ゴルァと言われてしまうのですが、localを使うにはstrictをあきらめ
なければいけないのでしょうか?
尚、my ($hogehoge ,%hoge2);だとうまくいきます。
0816nobodyさん
2005/07/25(月) 15:22:26ID:???0817nobodyさん
2005/07/25(月) 15:28:18ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq7.html#What_s_the_difference_between_dy
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html
0818nobodyさん
2005/07/26(火) 01:51:12ID:???持続的なコネクションを確保する場合方向性としては、どっかのPORTにlistenする
デーモン的なプログラムとユーザーからのアクションやセッションを司るプログラムを
組み合わせるような方法がベターなのでしょうか。
mod_perlもいいかなと思ったのですが必ず前回アクセスしたプロセスにアクセス出来るとは
限らないので無理そうです。
listenしなくても常駐させてpidを記録しておき、別プログラムからpidの情報を元に操れたり
する事は出来ますか?
0819nobodyさん
2005/07/26(火) 01:54:16ID:???0820nobodyさん
2005/07/26(火) 03:48:28ID:???なんとか通過させたく、用意したフォームからフォームから
Basic認証情報を入力させて、環境変数のAUTH_USER、
AUTH_PASSWORDを強制的にセットさせるようなスクリプトを
考えております。
環境変数をCGI側で設定してBasic認証領域内にアクセスさせる
ような仕組みは可能でしょうか。
もしも可能であれば、ご教示いただきたく思っております。
まとまりのない文章ですみません。
0821nobodyさん
2005/07/26(火) 16:42:49ID:EJMHsz5R$hara =1;
while ( 1 ){
for ( $i = 1; $i <= 3; $i++ ) {
$index0= rand @array;
$index1= rand @array;
$index2= rand @array;
my $tmp0=$array[$index0];
my $tmp1=$array[$index1];
my $tmp2=$array[$index2];
$shibi0 = $tmp0;
$shibi1 = $tmp1;
$shibi2 = $tmp2;
}
if( $shibi0 != $shibi1 && $shibi0 != $shibi2 && $shibi1 != $shibi2 &&
$hara != $shibi0 && $hara != $shibi1 && $hara != $shibi2
){last;}
}
0〜9の中から3つの数字をランダムで選びだし、
重複せず、かつ$haraに代入されている数字とは異なる物が3つ揃った時に
ループを抜けるというスクリプトです。
これで動作はするのですが、あまりにも原始的というか
もう少しスマートなやり方だと、どういう風に組めるでしょうか?
自分の頭だとこれでいっぱいいっぱいでした。
0822nobodyさん
2005/07/26(火) 17:06:05ID:???過去ログで似たのでてきた気がする。 どこだかは知らないけど。
まあ、取得した値の要素を、一度配列から抜くとか、ハッシュでフラグたてたりしたら、絶対重複しないと思うけど?
>>821 の $shibi0-2 を出したいだけじゃなかったら意味ないけど、例えば
my @array = (0 .. 9);
my @shibi = ();
my %flag = ( 1 => 1 ); # >>821 の $hara の "1"
for (my $i = 0; $i < 3; $i++) {
my $tmp = $array[ rand @array ];
redo if (exists $flag{$tmp});
$flag{$tmp} = 1;
push (@shibi, $tmp);
}
print @shibi;
0823nobodyさん
2005/07/26(火) 17:17:17ID:???標準モジュールのList::Util使ってこういうのも。
use List::Util 'shuffle';
@array = (0..9);
$hara = 1;
($shibi1, $shibi2, $shibi3) = splice @{[shuffle grep { $_ != $hara } @array]}, 0, 3;
0824821
2005/07/26(火) 17:18:07ID:???@array( 0..50 )とあるとしたら
0〜10、11〜20、21〜40、41〜45、46〜50それぞれ5セットで上のスクリプトを繰り返して
セット1からは$shibi0〜$shibi2、セット2は$shibi3〜$shibi5のそれぞれ3コ
セット3から$shibi6〜$shibi9の4コ、セット4と5は$shibi10、$shibi11の1つずつ
セットごとに、合計12コの変数を・・・これもforで繰り返させる方法があるんでしょうか?
0825nobodyさん
2005/07/26(火) 18:20:53ID:???つーか何が"補足"だよ。"付け足し"じゃねーか。
>>822 や >>823 使って、考えればできるだろ。
付け足すなら考えて試してから書けよな。
まあ、答えるなら、そのセットと繰り返しを関連付ければいいだけ。
>>822 で言えば、
@hoge = (
{ array=>[0..10], times=>3 },
・・・
[ array=>[46..50], times=>1 ],
);
とかやって、
for (my $h = 0; $h < @hoge; $h++) {
my $set = $hoge[$h];
# ここから >>822 のソースを参考
my @array = @{ $set->{array} };
# 中略
for (my $i = 0; $i < $set->{times}; $i++) {
# 以下略
って置き換えたりするだけだべ。
細かいところはもう知らん。
0826nobodyさん
2005/07/26(火) 19:07:57ID:???0827nobodyさん
2005/07/26(火) 20:37:18ID:W0GVg4kD$value とした本文中のURL表記を正規表現で拾って自動リンクさせているのですが
1.この中に自分のサーバ(プロバイダ)内のURLはそのままHTMLタグでリンク、
2.外部のURLは一旦別のcgiに「別のcgi?x=URL」として送るHTMLタグにしたい
3.さらに、「=」がある場合は別変換してから「別のcgi?x=URL」とする必要があると気づきました
これまで、1.2.まではifで分けてやっていたのですが、複数のURLがあると
当然ですが一緒の条件内に組み込まれてしまいます
$value~s//g ; を複数並べることで正規表現でできるでしょうか?
本文$valueを分割して一度配列に入れ、1行ずつ処理させる方法しかないとすれば、
URLがあるごとにsplitするにはどうしたらよいでしょうか?
■ このスレッドは過去ログ倉庫に格納されています