Perlコーディング初心者質問スレ Part 44
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/10/17(月) 00:47:17ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0320nobodyさん
2005/10/31(月) 01:40:06ID:???use strictは一言で言えば安全にプログラミングするためのプラグマだが…
とりあえず、一番のご利益は宣言の強制かな
my宣言をせずにいきなり変数を使おうとすると
エラーにするなどの機能を有効にする。というようなのがuse strict 'vars';
my $hoge = 'hogehoge';
print $hage; # use strict;すれば$hageは宣言されて無いのでエラー
見たいなミスを予防したりできる。
Kentは・・・まあ見本にはお勧めしないとだけ言っておこうか
0321nobodyさん
2005/10/31(月) 02:43:49ID:???いい見本は、コアモジュールのコードを読めばいいと思う。あと高いけど駱駝本
0322nobodyさん
2005/10/31(月) 02:55:53ID:???0324名無し募集中。。。
2005/10/31(月) 03:15:06ID:s3JdPwyc0325301
2005/10/31(月) 03:24:24ID:???ありがとうございます。
VBで言うところの、Option Explicit みたいな役割ってことでしょうか。
またまた質問なんですが、グローバル変数の宣言は、
$hensu;
だけでOKなんですか?
my とか local に相当する言葉はナシで良いのでしょうか。
(my と localについての解説しか見当たらないので)
検索していて our というのも見つかりましたが…
0326nobodyさん
2005/10/31(月) 03:42:25ID:???見るんじゃない、感じるんだ。
>>325
文法を 1 から 10 まで習うつもりか?
入門書か、perlsyn と strict.pm の perldoc ぐらい読んでから来いよ。
0327321
2005/10/31(月) 10:23:36ID:???ま、ああいう言いにくいことは、自分のblogで書けないからね
ここでなら言っちゃってもいいかなーって思ってぶっちゃけたw
0328nobodyさん
2005/10/31(月) 14:02:09ID:???0329nobodyさん
2005/10/31(月) 16:26:16ID:mS98tkDz<div id="aaa">から</div>までの間には、<div id="bbb">〜</div>とか<div id="cc">〜</div>とかがいっぱい入ってるんですが。。。
0330nobodyさん
2005/10/31(月) 17:16:04ID:???開きが見つかれば+1
閉じが見つかれば-1
0の時点で閉じがあれば、そこで終了。
0331ヽ(´ー`)ノ ◆.ogCuANUcE
2005/10/31(月) 17:17:06ID:???use warnings;
use HTML::TreeBuilder;
my $doc = HTML::TreeBuilder->new_from_file('test.html');
map { $_->delete() } $doc->look_down('_tag' => 'div', 'id' => 'aaa');
print $doc->as_HTML();
こんでいいかね。
0332nobodyさん
2005/10/31(月) 17:34:43ID:???<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep() や map()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文のこと) を
使うことは避けましょう。そういった関数はすべて戻り値を持っているの
ですから、それを使うべきです。戻り値に用がないのであれば、代わりに
foreach() を使ったループか system() 関数を使いましょう。
</q>
0333ヽ(´ー`)ノ ◆.ogCuANUcE
2005/10/31(月) 18:42:21ID:???あぁ、そうね。スマンカッタ。
$_->delete() for $doc->look_down('_tag' => 'div', 'id' => 'aaa');
0334nobodyさん
2005/10/31(月) 22:40:16ID:???print"OK!!\n";
}
$test =1, $sample =1,
の時変数が数字なのか文字列なのかそれとも両方混じっているのか分からない時の
演算子はどうしたら言いのでしょうか。
eqで事足りると思うのですが、文字列と数字は分けなくて演算子をつかわなくてはいけないそうなのです。
すごく初心者的な質問ですいません。
0335nobodyさん
2005/10/31(月) 22:50:00ID:???たぶん宿題かなんかなんだろうが、お前はperlの前に
まず日本語を勉強しろ。何が言いたいのかさっぱり
わからん。
0336nobodyさん
2005/10/31(月) 22:56:00ID:???使わなくてはいけない、ではなくて自分がその中身をどう扱いたいか。
数値として扱いたいなら==を使えば良いし、文字列として扱いたいならeqを使えば良い。
数値として扱うというのは、"1.0"と"001"みたいなのも同じ1とする。
文字列として扱うというのは、これらを別のものとして扱うということだ。
0337336
2005/10/31(月) 23:01:33ID:???数値として扱えない文字が入っているのに数値として扱おうとする場合、
それ以降は無視される(1q3 => 1)
数値が入っているか文字列が入っているかわからないときに比較したいということは、
1q3と1axが同じ、と判断されちゃまずいということだよな。なら文字列として扱えば良い
0338334
2005/10/31(月) 23:43:09ID:???演算子で数字と文字列同じように使えるeqの方が便利だからと言う理由でeqを多く使っていたのですが、
計算するわけでもないので、無理して==を使う必要がなく、「いけないではなくどう扱いたいか」で
凄く納得がいきました。
解りやすく説明していただきありがとうございます。
0340334
2005/11/01(火) 01:06:49ID:???基礎的過ぎて詳しく説明しているところがあまりなかったので。
ありがとうございました。
0341nobodyさん
2005/11/02(水) 15:33:18ID:lpDOmIjlCGIからCSVを読み込むにはどのようにすればよいでしょうか?
お願いします。
0342nobodyさん
2005/11/02(水) 16:22:11ID:???Socketモジュール系を使う
ftp.plライブラリを使う
0344341
2005/11/02(水) 16:38:32ID:lpDOmIjl返信ありがとうございます。
ftp.plライブラリはどのようにして使うんでしょうか?
また、テキストファイルを定期的に更新したいんですが
どのようにすればよいでしょうか?
お願いします。
0346345
2005/11/02(水) 16:42:13ID:???「ぐぐる」か「ググる」方が的確かl。
0347nobodyさん
2005/11/02(水) 16:45:10ID:???グルルは
0348nobodyさん
2005/11/02(水) 17:19:18ID:???も少し詳しく書かないと分からないよ。
> また、テキストファイルを定期的に更新したいんですが
> どのようにすればよいでしょうか?
環境は? win? unix?
また、CGIスクリプトから更新したいの? 他のプログラムから?
0349nobodyさん
2005/11/03(木) 17:31:58ID:???if($cgi -> param(save)){
open(OUT,"> ./test.dat") || die;
$cgi -> save(OUT);
close(OUT);
}
このように,テキストエリアとチェックボックスのフォームデータを保存して,
別のcgiファイルで,読み込みをしています.
#フォームデータの読み込み
$file = "./test.dat";
open(IN,$file) if (-f $file);
$cgi = new CGI(IN);
close(IN);
テキストエリアはきちんと保存値が表示されたのですが,
チェックボックスが全て未チェックの状態になってしまいます.
なにかチェックボックスでは処理が必要なのでしょうか?
0350nobodyさん
2005/11/03(木) 17:50:23ID:???<input type="checkbox" name="hoge" value="hage" checked>
0351nobodyさん
2005/11/03(木) 17:51:21ID:???チェックボックスをチェックOn状態にするにはchecked属性が必要というのは理解してる?HTMLの話。
CGI側はvalueを複数受け取るけどね。
0352nobodyさん
2005/11/03(木) 17:54:36ID:???pirnt $保存値 eq '保存値'
? qq|<input type="checkbox" name="hoge" value="hage" checked>
: qq|<input type="checkbox" name="hoge" value="hage">|
;|
0353nobodyさん
2005/11/03(木) 17:56:14ID:???事故レスorz
pirnt $保存値 eq '保存値'
? qq|<input type="checkbox" name="hoge" value="hage" checked>|
: qq|<input type="checkbox" name="hoge" value="hage">|
;
0354nobodyさん
2005/11/03(木) 18:50:59ID:???0355nobodyさん
2005/11/03(木) 21:48:20ID:???そうやって,デフォルト値を操作して,チェックを入れた状態で表示するのではなく,
$cgi = new CGI (IN);
こうやって,ファイルを渡してあげて,保存値を反映したいのです.
テキストエリアではこの方法が上手く使えたのですが,
チェックボックスでは保存値が反映されなかったのです.
どうにかして,チェックボックスに保存値を反映したいのですが,どうすれば良いのでしょうか?
という趣旨でした.混乱させてもうしわけありませんでした.
0356nobodyさん
2005/11/03(木) 23:42:33ID:???ドキュメントを熟読して問題を切り分けよう。
http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod
1. フォームから送られてくるデータはプログラムに渡される時点で
コントロールの種別に関係なく name=value の形になっているので、
テキストエリアなら受け取れるがチェックボックスでは受け取れない
という事が起こるならそれはフォームの書き方かブラウザがおかしい。
2. save メソッドはドキュメントにあるように human readable な形で
書き出してくれるので、まず全てのデータが正常に受け取れ、且つ
書き出せているかを確認。更にファイルハンドルを渡して生成した
CGI オブジェクトが全ての保存値を読み込めているかを Vars メソッド
等で確認。ちなみに >>349 の読み込みコードはファイルの読込権限
が無いと open に失敗するのでエラーチェックになっていない。
3. 読み込んだデータは 1. と同じく名前と値のペアの集合でしかない
ので、保存値を反映したフォームを出力したいなら、それらを適切な
要素に当てはめ直す作業が必要。→ >>350-353
0357nobodyさん
2005/11/04(金) 01:23:13ID:???順を追って確認してみます.
特にVarsの使い方を教えていただき感謝いたします.
0358nobodyさん
2005/11/04(金) 10:40:02ID:???保存値はちゃんと渡せていましたが,チェックボックスの生成方法がオブジェクトを介さずに
CGI::checkbox と行っていたためでした.
みなさんほんとうに有り難うございました.
0359nobodyさん
2005/11/04(金) 18:07:49ID:???変数の後ろの文字列も含めて変数と解釈されてしまいます。
"${str}文字列"
"$str\文字列"
$str . "文字列"
などのようにエスケープなり逐一処理するしかないのでしょうか?
0361nobodyさん
2005/11/04(金) 22:23:15ID:???CPAN のエラーが出てモジュールを入れられなくてコマってます。
--01:20:02-- ftp://ftp.perl.org/pub/CPAN/authors/id/M/MS/MSCHWERN/CHECKSUMS.gz
(試行:18) => `-'
ftp.perl.org[163.143.1.21]:21 に接続しています... 接続しました。
anonymous としてログインしています...
サーバの応答にエラーがあるので、接続を終了します。
再試行しています。
こんなのがでて、ずっと先へ勧めません。
いった移動してよいやらこまってます。
FTPへ手動での接続はできているんですけど・・・
Convert::UUlib
Convert::TNEF
あたりも、みんな ftp/perl.org への接続で失敗してるようです。
どなたかお知恵を拝借できればと思います。
よろしくおねがいします。
0362nobodyさん
2005/11/04(金) 22:45:51ID:???http://www.ss.iij4u.or.jp/~somali/web/_ppm.html
0363nobodyさん
2005/11/05(土) 03:57:34ID:???文字列$commentがあって、
while($comment=~m//g){}を使って<tag>または</tag>を順々にマッチさせたいのです。
んでマッチしてから<tag>と</tag>のどちらがマッチ…
あ、わかった…$&で判定できるんですね…
鬱だ死のう
0364nobodyさん
2005/11/05(土) 04:13:08ID:???0365nobodyさん
2005/11/05(土) 04:14:32ID:???foreach( $comment =~ /<.*?>/g ){ print "tag = $_\n"; }
みたいに先にリストに展開するもよし
0366nobodyさん
2005/11/05(土) 23:49:03ID:???#保存ボタンが押されたらデータをファイルに保存する
if(($cgi -> param(add)) && ($cgi -> param(yomi)) && ($cgi -> param(kanji))){
open(OUT,">> $file") or die;
$kanji = $cgi -> param(kanji);
$yomi = $cgi -> param(yomi);
$data = "$kanji\t$yomi\n";
$cgi -> delete_all();
print OUT $data;
close(OUT);
}
param(add)には,submitボタンの値,yomiとkanjiにはテキストフィールドの値が入っています.
保存ボタンが押されるとちゃんと,ファイルにデータが追加されるのですが,
保存ボタンを押して,リロード(F5を押す)を行うと,データが繰り返し追加されてしまいます.
delete_all()して,Varsでもパラメータは消去されているのを確かめたのですが,
リロードすると,やはり値が繰り返し追加されてしまいます.
0367nobodyさん
2005/11/05(土) 23:53:00ID:???続き…
delete_allを行ったにもかかわらず,値が追加されるということは,どこかに値が保存されている
ということだと思いますが,それはどこにあるのでしょうか?
よろしくお願いします.
0368nobodyさん
2005/11/05(土) 23:56:09ID:???解決策はググルとたぶん見つかる
どっかで見た
0369nobodyさん
2005/11/06(日) 04:41:46ID:???0370nobodyさん
2005/11/06(日) 14:09:39ID:???$comment =~ s/<.*?>//gs;
これだけでは何か穴がありますか?
0372366
2005/11/06(日) 20:09:02ID:???以前のログを参照して,同じ投稿がないかチェックするようにして,二重投稿を防ぐようにして解決しました.
みなさんありがとうございました.
0373nobodyさん
2005/11/07(月) 11:47:17ID:92Mo7mCMDBI::Pg使用し、1度の接続で下記要件を満たすSQL文を教えて下さい。
SQLではなく、Perl+DBIのプログラミング方法で可能であれば、その方法を教えて下さい。
顧客テーブルと購入履歴テーブルがあります。
顧客一覧を出力する時に、顧客ごとに購入件数も表示したいです。
顧客一覧をwhile($hash= $sth->fetchrow_hashref){}で取得し、
whileの中でさらに、$hash->{hoge_no}から購入履歴をSELECTしたのですが、
うまくいきません。お願いします。
0374nobodyさん
2005/11/07(月) 12:30:03ID:???>>1
Perl::DBI
http://pc8.2ch.net/test/read.cgi/php/1015943725/
0375nobodyさん
2005/11/07(月) 12:36:56ID:???それよりこっちでしょ。SQL文一つでできるし。
0376nobodyさん
2005/11/07(月) 13:21:51ID:???Data::Dumperモジュールなどを使ってハッシュ内容をダンプしてみれ。
0377nobodyさん
2005/11/07(月) 21:52:51ID:ErqtfEJb画像の「横幅」を判別して設定値以上なら縮小
設定値以下ならそのまま表示というのをしたいです。
2:
if文で何とかなると思い、扱えるように勉強しましたが、
「画像の横幅を判別する」というのはどうやってやったらいいのか・・・。
ヒントだけでも構いません。宜しくおながいします。
0379nobodyさん
2005/11/07(月) 21:59:49ID:ErqtfEJb即レスどうも
と言うことはできるんですね。
勉強してきます。
0380nobodyさん
2005/11/07(月) 22:07:40ID:???0381nobodyさん
2005/11/07(月) 22:16:16ID:???0382nobodyさん
2005/11/07(月) 22:22:21ID:???横幅取得くらいなら自前コーディングで十分。
0383nobodyさん
2005/11/07(月) 23:54:29ID:???0387nobodyさん
2005/11/09(水) 07:29:42ID:???すごい久し振りにCGIをうPしたら、まったく忘れていたらしくエラーが出てしまいます。
しょうがないので、初心に返ってhello perlを出力しようとしたら、これもエラーです。
むかついたので、別に契約してあるプロバイダにCGIチェッカがついてるので
うPして何がおかしいか調べたら、
ファイルの先頭が
#!/bin/perl
#!/usr/bin/perl
#!/usr/local/bin/perl
でないか、CGI プログラムが ASCII モードで転送されていません
だそうです。????
ちなみにソースは
#!/usr/bin/perl
# HTML表示
print "Content-Type: text/html\n\n";
print "<HTML><HEAD>\n";
print "<BODY>\n";
print "Hello Perl World!\n";
print "</BODY>\n";
print "</HTML>\n";
ASCII モードになってないんですかね?
秀丸でファイル名:hoge.cgi ファイルの種類:その他 文字コード:自動選択
で保存したものです。何年ぶりかなので何か忘れてるのかもしれません。
ど素人で済みませんがお願いします。
0388387
2005/11/09(水) 07:30:43ID:VFhSh5VA0390387
2005/11/09(水) 08:05:29ID:5otQfz0T0391387
2005/11/09(水) 08:16:09ID:5otQfz0Twakwakの解析が逝かれてるのですかね?
0392nobodyさん
2005/11/09(水) 08:53:46ID:???0393nobodyさん
2005/11/09(水) 09:06:00ID:BFWlWPsiがエラーです。
多分正規表現の指定がおかしいと思います。
0394nobodyさん
2005/11/09(水) 09:29:22ID:???正規表現なら
@imglist = grep /\.jpg$/, readdir DIR;
ワイルドカード使おうとしてるところを見るとこのへんと混同してるのかも
@imglist = glob("*.jpg");
@imglist = <*.jpg>;
0395nobodyさん
2005/11/09(水) 11:29:02ID:???ちゃんとASCIIモードで転送しているのか?
ファイルの先頭に変なバイナリが付いていないかバイナリエディタ等で確認したのか?(UTF-8保存とかね)
0396nobodyさん
2005/11/09(水) 11:51:52ID:???> ファイルの先頭が
> #!/bin/perl
> #!/usr/bin/perl
> #!/usr/local/bin/perl
> でないか、
このメッセージは、列挙された3つの行のうち好きなものを書けば
いい、という意味ではなく、サーバに対して指定された、何れか一つの行を
書かなきゃだめ、ということだと思うが。
#!/usr/bin/perl
は本当に正しいのかな?
0397nobodyさん
2005/11/09(水) 18:03:19ID:???ttp://www.wakwak.com/info/connection-setup/ftp/custom-cgi.html
0398nobodyさん
2005/11/09(水) 18:24:22ID:???ASCIIモードかどうかは、文字コードとかの問題じゃなくて
FTP転送の問題ジャマイカ?
ていうかここまで来るともはやスレ違い。
0400nobodyさん
2005/11/10(木) 00:00:36ID:???PHPでNet_DNSBLを使っていて、PerlでもDNSBLチェックをしたいです。
0401nobodyさん
2005/11/10(木) 01:43:05ID:???こんなんとか。
http://search.cpan.org/~tjmather/Net-DNSBLLookup-0.03/lib/Net/DNSBLLookup.pm
0402nobodyさん
2005/11/10(木) 03:41:03ID:???入れました
0403387
2005/11/10(木) 06:37:47ID:XPue5Djf色々ありがとう。
とりあえず
>>389で、ロリポは動きました。
で、>>395御指摘のutf-8でwakwakも逝けました。
解決できました。
>>396
>サーバに対して指定された、何れか一つの行を
>書かなきゃだめ、ということだと思うが。
そうみたいですね。
#!/usr/bin/perlはダメで、#!/usr/local/bin/perlはいけました。
>>397のリンクで
>スクリプト先頭行には #!/usr/local/bin/perl と記述して下さい。
と書いてありました。
でもあの書き方ではわかんないですよ。僕だけですかね・・・
>FTP転送の問題
でなくてよかったです。
とにかく、supecial thnxです。
0404nobodyさん
2005/11/10(木) 06:43:00ID:???>でもあの書き方ではわかんないですよ。僕だけですかね・・・
おまいだけ。あと「supecial thnx」は恥ずかしいからやめておけ。
0406nobodyさん
2005/11/10(木) 10:11:45ID:???0407nobodyさん
2005/11/10(木) 10:52:53ID:CqV/pVhDビルダーとかみたいな
0408nobodyさん
2005/11/10(木) 11:38:03ID:???Perl書くのにどんなエディタ使ってる?
http://pc8.2ch.net/test/read.cgi/php/1014357485/
0409nobodyさん
2005/11/10(木) 22:41:58ID:???現在フォームメールを作っているのですが、どうもうまくいきません。
スクリプトの流れとしては、
(サブルーチンA)フォームデータの取り込み、デコード、データをハッシュ(%FORM)に代入。
ハッシュのデータをソートしてメールボディー用の変数($body。もちろんグローバル変数)へ代入。
↓
(メインルーチン)送信ボタンが押されたかチェック。
押されたら送信用のサブルーチンへ。
↓
(サブルーチンB)確認ページの表示。ハッシュのデータをソートして表示。
なのですが、確認ページで送信ボタン(キー名はsubmit)を押すとハッシュの中身はsubmitだけになってしまうし、$bodyはどこかへ消えてしまうし、どうにもさっぱりです。
どなたか導いてください。宜しくお願いします。
0410nobodyさん
2005/11/10(木) 22:44:24ID:???0412nobodyさん
2005/11/10(木) 23:53:03ID:???0413nobodyさん
2005/11/11(金) 00:15:11ID:???サブルーチンとか言ってるけど、ページの遷移はないってこと?
0415nobodyさん
2005/11/11(金) 08:59:41ID:???0416nobodyさん
2005/11/11(金) 18:22:32ID:???Perlでテキストファイルから1行ずつ読み込んで処理する時には
while(<>){}
で済みますが、
既に変数に入っているテキストを1行ずつ処理する場合、どうしたらよいのでしょうか?
0417nobodyさん
2005/11/11(金) 19:03:57ID:???0418nobodyさん
2005/11/11(金) 19:15:49ID:???テキストの内容がでかいとでかい配列ができちゃうのがイヤだけど、
foreach my $line (split(/^/, $txt)) {
# $line に何かする
}
0419nobodyさん
2005/11/11(金) 19:18:47ID:???レスありがとうございます。
>>418
すいません。splitの/^/というのは??
この場合の^は行頭を表す^ですか?
■ このスレッドは過去ログ倉庫に格納されています