Perlコーディング初心者質問スレ Part 46
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/01/18(水) 02:17:46ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0314309
2006/01/29(日) 11:58:10ID:???0315nobodyさん
2006/01/29(日) 12:05:03ID:???0316309
2006/01/29(日) 12:48:06ID:???0318nobodyさん
2006/01/29(日) 13:09:37ID:???(゚∀゚)ノ
0320309
2006/01/29(日) 13:18:43ID:???煽ったのは俺だが、騙ったのは別の誰かだ。
煽ってないとは一回も発言してない。
まさかとは思うが「騙る」を「あおる」と読んでる?
0321nobodyさん
2006/01/29(日) 13:20:01ID:???0323nobodyさん
2006/01/29(日) 14:40:08ID:???まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
まんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこまんこ
0324nobodyさん
2006/01/29(日) 16:53:38ID:???chomp;
last if $_;
}
で入力待ちしているときに、
カウンタダウンを表示させたいとすれば、どういった方法を取ればいいのでしょうか?
0325nobodyさん
2006/01/29(日) 16:59:54ID:???0326nobodyさん
2006/01/29(日) 17:00:47ID:???0 とだけ書いた行が出て来るとループ抜けるですね。
0327nobodyさん
NGNG0328nobodyさん
2006/01/29(日) 18:21:45ID:???キー入力を受け付けたいのです。
0329nobodyさん
2006/01/29(日) 18:27:58ID:???具体的に描写してください
0330nobodyさん
2006/01/29(日) 18:43:57ID:???0331nobodyさん
2006/01/29(日) 19:00:16ID:???どうみても、print "set-Cookie: $COOKIE_NAME=$value; expires=$date\n";
print "Content-type: text/html; charset=Shift_JIS\n\n"; です。
本当にありがとうございました;
0332309
2006/01/29(日) 20:25:54ID:rcECZvhlム板でバカにされてるのもうなずける。
0333nobodyさん
2006/01/29(日) 20:30:23ID:???ここは騙ることで報復したと思えるお子様が住み着いているスレでしたか。
ム板でバカにされてるのもうなずける。
0334ム板 Perl スレ住人
2006/01/29(日) 21:02:27ID:???お前もこっちくんな
0336309
2006/01/29(日) 21:25:22ID:???最底辺を自慢してどうしたいんだよ。
0337nobodyさん
2006/01/29(日) 23:13:56ID:???0338nobodyさん
2006/01/29(日) 23:31:23ID:???0341nobodyさん
2006/01/30(月) 13:40:11ID:???0342nobodyさん
2006/01/30(月) 14:41:41ID:???0343nobodyさん
2006/01/30(月) 22:51:00ID:???$a や $b を使った場合に、
実際に不具合が起こるケースにはどういうケースがあるでしょうか?
「これこれこういうことが起こりうるから使っちゃダメ」
みたいな具体例があれば教えていただきたく。
0345nobodyさん
2006/01/31(火) 00:05:32ID:???サンプルを見る限り、どれもEUCで書かれたページしか対象になってないので・・。
ShiftJIS対応のサンプルとかあれば、参考になるのでありがたいんですけど・・。
Encode.pm使ってコード変換とかしたらなんとかなります?
0347nobodyさん
2006/01/31(火) 00:28:18ID:???#!/usr/bin/perl
use strict;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->get( "http://www.excite.co.jp" );
print "Content-type: text/html\n\n";
print $mech->content;
exit;
0348nobodyさん
2006/01/31(火) 01:15:51ID:???0349345
2006/01/31(火) 01:22:22ID:???データを取得するだけなら、Mechanizeじゃなくても・・。
フォームに自動入力させたり、リンクたどったりするために使いたいんですけど・・。
そのときに文字コードが関連してうまくいかなかったりするのかなぁと思って
聞いてみたんですけど・・。
見当違いの発言してますか?・・・多分してるんだろうなぁ・・。
0350nobodyさん
2006/01/31(火) 01:53:08ID:???見当違いと言うか、試す前に質問するのが間違いだな。
>>1
> 1: 自分はこういう事がしたい。
> 2: それでこんな風にやってみたが・・・
> 3: こんなエラーが出て上手く行かなかった。
0351347
2006/01/31(火) 03:09:04ID:???いや、何となく意図は分かったが、
質問力と実践力の無さを婉曲的に指摘してみた。
EncodeでもJcodeでも
自分なりに試して、それでどうしてもダメだったら聞けば?
質問文に書かれている以上のことを
「おそらくこういうことが言いたいんだな」と想定してあげて、
もし質問者の意図と違ってたら、
回答者の労力って本当に無駄だよね。
0352nobodyさん
2006/01/31(火) 03:13:54ID:???ある意味矛盾ってやつですなw
0354nobodyさん
2006/01/31(火) 03:26:28ID:???Mechを挙げた時点で、シンプルにページのデータ取得だけを目的としたものではないと
検討がつくはず。データ取得ならLWP::Simpleでもできる。
>>345
Spidering Hacksって本の最後のほうに解決策があるよ。ググってみて。
0355nobodyさん
2006/01/31(火) 04:29:56ID:???だから、何でわざわざ推測してやらにゃって話だろ?
書かれた問いに対しての回答としてひとつも間違っちゃいない
0356nobodyさん
2006/01/31(火) 12:17:22ID:h8hzbfFvどんな性格かは言わずもがなだが。
0357nobodyさん
2006/01/31(火) 12:58:54ID:FkRWAlIzまずlogin画面があり、認証後サイトを見れるという感じなのですが
認証後のサイトURL直入力などを防止する為にはどのような対応が良いのでしょうか?
idとパスワードを画面遷移ごとにpostデータとして送るというのはなんか
パスワードがソース内に表記されているという事で嫌な感じがしますが
一般的なのでしょうか?
最近のセキュリティソフトではリファラを出さないそうなのでこれも使用しない
方向で考えています。
どなたかお知恵を拝借願います。
0359nobodyさん
2006/01/31(火) 13:06:20ID:???http://www.shtml.jp/htaccess/basic.html
以上。
0360nobodyさん
2006/01/31(火) 13:17:20ID:???クッキー使用(クッキーにはユーザー名もパスワード名も入れない。セッションIDのみ)
0361nobodyさん
2006/01/31(火) 13:47:37ID:???Apache の仕事じゃね?
0362nobodyさん
2006/01/31(火) 14:57:21ID:???なるほどね
すっごいや
0364nobodyさん
2006/01/31(火) 15:06:55ID:???投稿確認のページ(例:index.php?exec=setcheck)があった際に、リファラは投稿ページ(例:index.php?exec=posting)である必要があるよね?
投稿確認ページでチェックするリファラが空であったり、投稿ページ(例:index.php?exec=posting)以外であればそれを弾く。
チェックとはそゆことを言ってます。
リファラ吐かない鯖なんて前提にしてません。
0365nobodyさん
2006/01/31(火) 15:08:22ID:???>最近のセキュリティソフトではリファラを出さないそうなのでこれも使用しない
との事なのでリファラ取得が前提とした質問かな
(今気が付いたんだけどねorz)
0366nobodyさん
2006/01/31(火) 15:17:37ID:???0368nobodyさん
2006/01/31(火) 15:20:19ID:???スパゲッティ得意?
0370nobodyさん
2006/01/31(火) 15:22:56ID:???IDとパスワードがどんな形で渡すのかわからんが
場合によったら一番手っ取り早いだろ。
0371nobodyさん
2006/01/31(火) 15:23:58ID:???0373nobodyさん
2006/01/31(火) 15:50:26ID:???それを言ったらSSL通らない通信はみんな信頼性にかけるし。
357がどれだけの信頼性が必要なのかがわからんけど、
仲間内だけで運営するとか、登録した人だけサイトが見られるとか
そんな感じなのであれば、Basic認証やらDigest認証で十分でしょ。
0375nobodyさん
2006/01/31(火) 16:12:43ID:???0376nobodyさん
2006/01/31(火) 18:09:43ID:???いろいろサンプルを見ながら試してて気が付いたのですが
(stat($file))[9] としたときに更新日付が帰ってきてませんでした
stat 以外でファイルのタイムスタンプを取得する方法ってありますか?
0377nobodyさん
2006/01/31(火) 18:41:59ID:???0378nobodyさん
2006/01/31(火) 18:49:59ID:???更新日付が取れない事を変だと感じるが。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq5.html#how_do_i_get_a_file_s_timestamp_in_perl
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item__i__X__i__FILEHANDLE
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_stat_FILEHANDLE
map localtime($_->[1]) . " $_->[0]\n",
sort { $b->[1] <=> $a->[1] }
map [ $_, (stat)[9] ],
glob './*'
;
0379nobodyさん
2006/01/31(火) 19:18:30ID:???opendir(DIR, "./$datdir")
のようにしてファイル一覧を取得してからファイルのタイムスタンプを取得しようとしてたんですが、
stat("./$datdir/$file[$i]") のようにすべきなのにディレクトリを指定し忘れていただけでした。
回答をしていただいたのにくだらないミスで済みませんでした。
0380nobodyさん
2006/01/31(火) 20:18:16ID:RrDOFj4aJcode.plを使って投稿時に含まれている半角カタカナは
全角カタカナに変換するようにしたのですが、
半角カタカナのみの投稿の場合動作しません。
これはなぜなんでしょうか?
該当部分のソース
# S-JISコード変換
&jcode'convert(*value,'sjis');
#半角カタカナ変換
&jcode'h2z_sjis(\$value);
これがフォームでコードの部分に入ってるだけ。
0384nobodyさん
2006/01/31(火) 22:12:12ID:POWreMm8新しいファイルlog_new.cgi書き込み、書き終わったところで古いファイルをlog_old.cgiに
rename、新しいファイルをlog.cgiにrenameとしました。
この方がメモリ使用量が少なく、書き込みの時に異常停止した場合ログ破壊が起こり
にくいと考えました。 しかしファイルのパーミッションを600にしたいのですが、open
では出来ず、sysopenでしか出来ないと知って困ってます。 パーミッションだけの
ためにファイルI/Oは全てsys*にしないとならないのでしょうか?
0385nobodyさん
2006/01/31(火) 22:34:56ID:???0387nobodyさん
2006/01/31(火) 22:44:35ID:???バッファリングの問題なんだからsysopenだけなら他はシステムコールにしなくてもいいんでは?
実際perlfaq5で以下みたいな例文でてるし。(話題そのものは別のもの)
use Fcntl qw(:DEFAULT :flock);
sysopen(FH, "numfile", O_RDWR|O_CREAT) or die "can't open numfile: $!";
flock(FH, LOCK_EX) or die "can't flock numfile: $!";
$num = <FH> || 0;
seek(FH, 0, 0) or die "can't rewind numfile: $!";
truncate(FH, 0) or die "can't truncate numfile: $!";
(print FH $num+1, "\n") or die "can't write numfile: $!";
close FH or die "can't close numfile: $!";
0389nobodyさん
2006/01/31(火) 23:06:49ID:???がーん。そうでしたか。
sysopenだと他も全部システムコールにしなくちゃいけなくてイヤって言ってるのかと思いました。
387はスルーしてください。
0390nobodyさん
2006/01/31(火) 23:21:07ID:???sysopen とどちらが楽かは微妙だが、一時的に umask を変える。
my $orig_umask = umask 077;
blah, blah, blah...
umask $orig_umask;
0391nobodyさん
2006/02/01(水) 00:00:28ID:???結果が文字化けするなら分かるけど、
動作しないってのは分からん。
>>384
IO::FileかFileHandle使うと便利。
0392384
2006/02/01(水) 01:05:17ID:ngruutodopenだけを入れ替えられるとは思いもしませんでした。 >>391も便利そうですね。
試してみます。
0393nobodyさん
2006/02/01(水) 18:32:10ID:???Use of uninitialized value in 〜
といったエラーが出てきました。
エラーが出た個所を見てみると
$in_method = $ENV{'REQUEST_METHOD'};
のように環境変数を代入してるほとんどでエラーが出ています。
環境変数から値を持ってくるときは = で代入しちゃいけないんでしょうか?
0394nobodyさん
2006/02/01(水) 18:41:34ID:???正規表現でマッチさせて代入させればいいよ。
0395nobodyさん
2006/02/01(水) 18:58:32ID:???エラーメッセージの内容とそれが出ている行番号を確かめるんだ。
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perldiag.pod#Use_of_uninitialized_value%s
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_defined_EXPR
#!/usr/local/bin/perl -W
use strict;
my $path = $ENV{'PATH'}; # 定義済の値
my $nvar = $ENV{'NONEXISTENT_VARIABLE'}; # 未定義の値
print "PATH:$path\n";
print "NVAR:$nvar\n";
__END__
>>394
それは -W じゃなくて -T 。
0396nobodyさん
2006/02/01(水) 19:11:50ID:???ここに注目して、環境変数も中身がちゃんとあるかどうかチェックしながら代入するようにしてみました。
エラーは無くなったものの、面倒くさいなぁw
0397nobodyさん
2006/02/01(水) 19:15:12ID:???エラーのあったときの記述
$in_type = $ENV{'CONTENT_TYPE'};
修正した記述
$in_type = $ENV{'CONTENT_TYPE'} ? $ENV{'CONTENT_TYPE'} : "";
CONTENT_LENGTH のときは "" じゃなくて 0 を入れるようにした。
0398nobodyさん
2006/02/01(水) 19:28:22ID:???$len = $ENV{'CONTENT_LENGTH'} or 0;
でもできるよ。
ただこの場合、偽の時は常に空になっちゃうから、
空文字列、0、未定義値を見分ける必要がある場合はやめたほうがよい。
0399nobodyさん
2006/02/01(水) 19:31:21ID:???コード自体を書き換えなくとも、未定義値の警告だけを出なくすればいい。
http://search.cpan.org/~nwclark/perl-5.8.8/pod/perllexwarn.pod
#!/usr/local/bin/perl
use strict;
use warnings qw(all);
no warnings qw(uninitialized);
print my $foo, 'foo!';
__END__
まぁ defined $var ? $var : '' するのが正道なので、これを機に全部
書き換える事をお勧めするが。
0400nobodyさん
2006/02/01(水) 19:36:37ID:???> $in_type = $ENV{'CONTENT_TYPE'} or '';
これは
($in_type = $ENV{'CONTENT_TYPE'}) or '';
こういう意味になる。
書くなら、
$in_type = $ENV{'CONTENT_TYPE'} || '';
$in_type = ($ENV{'CONTENT_TYPE'} or '');
このどちらか。
0もfalse扱いされるから扱いに注意。
0402nobodyさん
2006/02/01(水) 19:52:46ID:???$in_type = $ENV{'CONTENT_TYPE'} || '';
って書き方がいいかなと思ったんですが、
>399さんの最後の一言を考えて、
$in_type = defined($ENV{'CONTENT_TYPE'}) || '';
っていうのじゃ駄目ですか?
とか書いた瞬間に駄目と気付いたw
defined を使うなら
$in_type = defined($ENV{'CONTENT_TYPE'}) ? $ENV{'CONTENT_TYPE'} : '';
ぐらいにしからないですかね。
とりあえず
$in_type = $ENV{'CONTENT_TYPE'} || '';
が見た目的にも、自分てきには見やすいかな
0403nobodyさん
2006/02/01(水) 19:55:44ID:???0404nobodyさん
2006/02/02(木) 02:58:46ID:???@k=split(/\\/,$test);
$testの中身を\で分割したいんだけど↑じゃできねぇ
何かいい方法ない?
0405nobodyさん
2006/02/02(木) 03:08:11ID:???0407nobodyさん
2006/02/02(木) 14:40:58ID:???0408nobodyさん
2006/02/02(木) 23:57:22ID:6Tw8pfAF#!/usr/bin/perl -w
use strict;
use LWP 5.64;
my $word = shift;
$word or die "Usage: perl altavista_post.pl [keyword]\n";
my $browser = LWP::UserAgent->new;
my $url = 'http://www.altavista.com/web/results';
my $response = $browser->post( $url,
[ 'q' => $word, # the Altavista query string
'pg' => 'q', 'avkw' => 'tgz', 'kl' => 'XX',
]
);
die "$url error: ", $response->status_line unless $response->is_success;
die "Weird content type at $url -- ", $response->content_type
unless $response->content_type eq 'text/html';
if ( $response->content =~ m{ found ([0-9,]+) results} ) { print "$word: [RETURN]
$1\n"; }
else { print "Couldn't find the match-string in the response\n"; }
↑のようなコードが出てきたんでコピペしてDosプロンプトで実行したら
C:\Perl\bin>perl altavista_post.pl tarragon
http://www.altavista.com/web/results error: 302 Found at altavista_post.pl line 13.
のようなエラーが出ました。どこが間違ってるのでしょうか?
Windowsで通るようにするにはどうすればいいのでしょうか?
0409nobodyさん
2006/02/03(金) 00:03:11ID:???斜め読みだけど、302が返ってきてるからリダイレクト指示でしょ。
んで、そのスクリプト200以外の応答は全部エラーにしてるみたい。
というわけで、$urlの値の末尾に/つければいけるんじゃない。
0410nobodyさん
2006/02/03(金) 00:07:29ID:PieRIOHfAltavistaってまだあったんだw
このコードはどこでも動かないよ。 サイトの仕様が変わってる。見てみたらいまじゃ
Yahooに投げてるだけ。
0411408
2006/02/03(金) 00:11:00ID:HpXFHvtB即レスありがとうございました。>>409-410
0412無知ですまそ
2006/02/03(金) 02:46:12ID:SfkSG4GRパスワードチェックで
if ($FORM{'pass'} ne 'aaa') { &error("パスワードが違います"); }
としたのだけど、aaaとbbb以外は違うとするにはどうすればいいのか教えてください。
■ このスレッドは過去ログ倉庫に格納されています