トップページ⇒php
1001コメント356KB

Perlコーディング初心者質問スレ Part 53

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2006/11/26(日) 14:38:23ID:SlmGsFMB
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0910nobodyさん2007/01/24(水) 16:50:31ID:???
>>907
データの中に区切り文字を含まないように工夫すればなんでもいいんじゃね?

>>908
本を一冊読むことをおすすめする。
ここで全部を教えるのは難しい

>>909
"LWP リダイレクト"でぐぐった?
09119092007/01/24(水) 17:49:56ID:???
>>910
ありがとう
0912nobodyさん2007/01/24(水) 18:43:46ID:???
>>907
CSVやTSVを使ったり、SQLiteやPgSQLを使ったり。
0913nobodyさん2007/01/24(水) 20:41:48ID:???
自サイトにあるフォームメールにスパムが来るようになりました。
そこで半角のみの投稿は不可にしようと思ったのですが
正規表現だと

$char_check = $form{"message"};
if($char_check =~ /^[^0-9a-zA-Z]$/ ){
 送信
} else {
 エラー処理
}

こんな感じでやってみたのですがうまく動きません。
正しい動作をさせるにはどのように書き直せばいいでしょうか?
0914nobodyさん2007/01/24(水) 21:25:03ID:???
if ($char_check =~ /[^ -~¥r¥n]//) {
 送信
}
0915nobodyさん2007/01/25(木) 05:34:19ID:???
!~ /^[a-zA-Z0-9]+$/
あとURLに使われる文字とか。
0916nobodyさん2007/01/25(木) 16:38:50ID:???
Perlでケータイ電話からのアクセスかどうかを判別したいと考えています。

UserAgentは簡単に偽装できるので、IPアドレスベースの識別をしたいのですが、
アクセス者のIPアドレスがサブネットマスク形式のアドレスで指定した条件に一致しているかどうかを
確認するモジュールはないでしょうか?

つまり、

my $ipType = &IP_Check('127.0.0.1', '127.0.0.0/24');

if ($ipType) {
 print 'ループバックアドレスです。' . "\n";
}

みたいなことができる関数が欲しいです。

よろしくお願いします。
0917nobodyさん2007/01/25(木) 18:21:17ID:???
>>914,915
ありがとうございます。
0918nobodyさん2007/01/25(木) 18:26:22ID:???
>>916
とりあえずCPANでsubnetで検索してみた?
その目的からするとTie::NetAddr::IPがこんな感じで使えてよさそうに見える。試してないが。

tie my $carriersSubnet, 'Tie::NetAddr::IP';
$carriersSubnet{"10.0.10.0/24"} = "CarrierA";
$carriersSubnet{"10.3.20.0/24"} = "CarrierA";
$carriersSubnet{"10.10.2.0/24"} = "CarrierB";

my $carrier = $carriersSubnet{$ipaddr};
0919nobodyさん2007/01/25(木) 18:34:43ID:???
>>916
Net::CIDR
0920nobodyさん2007/01/25(木) 22:54:12ID:???
>>889
winじゃないけど
Mac OSX もunixなので可
0921nobodyさん2007/01/26(金) 07:14:03ID:????BRZ(9100)
Net::CIDR::MobileJP
0922nobodyさん2007/01/26(金) 10:57:39ID:???
Perlで簡単な占いみたいなのを作りたいのですが、どうしてもならないところがあるので
質問させていただきます。

質問を提示してその下にラジオボタンで選択肢を作ります。
で、質問に答えたら次の質問と続いていくわけなんですが。
その選んだ答えを1.と答えたのがが3個 2.と答えたのが4個と最後に合計を出したいの
ですが、合計を出そうとするところができません。

そういう簡単なサンプルとかを提示していただきませんでしょうか?
0923nobodyさん2007/01/26(金) 12:05:11ID:???
>>1を100回読んでこい
0924nobodyさん2007/01/26(金) 12:38:54ID:???
>>922

if ($x eq $a){

   $one++;

} eisif ($a eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
09259242007/01/26(金) 12:43:20ID:???
間違えた
if ($x eq $a){

   $one++;

} eisif ($x eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
09269242007/01/26(金) 13:01:23ID:???
あ、また間違えた
if ($x eq $a){

   $one++;

} elsif ($a eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、''2は' . "$two" . '、' . '3は' . "$three";
09279242007/01/26(金) 13:02:48ID:???
これでいいや
09289242007/01/26(金) 13:08:50ID:???
ああまただ
これが正解だ

if ($x eq $a){

   $one++;

} elsif ($x eq $b) {

   $two++;

} else {

   $three++;

}

print "Content-type: text/html; charset=文字コード\n\n";
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
0929nobodyさん2007/01/26(金) 13:20:33ID:???
連投するならせめて空行を抜けヴォケ
0930nobodyさん2007/01/26(金) 16:52:05ID:???
なんかわろた
0931nobodyさん2007/01/26(金) 20:04:25ID:???
変数しかないのにダブルクオートで囲むのは気持ち悪い。
あとprintf覚えようね。
0932nobodyさん2007/01/26(金) 21:03:20ID:???
>>922 の文章は、複数の質問が1つのページにあるのか、
それとも1つの質問が書かれた複数のページがあるのか、はっきりしない。

前者なら、全ての質問について、選択肢をキーとしたハッシュでも作って集計すればいい。
後者なら、hidden フィールドでも使って、前ページまでの集計結果を覚えておけばいい。
0933nobodyさん2007/01/27(土) 10:46:19ID:F/NZnu0B
perlでBBS作ろうと思っているのですが、
お薦めのBBS向けのフレームワークとかご存じでしたら教えてもらえませんか?
0934nobodyさん2007/01/27(土) 11:18:07ID:???
CGI.pmとテンプレート系モジュールがあれば十分じゃない?
0935nobodyさん2007/01/27(土) 11:29:54ID:???
printfなんか使ったことが無い俺は勝ち組?
今度使ってみるかなぁ。
つっても、%ndぐらいしか使わなそうだけど。
0936nobodyさん2007/01/27(土) 11:34:36ID:???
オレもデバッグのとき見やすくするときぐらいしかprintfって使うことないよ
0937nobodyさん2007/01/27(土) 11:39:50ID:???
sprintfなら使う
0938nobodyさん2007/01/27(土) 13:38:26ID:???
print '1は' . "$one" . '、' . '2は' . "$two" . '、' . '3は' . "$three";
なんて書くくらいなら
printf("1は%d、2は%d、3は%d", $one, $two, $three);
の方が見やすいと思う。もしクォートの対応間違えてSyntax Errorになったら
探すのめんどいから。あとは、
printf("1は%d、2は%d、3は%d", @total{qw(one two three)});
のように書けるとき便利。
0939nobodyさん2007/01/27(土) 16:26:34ID:???
C言語から入ったような人だと、どの言語でもprintf系を使いたくなるらしいからなあ。
いや俺の話だけど。
0940nobodyさん2007/01/27(土) 16:31:24ID:???
print "1は$one、2は$two、3は$three";
0941nobodyさん2007/01/27(土) 17:46:05ID:???
>>938
>>940を見習え。
0942 ◆TWARamEjuA 2007/01/27(土) 18:21:50ID:????BRZ(6761)
${one}
って書いた方が無難かもかも。。
0943nobodyさん2007/01/28(日) 07:39:42ID:???
>>941
>>940 の方が意図しない挙動が起こらないからいいだろ。
0100 をプリントしたい場合
perl -e 'printf "%d", 0100 '
perl -e 'printf "%d", "0100" '
perl -e 'printf "%s", "0100" '
perl -e 'printf "%s", 0100 '
perl -e 'print "0100"'

まあ、printf "%04d", "100" 使えって云うんだろうけど。
0944nobodyさん2007/01/28(日) 08:28:12ID:???
>>924と>>938は0100をプリントしたいんじゃなくて100をプリントしたいのは明らか。
だから>>940でOK。
0945nobodyさん2007/01/28(日) 23:19:16ID:???
CGI::Upload.pmを使ってるんですが
ファイルを保存する方法がわかりません。
どうすればいいんでしょうか?
0946nobodyさん2007/01/28(日) 23:26:29ID:???
CPANのマニュアル見てください
0947nobodyさん2007/01/28(日) 23:35:50ID:???
マニュアルには保存のことまで書いてないです
0948nobodyさん2007/01/29(月) 01:45:42ID:???
書いてあります。ちゃんと見てください。
0949nobodyさん2007/01/29(月) 17:40:11ID:???
for(1..4){
if($pObj->ping($host, $timeout)){
print "$host is running.\n";
} else {
print "$host is not running.\n";
}

PINGが4回送信成功したらall complete
四回とも失敗したときにnot reaction
としたいのですがどこに制御文足せば良いのか教えてください。
0950nobodyさん2007/01/29(月) 18:37:35ID:???
失敗したときのカウント数えれば?
0951nobodyさん2007/01/29(月) 18:45:09ID:???
成功したときのカウント数えれば?
0952nobodyさん2007/01/29(月) 19:25:53ID:???
いっそ成功なら 1失敗なら-1
4か-4かで判断汁
0953nobodyさん2007/01/29(月) 21:11:48ID:???
>952の方法そのままだと、
「3回目の試行で全成功」と「4回試行して1度失敗」の区別が付かないような。

まあ、目的次第か。
0954nobodyさん2007/01/30(火) 01:25:19ID:???
書かれてる要件では「lostなし」「全lost」のどっちかがわかればよさそうだから
その辺の区別はできなくてもいいんでない?

「どうカウントして条件分岐させればスマートか?」という質問じゃなくて
「どこに制御文を足せばいいのか?」なだけに、
みんなが書いた回答では片づかないような気配を感じる。
09559492007/01/30(火) 11:19:12ID:???
>>954
そうですね
自分としては9同じような意味で書いたつもりだったのですが
書き方的に悪かったのかもしれません。
0956nobodyさん2007/01/30(火) 15:45:46ID:???
サーバーがC++ winsockでクライアントがPerlなのですが、
クライアント側でソケットをcloseすると、なぜかFD_CLOSE
が2回届いてしまいます。

特に支障はないのですが、これって正常なんでしょうか?
0957nobodyさん2007/01/30(火) 16:05:16ID:???
ソースを見直しなされ
0958nobodyさん2007/01/30(火) 22:21:54ID:???
>>948
見てるものが違うのかやっぱり書いてなかったけど
ソースを見て、ぐぐってわかりました。
0959nobodyさん2007/01/30(火) 22:24:11ID:???
ヒント:バッファリング
0960nobodyさん2007/02/01(木) 18:34:00ID:uO0f4S6q
クッキー読み書きのサンプル探してます。
どこかにないですか?
0961nobodyさん2007/02/01(木) 18:42:55ID:???
>>960
けんと
0962nobodyさん2007/02/02(金) 20:55:17ID:???
@log = ('AAA,100,aaa','BBB,200,bbb','CCC,300,ccc');
@data = ('bbb','ccc');
$num = @log;

for($i=0; $i<$num; $i++){
 ($name, $price, $text) = split(/,/, $log[$i]);
 foreach(@data){
  if($text eq $_){
   $name = 'MATCH';
   last;
  }
 }
 push(@newlog, "$name,$price,$text)";
}

このような処理をしたいのですが、
とても効率が悪そうで悩んでます。
調べてみると、grepが利用できないかと思ったのですが、
うまくまとめられません。。どなたかよい智恵を貸して下さい!
0963nobodyさん2007/02/02(金) 20:58:50ID:???
すみません。
>push(@newlog, "$name,$price,$text)";

push(@newlog, "$name,$price,$text");
です・・
0964nobodyさん2007/02/02(金) 22:52:58ID:???
>>962-963
# usage> perl this_script 2 bbb ccc
my($pos, @word) = @ARGV;
my $regex = join '|', map quotemeta, @word;
$regex = qr/(?:$regex)/;
my @matched;
(split /[,\n]/, $_, $pos + 1)[$pos] =~ /^$regex$/ && push @matched, $_ for <DATA>;
print @matched;
__END__
AAA,100,aaa
BBB,200,bbb
CCC,300,ccc
DDD,400,ddd
0965nobodyさん2007/02/03(土) 00:12:45ID:???
>>964
感謝です!応用してやってみます。
ありがとうございました。
0966nobodyさん2007/02/05(月) 20:49:02ID:???
$text = 'abc';

$s1 = \$text;
$s2 = \'abc';
$s3 = \('abc');
$s4 = \('abc', 'def');
$s5 = \($text = 'def');

$s1〜$s5は全部スカラーのリファレンスになったのですが
$s4とかが配列にならないのは何故なんでしょうか?
夜も眠れません(>_<)
0967nobodyさん2007/02/05(月) 21:05:53ID:???
>>966
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html#Making_References

> 列挙リストに対するリファレンスを取るということは、ブラケットを使うことと
> 同じではないということに注意してください。これはリファレンスのリストを
> 生成することと同じなのです!
>
>  @list = (\$a, \@b, \%c);
>  @list = \($a, @b, %c); # 同じこと!
>
> 特殊な場合として、\(@foo)は@fooの内容へのリファレンスのリストを返し、
> @foo自身へのリファレンスは返しません。これは%fooと似ていますが、
> キーのリファレンスがコピーに対するものである点が異なります(これは
> キーがfull-fledgdスカラーではなく単なる文字列であるためです)
0968nobodyさん2007/02/07(水) 20:39:01ID:???
>>967
勉強になりました
0969nobodyさん2007/02/08(木) 15:49:20ID:???
$i=1;のときに
print "$iueo";の出力結果を1ueo
と表示するために$iを何かで囲めば良かったと記憶しているんですが度忘れしてしまいました。
すみませんが教えて下さい。調べるキーワードでも結構です。
0970nobodyさん2007/02/08(木) 15:52:51ID:???
${i}ueo
0971nobodyさん2007/02/08(木) 15:57:13ID:???
>>970
即レス感謝!
ありがとう!!
0972nobodyさん2007/02/08(木) 16:53:49ID:???
LWPでhttpsのページを取り込みたいがうまくいかない。
ぐぐって見つけたページ
ttp://blog.livedoor.jp/hakin/archives/50690272.html
によるとCrypt::SSLeayが必要だそうで、
そのページどおりにppmでインストールしようとしたんですが
Crypt::SSLeay自体が無いようでインストールできません。
環境はWin2000+Activeperl 5.8.8.817 です。

何か手段はありませんか?
0973nobodyさん2007/02/08(木) 17:09:57ID:MLG2+XR4
ActivePerl5.8.8にてNet::Pingを利用した鯖死活監視CGIをコーディング予定です。
必須事項として、レスポンスmin/maxから算出したアベレージが必要です。
コマンドプロンプトからの実施時のようにレスポンスを採りたいのですが、Net::Pingにはこのよいな実装がないのでしょうか?
かなり検索はしたのですが、レスポンスタイムの取り方を解説している場所がありませんでした
何か良い方法が有ればご教授下さい。
0974脱帽2007/02/08(木) 17:29:34ID:???
お久しぶり。

>>972
うちは
 ppm install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
でインストール出来たけど。

>>973
hiresメソッドは使ってみた?
0975nobodyさん2007/02/08(木) 17:35:33ID:???
Net::PingのマニュアルのSYNOPSISのところにある

# High precision syntax (requires Time::HiRes)
$p = Net::Ping->new();
$p->hires();
($ret, $duration, $ip) = $p->ping($host, 5.5);
printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration)
if $ret;
$p->close();

が応答時間をとる例そのものずばりじゃないか。何回かやって平均/max/minとる
ところは自分で書いてください。そのくらいはできるだろ。
0976nobodyさん2007/02/08(木) 18:43:10ID:MLG2+XR4
>>974-975
ありがとうございますm(__)m
>>975さんの方法で無事解決しました。
勉強不足ですね、申し訳ない。
0977あっこ2007/02/08(木) 19:23:45ID:LIdpjyEo
http://docomo-camera-ne.jp/zeidoroom/20070208192133.jpg
ソース教えてもらえませんか?
0978nobodyさん2007/02/08(木) 19:37:58ID:???
とりあえずおっぱいうp
0979nobodyさん2007/02/08(木) 19:45:50ID:???
>>977
&kouyaku()の中身が知りたいという事か?

1から$num1と$num2の小さい方までをforで回して
$num1と$num2が両方割り切れるようならその値をリストに追加、
最後にリストをまとめて返すというだけの処理。

この程度のソースが書けないのは素人どころのレベルじゃねーぞ。
とりあえず>>1を100万回読み直して自作のソースを晒せ。
0980nobodyさん2007/02/08(木) 20:43:36ID:???
違うよ。

1.両方の数字を因数分解
2.両方に共通する因数を抜き出す
3.それらの組合せの全て出す
4.各組合せの乗算を算出
5.重複した値を除いて、「1」とそれらの値を画面出力
0981nobodyさん2007/02/08(木) 21:16:53ID:???
intとハッシュでおk
30秒で出来た
0982nobodyさん2007/02/08(木) 21:39:49ID:???
こんな時こそデータベースだろッ!
09839722007/02/09(金) 12:39:36ID:???
>>974
出来ました!
あ(・∀・)り(・∀・)が(・∀・)と(・∀・)う!
0984nobodyさん2007/02/09(金) 16:40:43ID:bT11nyvb
ハッシュ配列においてpushという命令使用できないのでしょうか?
0985nobodyさん2007/02/09(金) 16:53:16ID:???
>>984
できない……が、同じ事を考えた人は居る。
ttp://blog.livedoor.jp/tetryl/archives/6741666.html
0986nobodyさん2007/02/09(金) 21:07:51ID:???
オブジェクトへ配列のリファレンスを渡すと、何故かリファレンスではなく
展開されたデータが渡ってしまうのですがなぜでしょうか?

@a = qw(a b c d);

$obj->hoge(\@a);

sub hoge{
my $self = shift;
my $ref_array = shift;
print $ref_array;
}

こうするとなぜか「ARRAY(0x275cc8)」
といったアドレスデータではなく、「a b c d」と勝手に展開されたものがプリントされてしまいます。
09879862007/02/09(金) 21:19:14ID:???
すみません、試行錯誤してたら自己解決しました。
デリファンスを
@a = @$ref_array;
ではなく、
@a = @{$ref_array};
とやったらうまくいきました。
なぜそうなのかはわかりませんが・・・
0988nobodyさん2007/02/09(金) 23:20:06ID:???
>>987
そもそもお前が986で示したプログラムにはそんな部分はないわけだが。
ちゃんと正確に晒さないと的確な回答は得られないと思われる。
0989nobodyさん2007/02/10(土) 18:29:35ID:???
次スレ待ち保守
0990nobodyさん2007/02/10(土) 20:48:15ID:???
次スレ
http://pc10.2ch.net/test/read.cgi/php/1171102883/
0991nobodyさん2007/02/11(日) 05:04:06ID:???
>>990
乙!

さて、埋めるぞ!
0992nobodyさん2007/02/11(日) 14:36:41ID:???
use Perl6::Say;

say '埋め';
0993nobodyさん2007/02/12(月) 00:00:32ID:???
use CGI::SOSHI;
use strict;

my $stop = CGI::SOSHI->new;
print $stop->soshi();


阻止!
0994nobodyさん2007/02/12(月) 00:01:34ID:???
use BBS::WWW2ch;
write_thread 'php', '164519503', '梅';
0995nobodyさん2007/02/12(月) 04:45:55ID:???
機械よ 産め!
0996nobodyさん2007/02/12(月) 05:09:21ID:???
久米
0997nobodyさん2007/02/12(月) 12:40:25ID:???
use CGI::SUSHI;
0998nobodyさん2007/02/12(月) 16:42:45ID:???
うめうめ
0999nobodyさん2007/02/12(月) 17:30:16ID:???
松竹梅
1000nobodyさん2007/02/12(月) 18:04:59ID:???
1000!

次スレ
Perlコーディング初心者質問スレ Part 54
http://pc10.2ch.net/test/read.cgi/php/1171102883/
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。