Perlコーディング初心者質問スレ Part 56
4 :
1 :2007/09/16(日) 19:56:03 ID:???
独断でPBPとPerl Hacksを追加してます。
>>1 お疲れ様です。
前スレ最後に質問してしまいました。
こちらに再投稿させていただきますm(__)m
use Math::BigFloat;
my $tr = Math::BigFloat->new((@array * (1-0.68)/2));
と書くの大変なので
my $a = use Math::BigFloat;
my $tr = $a->new((@array * (1-0.68)/2));
と書いてみましたがエラーでした。
こういう意図を実現するのは無理ですか?
小数の計算をさせた上で配列のインデックスにする場合はBigfloatしておかないと危ないです。
やってない$trに
$array[-($tr +1)];
とすると実質インデックスが2個変わってしまいます。
15.999だったのが、+で16になり、さらに1が足されて17になる。
そんな現象を確認しました。
簡単な記述方法はないでしょうか。
>5 use bignum
>>6 ???
どういうことですか?
英語読めませんが、
http://perldoc.perl.org/bignum.html を見てやったところ
全くMath::BigFloatが不要になってしまいました。
冒頭でuse bignumをしておけば小数点の変な誤差が発生することは皆無になるんですか?
代償として重くなるとかがあるので、軽くしたいなら面倒でもMath::BigFloatを使えばいい。
簡単にしたいならbignumを使えばいい?
use bignum; my $tr = (@array * (1-0.68)/2); メチャクチャな計算になりました。 @arrayは100なので16になるべき計算なのに50が入ってました。 もちろんbignumをつかわなければ16が入ります。 bignumを使うと他にも多大な影響があるようですね。 どういう基準で影響を与えてくるんでしょうか。
>>前996 $#test で最後の添え字をゲット。
>8 再現しない。再現する最小コードは? use strict; use warnings; use bignum; my @array; $array[99] = 0; print scalar(@array), "\n"; # 100 my $tr = (@array * (1-0.68)/2); print "$tr\n"; # 16
>>10 #!/usr/bin/perl
#京
#use bignum;
my @array;
for (1..100){ push @array,$_ }
@array = sort {$a<=>$b} @array;
my $tr = (@array * (1-0.68)/2);
print $tr;
これでできると思います。EUCコードで記述されています。
use bignum;をコメントアウトするかしないかで表示が変わります。
本来とは違う挙動をしているのでしょうか?
普通にprintしていたものを、突如ファイルに納めたくなりました。 print 1; というのが何千行もあった場合 print FH 1; とやりなおすのは間に色々な式が挟まってる為一括ではできません。 標準出力先をファイルハンドルに変える設定などが冒頭でできるなら一発でできると思うのですが。
select関数でおk
14 :
12 :2007/09/16(日) 23:53:18 ID:???
>>13 うわ!
感謝感激恐悦至極にございますm(__)m
>11 俺のとこだと再現しないわ。環境は This is perl, v5.8.8 built for MSWin32-x86-multi-thread This is perl, v5.8.8 built for cygwin-thread-multi-64int
>>15-16 This is perl, v5.8.1 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)
5.8.1のみの問題ですかね?
そんなに違いがあるのでしょうか。
一体何なのでしょうか?
ちなみにbignumって何に使うためのものなのですか?
浮動小数の誤差関係に使えるというのは一つですよね。
本筋はそれですか?
だとしたらこんな影響が出てしまう理由がわかりませんし。
EUCコードでやっておられますよね?
それかもしかしたらbignumの方がバージョン変わってるとか?
>>17 1. 再現せず。きちんと計算される。
This is perl, v5.8.1-RC3 built for darwin-thread-multi-2level
2. bignum は BigFloat と Math::BigInt, Math::BigInt::Lite のラッパー
それぞれググレ。でかい方に関しては
perl -le 'print 2**2**2**2**2' # => inf
perl -Mbignum -le 'print 2**2**2**2**2' # => やってみ?
とか
perl -le 'print 10**16' # => 1e+16
perl -Mbignum -le 'print 10**16' => 10000000000000000
効能が分るだろ。
前スレ993へ % cat Hoge.pm package Hoge ; use 5.005_02 ; use vars qw( @ISA @EXPORT ) ; use vars qw( $hoge ) ; use subs qw( hoge ) ; use Exporter ; use Cwd ; @ISA = qw( Exporter ) ; @EXPORT = qw($hoge hoge ) ; $hoge = 42 ; sub hoge{ return 42 ;} 1; % perl -Mstrict -Mwarnings -MHoge -le 'print $hoge; print hoge' ってか朝っぱらから何やってんだろ俺。
ああ、いらんモジュール use しとるし orz...
-wスイッチを使うと警告を出すというんですが、これは一体どういう意味の警告なんですか? -cは確か構文チェックをしてくれるわけですよね。
print scalar(grep{$_>15}(1..99)); >84 print scalar(1..99); >何も表示なし print scalar(0,1,2); >2 リストをscalarに渡すとどうなるかというのが知りたかったのです。 要素数を出してくるのか末尾要素だけ評価するのか。 真ん中のやつは何も評価しなかったようですが。何故なんでしょうか。 それとgrepでリストが作られるのかと思っていたら配列が作られているのですよね?これは。 scalar(配列) とすると要素数が出てきて scalar(リスト) とすると末尾要素が評価される scalar(n..m) とすると何も起こらない grepの返り値は配列だということでokですか?
1/0 これをやらせるとIllegal division by zero at hogehogeと警告されます。 0/1 こっちは警告なしなので大丈夫なんだと思いますが。 あまり気にしてないと、無自覚のうちに0による除算が発生してしまうことってありますよね。 意識的に0による除算が行われないよう、例えば my ($r,$p) = (rand,rand); print $r/$p; こういう場合は my ($r,$p) = (rand,rand); if ($p>0){ print $r/$p } と保険?を掛けておくのが推奨されるコーディングなのでしょうか?
>>22 perl -w -le 'print scalar (1..99)'
Use of uninitialized value in range (or flip) at -e line 1.
range 演算子は、君の希望の挙動の他に
while( <> ){
print if ( /^\s+/ .. /^$/ ) ;
}
つう風にも使う。で、上述ではperlの中の人がどっちの機能
を求めているのか判断出来ない。=> エラー出して保留
∴まともに機能してないよ
25 :
22 :2007/09/17(月) 12:16:00 ID:???
>>24 while( <> ){
print if ( /^\s+/ .. /^$/ ) ;
}
読めないorz
正規表現の部分は「先頭から空白文字が1個以上あるか」「中身が空であるか」の二つですね。
で、..この範囲演算子はどういう意味でしょう?
ついでにwhileの評価式自体が皆目検討がつきません。
>>25 例だからあまり意味のないものを書いたんで。。。
「先頭から空白文字が1個以上ある行」から
「中身が空であるか」まで
を出力せよ。
と言う意味になります。ホントは/^\S+/ のつもりだったのよw
後は、、、ぐぐれ。
27 :
21 :2007/09/17(月) 12:26:13 ID:???
すいません。試してるんですが。 Use of uninitialized value in addition (+) at 行数 こういうのやsubtractionとかがちょくちょく出てくるんです。 「初期化されてない値を使ってる」みたいな意味だと思いますが、 具体的にどういうエラーなのかわからず再現ができないでいます。
28 :
22 :2007/09/17(月) 12:32:34 ID:???
>>26 う〜んどうしてそうやって動くのでしょうか?
一旦中身が空である行を迎えたら自動でループはlastされるのですか?
ifに掛けられるのは1行ずつですよね。
う〜ん・・・
>>28 左の正規表現が真 => スイッチオン
右の正規表現が真 => スイッチオフ
for( 1..1000){
print $_ if $_ == 10 .. $_ == 100 ;
}
つかまじでググってくれ。
21氏は質問の意味自体が理解不能だ。
俺は消えるので、相手してくれる人はいなくなるかもしらんが
頑張れ
30 :
21 :2007/09/17(月) 12:38:16 ID:???
my $pl = undef; my $ze = $pl + 1; my $we = $pl - 1; レスこないのでガンばてたら、これでadditionとsubtractionエラーが再現できました。 この二つのエラーが出たら未定義値が格納されてる変数が計算に使われてるって思っておけばいいですよね。 でも一応スクリプト自体は動くんですが、-wはuse strict程度の感覚なのですか?
>>26 それ範囲演算子じゃないから。普通は使いません、ていうか使うな。
明らかに不適切な例を唐突に持ち出して何がしたいんだか。
33 :
22 :2007/09/17(月) 16:17:24 ID:???
>>32 確かにまだ理解できていませんが、
>>31 は僕ではないです。
回答してくれる方にそんな不遜な態度は取りません。
仕事押しつけられて、戻って来たらなんかオレ煽られてんなあ。 31=21 か? Programming Perl の P135 の範囲演算子の項を読んだ後に まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。
> Programming Perl の P135 の範囲演算子の項を読んだ後に > まともに煽ってくれ。つか突っ込みどころは他にもあるんだから。 とりあえず、該当箇所をスキャンしてうp汁。
37 :
22 :2007/09/17(月) 19:13:34 ID:???
とにかく仲良くして下さい。
scalar って書いてあるから、スカラコンテキストで評価するか。 ↓ > スカラの ".." の被演算子が定数表現であるときは、 > その被演算子は暗黙に、変数 $. と比較されることになります。 ↓ ちょっくら$.と比較するか。 ↓ $.にundef入ってるし。 ↓ Use of uninitialized value
やっぱりどうもプログラム系のスレの住人って人とのコミニュケーションが下手っぽいよね。 変な皮肉を言ったり、あえて言葉足らずにしてみたり。 そういう悪い癖に自分で気付いてるんだろうか。 こういうところが、「キモイ」イメージが付いてしまう原因なんだろうな。
変な分析したがりが一番キモい
つまりここにいる奴は全員キモイってことだな。
ま、いくら挑発しても答えてやらないけどな
43 :
nobodyさん :2007/09/19(水) 19:41:21 ID:uZuxrlKv
Perl の CGI::Application モジュールを使ってアプリを作成しているのですが、 デバッグの仕方でつまづいています。 というのも CGI::Application の場合 ランモードのそれぞれのメソッドからブラウザに表示させたい htmlを return しますよね? で、その途中で 勝手に「 print $hensu; 」みたいにやっても画面上には表示されません。。。 もちろん「 return $hensu; 」とやればその変数の内容は表示されるのですが、複数の変数の値を 一度に表示させたいのですーー。 こんな時みなさんどうしてるのでしょう???
V に TT とか使えばいいんじゃね?
ヘッダを出力する前にprintしてもブラウザには表示されないよ CGI::App::Plugin::DebugScreenとかLogDispatchとか使ってたっけかな 手っ取り早いのはData::DumperとかYAML使ってwarnでダンプとか httpdのエラーログにね
CGI::Application ってテストサーバないのか。ダサいな。
47 :
nobodyさん :2007/09/19(水) 23:44:49 ID:??? BE:914760566-PLT(15017)
48 :
nobodyさん :2007/09/20(木) 00:36:25 ID:FmGzC+A0
DBIを使用してDB処理をした場合、sqlのログってどうしてます? プリペアードステートメント使っていますが、肝心の値の部分が「?」なので、実際に流れるクエリが分かりません。
50 :
nobodyさん :2007/09/20(木) 12:35:47 ID:yNzQPcIL
>>44 >>45 43です。レスありがとうございます。
なるほど、簡単にはいかないんですね。。CGI::Applicationしょぼ!
結局グローバルな変数(ハッシュ)に変数の値を保存していって
cgiapp_prerun (メソッド名間違ってたらスマソ)でその変数に
値が入っていればブラウザに表示するという方法でいきます。
ていうかこれぐらいのこともできないのかよ。CGI::Application
ヘッダの送る前にprintしてもブラウザに出力されないのは当たり前だろ・・・ 自分の無知を認識しろよ
だからwebprogは揶揄される
今時 CGI::Application なんか使うなよ…
じゃあ何使えって言うんだよ。 どこのレンタルサーバでも使えるような方法で頼む。
if文ダラダラ使えってことじゃね
あるいはR信者が言語批判したかっただけとか
yukiwiki 的にサブルーチン呼べば? 値は PATH_INFO とかでとればよい。
58 :
nobodyさん :2007/09/21(金) 04:57:02 ID:9/Wk3rtw
質問です。 ネットに落ちてるサンプルを見ながら、アクセス解析や掲示板などを書いて 練習しているのですが、データを書き込んでいく空ファイルは どこのサンプルでも自前で事前に用意しています。 これを、日時ごとに070921.dat、070922.dat…のように自動生成させたいのですが、そのようなことは出来ないのでしょうか? よろしくお願いします。
問題なく出来ると思う。
テキスト表示のアクセスカウンタを作っているのですが、<img>タグで呼び出すとテキストを返せません。 SSIが使えないならば、直接CGIにアクセスさせるしかないんでしょうか??
質問させてください。 GDでファイルを生成→表示というスクリプトを組んでいますが どうやら生成されるまえに表示する処理が実行されてしまい。うまくいきません。 リロードすれば表示されるようにはなるのですが・・・ 生成されるまで待つ→表示処理実行 という事を考えて生成→slepp 2とか10;→次を実行 と、してみましたがうまくいきません。 生成完了するまでウェイトをかける方法を教えていただければありがたいです。 よろしくお願いします。
62 :
61 :2007/09/21(金) 09:35:31 ID:EZVVl+6I
自己解決しました。 sleepでOKでした。 よくみると コメントアウトしてましたw
>>60 scriptタグのsrcでアクセスさせる。JavaScript。
64 :
nobodyさん :2007/09/21(金) 20:24:02 ID:yGE03KVM
winXPsp2とactive perlでローカルテストをする時の質問なのですが、 例えば print 1; という命令のあるplファイルをダブルクリックしても1が表示されません。 いや正確には一瞬何かが出てきてるっぽいんですが、閉じるの早すぎです。 コマンドプロンプトから実効命令をするとprint先がコマンドプロンプトに来るので、 勝手に閉じることはないようですが。 いちいちコマンドプロンプトやらずに簡単なコードテストの時はダブルクリックで済ませたいのですが 方法ありましたら教えてください。
>>64 END{<STDIN>}
とか書いとけば。
66 :
64 :2007/09/21(金) 21:00:38 ID:yGE03KVM
>>65 ありがとうございます。
うまく出ました^^
endって一体なんなのですか?
perlの説明サイトとかで関数調べてendありませんし。
最後にやるってことですか?
となると<STDIN>が閉じさせない命令の本体になるんでしょうか?
どういう理屈なんでしょうjか。
68 :
64 :2007/09/21(金) 23:02:02 ID:yGE03KVM
>>67 コンソール???あの黒い画面のことかな。
で、試しに適当に打ち込んだら本当に入力できました。
最後にenterを押したら画面が消えました。
perlの方にはしっかりとその内容が送られてるんですかね?
試しに
my @array = <STDIN>;
print $array[0];
としてみましたが、今度はenterを何度押しても画面が閉じません。
配列に入れてるから無限に取るっぽいですね。
my $scalar = <STDIN>;
print $scalar;
END{<STDIN>}
としたらうまくいきました。
任意の内容を入力してenterした瞬間に制御が一瞬コードに行ってprint $scalar;が実行されました。
ローカルでやるときはこうやって引数を取るというのも面白いですね。
物凄い面白いことを教えていただいて感謝です。
質問です。 Class::DBI使ってDB操作する場合、二つのレコード間で主キー以外のデータを交換するには どのように書いたらいいですか?
#! /usr/local/bin/perl print "content-type:text/html\n\n"; print "<html>\n"; print "<head><title>タイトル</title></head>\n"; print "<body>\n"; print "<h2>テスト</h2>\n"; print "</body>\n"; print "</html>\n"; ↑これでInternal server error 500になる。 ただしレンタルサーバー上ではエラーだが、 自分のパソコンでやったらちゃんと表示される。 ソースにもし間違いがあったら 場所と対処法を具体的に指摘しろ。
>>70 態度でかいぞ。
そんなやつには教えてやらん。
#! と /usr の間に半角スペースが入ってるのが問題とか言わん。
>>68 和んだ、俺も10年くらい前Cやった時そんなだった。
73 :
69 :2007/09/22(土) 19:54:58 ID:???
すみません。解決しました。
>>70 パーミッションはちゃんとやってあるのか?
とりあえず雑魚が粋がるのはやめておけ。
75 :
nobodyさん :2007/09/22(土) 22:09:17 ID:VEv2R0s3
76 :
75 :2007/09/22(土) 22:43:31 ID:???
77 :
75 :2007/09/23(日) 03:01:09 ID:???
>>74 なぁーんてこった!
cgiファイルのパーミッションを
755にしたらそれで動いたぜ
そんなこと教科書には
どこにも一言も書いてなかった!
ローカルで動かす教科書だからかな?
サノバビーィーーーッチ!
それでパーミッションが500でも
動くのはなんでだ?
それくらいググれカス
やはりWebProg板はレベルが低いな。最高。
だって初心者スレだもん。いいじゃない。 なんか、すごくレベルの高い質問が最近多すぎな気がする。俺のレベルが低いだけなんだろうけどw Webprogなんだから、動けばいいじゃない的な考えがイクナイ?
if ( $hoge =~ /$moge/ ){ print "もげら" } って感じで書いて$mogeが展開されてくれないみたいなんだけど、 特別な書き方があるのかな。 ぐぐったけど正規表現ばかりで、変数をつかってる例が全然見つからなかったんだけど、 こういう記述方法自体があまり一般的じゃなくて、他の書き方があるのかな。 教えてちゃぶだい。
>>82 $mogeの中には何が入ってるの?
2バイト文字関係とか、文字コードでこけてる可能性もありそう。
>>82 変数使うときはquotemeta()くらいはかましときなはれ。
サンクス! quotemetaでいけたよ。 1)index($hoge, $moge) でもやったけどダメ 2)auotemeta() してみた 3)$hoge =~ /$moge/ で成功! 4)でもなぜかそれ+ index($hoge, $moge) じゃダメ って感じだった。 中に入ってるのはどちらもEUCの2バイト文字列なんだけど、 なぜか$mogeが空の文字列として扱われてしまってるっぽい動作だった。 print $hoge.$moge;とかで出力するとちゃんと出力されるんだけどね。 良く分からないけどとりあえず解決はしてよかった。 ありがとう。
86 :
nobodyさん :2007/09/25(火) 00:47:19 ID:XOfpdsF8
はじめまして。 use strict; use diagnostics; という宣言をした状態で、 Name "html::copyright" used only once: possible typo at bbs.cgi line 554 (#1) というwarningが出ました。 html::copyrightは、htmlモジュール で、 $copyright = 'hogehoge '; などというように、宣言されています。 warnings は、他のモジュールの変数は見てくれないのでしょうか? 実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。 (他のwarningにも混じってしまい、識別が困難です) このwarningをつぶしたいのですが、何とかする方法はないでしょうか?
87 :
nobodyさん :2007/09/25(火) 00:49:11 ID:XOfpdsF8
x 実は、html::copyright 以外にも数十個でていて、紛らわしいことこの上ないです。 o 実は、html::copyright 以外にも used only once: possible typo が、数十個でていて、紛らわしいことこの上ないです。 used only once: possible typo・・・ は、意味は、わかっておりまして、 一度しか使ってないので、ミスじゃない?ってことなのですが、 実際には、ちゃんと、htmlモジュールで代入してから、mainで参照しているのに・・・ということです。
>>87 Use of uninitialized value
が続かないなら、理由が分からない。
一度ourで宣言してみたらどうなる?
89 :
86 :2007/09/25(火) 17:25:00 ID:XOfpdsF8
試しに、最小限のコードを書いてみたら、
-----test_pm.pm-------
package test_pm;
use strict;
use warnings;
our $hoge = "test foo bar";
1;
-----main.pl---------
use strict;
use warnings;
use test_pm;
print $test_pm::test;
-------------------
> perl main.pl
Name "test_pm::test" used only once: possible typo at main.pl line 5.
Use of uninitialized value in print at main.pl line 5.
ちゃんと、Use of uninitialized value でて、実行不能でした orz
ourでも、myでも同じでした
>>86 は、CGIなんですが、なんで、ちゃんと動いているんだろ・・・
もうちょっと解析してみます。
90 :
86 :2007/09/25(火) 17:28:00 ID:XOfpdsF8
x print $test_pm::test; o print $test_pm::hoge; スペルミス。 これでも同じ結果です。
91 :
nobodyさん :2007/09/25(火) 21:26:37 ID:o7XeBw4v
先日このスレで END{<STDIN>} を教えてもらったものです。その節はありがとうございました。 ローカルチェックをする時に、ダブルクリックだけでいいという大変便利なものなのですが、 エラーが出てるときに一瞬で画面が閉じてしまうのです。 ちなみにその時のエラーはuse strictによるmy使え先刻でした。 途中でエラー中断してるのでEND{}まで行かないのは至極当然な話ですが、 エラーの時はエラー内容をSTDINに出力させりょうと思うと大変なことになりますか? エラーにも色々あるので難しいかもしれませんが、用はコマンドプロンプト画面に出ることを 代わりにそのままSTDINに出力してもらえばいいわけなのですが。
>>89 CGIってことはサバにあるわけだ。
つまり君がローカルで試してるファイルとは違うファイルが動いてる可能性もあるわけね。
>>91 コンソールを開いておけない余程の事情でもあるの?
94 :
91 :2007/09/25(火) 22:20:58 ID:o7XeBw4v
>>93 いえ、単純にちょっとしたコードテストをしたいときにわざわざ
1.コマンドプロンプト画面を開いて
2.ファイルがあるフォルダを開いて
3.黒画面にファイルをD&Dしてenter
という手順を踏むのが面倒だといつも思っていたのです。
1.ファイルをダブルクリックする
これだけで済むなら最高です。
意外に大きな差かなって思いまして。
黒画面へのエラー内容出力ってどういう仕組みで行ってるんでしょうか?
きっとperlの方から出してるんだと思いますが、その出し先をSTDINに変えればできるのでは?
とか思ったり。
>>94 同じファイル?ならコンソール開きっぱなしで1回目だけ「perl スクリプト名」で実行しておけば連続テストは↑+Enterで済む。
慣れにもよるけど多分ダブルクリックより速く操作できる
エラーはSTDERRに出力される。
誤解しているようだけどSTDINは標準入力であって出力ではない。標準出力はSTDOUT
96 :
91 :2007/09/26(水) 00:17:27 ID:zmZEFb0X
>>95 2回目以降は確かに楽なんですけど。
STDERRに出力されてるので、END{<STDIN>}で出る入力受付画面には出力されない?
STDOUTへの分はきちんと表示されますし。
STDERRの取得方法があるのでしょうか?
>>89 これ、ActivePerl 5.8.8.822で普通にtest foo barと表示された
ダメ出しも無し
>>96 ラクダ本より
>内部的に発生する例外によって終了する場合でも、ENDサブルーチンは呼び出される(ただし、シグナルによって撃沈された場合は除く)
とあるようにENDそのものが実行されない。自分で(できれば)トラップする必要がある。これはsigtrapを使えばよい。
…が、それくらいなら最初からコンソールから使うことを強く勧める。元々ダブルクリックで起動するようには設計されてないし。
>>91 echo off
perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
みたいなバッチファイル作って、,plに関連付けして置くぐらいかなぁ。
統合型開発環境(みたいなエディタ)を使うと、その場で実行して、
その場で結果表示できたりするので、そういうの使うと便利だよ。
しまった。 > perl %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 は > perl %1 %2 %3 %4 %5 %6 %7 %8 %9 だた。
101 :
101 :2007/09/26(水) 02:22:27 ID:???
型グロブというものについて 教科書を今日読んで理解したので 型グロブについて誰か質問してください。 説明します。
型グロブをうまいこと使っているモジュールを列挙してください。
>>101 ありがとうございます!
スカラー変数
配列変数
リスト
ハッシュ変数?
それらのリファレンスなど
上記との違いを説明してください。
そして何の為にグロブがあるのですか?
僕は素人なのでまだ使うべきところに出会っていません。
いや使えてたらもっと簡単につくれてたのかもしれません。
ビウログってなんですか?
106 :
nobodyさん :2007/09/27(木) 02:15:46 ID:rW8f5K4d
質問です。 if($Fm{'form'}){ 処理 } #フォームに何か入力されていれば処理 上記の場合 フォームに0と入力した場合もスルーされてしまいます。 認識させるにはどのような書き方になるのでしょうか。 if分の前に $Fm{''form'}=sprintf( "%c", $Fm{''form'} ); のように文字列にするという方法を思いついたのですが、ちょっとスマートじゃないなと思っています。 よろしくおねがいします。
if($Fm{'form'} ne ""){ 処理 }
>>107 素早い回答ありがとうございます。
その手がありましたか。目からうろこでした。
ありがとうございます!
length とかも
1000:1234:abcd:2000::/120のような省略されたIPv6のアドレスを展開して リストに格納したいのですが、プレフィックス長(=120)に応じて 展開する部分が一部不完全なので教えてください。 下のコードだと、下4桁の連番生成しかできない上に、プレフィックス長が4の倍数でない場合にうまくいきません。 これを4の倍数でなくても&下4桁以上もちゃんと展開できるようにしたいのですが…。 たとえば、1000:1234:abcd:2000::/127であれば、 1000:1234:abcd:2000:0000:0000:0000:0000 1000:1234:abcd:2000:0000:0000:0000:0001 の二つが出来てほしいのです。 できれば10進数で連番作ったものを16進数変換してる部分もなんとかしたいんですけど…。 sub _Gen{ my ($addr, $pref) = split(m|/|, $_[0]); $addr = &_Format($addr); # ここで省略のない32桁の英数字を4桁ごとに:で区切ったものになる $addr =~ s/://g; if($pref % 4 != 0 || $pref < 112 || $pref > 128){ return; }elsif($pref == 128){ 1 while $addr =~ s/(\w+)(\w\w\w\w)/$1:$2/; return $addr; } my $fixed = substr($addr, 0, $pref / 4); my $keta = (128 - $pref) / 4; my (@addrs, $tmp); for(my $i=0; $i<16**$keta; $i++){ $tmp = sprintf("$fixed%0${keta}x", $i); 1 while $tmp =~ s/(\w+)(\w\w\w\w)/$1:$2/; push(@addrs, $tmp); } return @addrs; }
defined 常考
112 :
101 :2007/09/27(木) 09:02:14 ID:???
型グロブについて。 スカラー変数 アレイ ハッシュ(連想配列) この3つを同時に 扱うために、型グロブは 生まれてきたのです。
113 :
101 :2007/09/27(木) 09:04:34 ID:???
例えば $a ←これはスカラー変数 @a ←これはアレイ(配列) %a ← これはハッシュ(連想配列) aの左側についてる記号は $だったり @だったり %だったりとそれぞれ違うが 記号の右側はaで全部統一されている。 このとき あ 「aの型グロブ!」 と宣言すれば、 $a @a %a この3つを全部同時に扱うことができる。 これが型グロブ。
こいつはOmotiとかタクトくせぇ
115 :
101 :2007/09/27(木) 09:59:46 ID:???
つまり 4年1組と 4年2組と 4年3組が いたとして、 「4年生全員集合!」 と言うと、4年生が全員集まってくるのです これが型グロブです。
全員集まってくることがどういうことか(メリットなど) を語らないと通じないでしょ 肝心な部分が抜けてるポ^^
どっちも4年生なら配列かハッシュ使えば済むでしょ どっちかというと「全学年の1組集合」の方が近いのではないかと。
その例なら多重配列使いたいからそれもちょっと…
119 :
118 :2007/09/27(木) 13:33:29 ID:???
ごめん勘違いしてた
この聞いてjも居ないのに延々と騙ろうとするのはタクトに違いない。
ねぇねぇ なんでおじちゃんたち DBが全部やってくれることを一生懸命書いてるの?
DB使ってないしぃ
DB使わない理由って やっぱサーバーにないから? それとも手をつけたことがない? 後者なら絶対覚えたほうがいいよ。 生産効率が全然ちがうよ
>>110 これじゃだめなん?
use Net::CIDR;
print join("\n", Net::CIDR::cidr2octets("1000:1234:abcd:2000::/127"));
わざわざDB使うほどの事してないしぃ ゴミ箱にごみを捨てるのは、わざわざ執事雇って呼んで捨てさせる程の事じゃないしぃ
>>124 うああああ、助かった
こんな便利なものがあるなんて!
ありがとう〜!
127 :
nobodyさん :2007/09/27(木) 20:05:25 ID:fs1IYXrA
色々なPerlがあるようですが、 rand ≠ rand(1) となるものはあるのでしょうか?ちなみに自分のactiveperl fow win32 5.8は rand == rand(1) になっていると思います。 サバによって違うなら面倒でもrand(1)としといたほうが無難なのでしょうか? それと演算子の優先順位をわかりやすい表にしてるところ知っていたら教えてくださいませm(__)m last if 1-rand(1) <= 0.3; こういうの書く時 last if ( (1-rand(1)) <= 0.3); とすれば確実ですが、地味に面倒で意外と見づらいです。
同じだよ その手の仕様をプラットフォームによって違うようにする必要性がないし
130 :
127 :2007/09/27(木) 20:54:10 ID:fs1IYXrA
>>128 そうですよね。まあでも括弧を外すなら結局rand(1)としないとしつこく引数にとられてしまいますね。
>>129 英語のページですか・・・
僕の学力の低さを見透かしたような皮肉orz
バカにでもわかる一覧表的なページはないということでFA?
unless (0 and 1){ print 1; } 1と表示されます。unlessは条件式が偽を出してくる時にブロックを実行するのですよね? 0 and 1なら片方が真を出すのでブロック実行されないと思ったのですが。 複数の条件式が全て偽を出した時にだけブロック実行をさせたいのです。 回答宜しくお願いいたします。
132 :
131 :2007/09/27(木) 21:22:38 ID:???
ちなみにこれをifでやるとさらにおかしなことになります。 if (1 and 0){ print 1; } これです。何も表示されません。先ほどのunlessとの整合性がつきません。 ifによる条件式部分ではちゃんと二つ共が真の時だけ実行されるのに、 unlessの場合は片方が偽を出せば実行されます。 もしかして 真 and 偽 は最終的に偽扱いされるのですか?
>>132 >もしかして
>真 and 偽
>は最終的に偽扱いされるのですか?
そう。当たり前。
(0 and 1) は(「偽」かつ「真」)だからそんなの成り立たない (「真」かつ「真」)なら結果「真」と評価できる つまり、(0 and 1)は常に「偽」と評価される だから unless (偽) は常にそのブロック内が実行される
135 :
131 :2007/09/27(木) 21:46:53 ID:???
なるほどです。 やはりちょっと違いますねunlessは。 ifのfalse版みたいに思うと微妙にやられますね。 全然関係ない話ですが、Perlには資格ってあるのですか? 書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。 頑張って勉強してそのうちバイトでプログラムの仕事取ってみたいですが、 その時にそういう資格的なものがあるなら売り込みやすいなと思いまして。 本当に関係ない話ですいません。
137 :
127 :2007/09/27(木) 22:08:14 ID:fs1IYXrA
>>136 日本語のページありがとうございます。
見てきますm(__)m
perlの仕事なんか無いよ
>>135 記号論理をやれば当然のことで、それを理解していればifの否定版と考えて問題は起きない
スカラー変数と配列変数をいっぺんに作りたいです。 my ($s1,$s2............$s20); my (@r1,@r2............$r20); 全部書くのが面倒な時は簡単な方法はありますか?
コードの先頭でまとめて宣言するってこと? そんなことすんならuse strict使わない、宣言しないほうがよっぽどいい
142 :
140 :2007/09/28(金) 00:42:26 ID:???
>>141 # 初期化 というところでいっぺんに使う変数を宣言しています。 何故というより癖みたいなものですかね。 それで分析プログラムを作ってたら、やたらと記録や集計用の変数が必要になったんです。 一つ一つまともに名前を考えるのが非効率なのでそこだけ適当な名前にしています。 strcit使いながら賢く宣言できませんか? 無理ならあきらめます。
変数をたくさん使いたいなら代わりにハッシュ使えば一つで済むじゃん
なんだか意味が良くわからないけどハッシュにいれればいいじゃない キー名を考えるのは同じだけど
>>140 なんか、その変数名だと単に配列と二次元配列の初期化だけですむ気がすんだけど?
my ( @s, @r ) ;
# @s は、オマエさんの ( $s1, $s2, ..... ) を入れる配列
# @r は、オマエさんの ( [@r1], [@r2], .... ) を入れる配列
本当に別々の変数名が必要なのか?
本当に必要ならば上の人たちが言ってる通りハッシュorハッシュリファレンス
使え。
for (1..20) { eval "my(\$s$_ , \@r$_)" }
147 :
140 :2007/09/28(金) 06:42:10 ID:???
>>143-145 ごもっともなんですけど、リファレンスにするとコードが汚くなるんですよね。
いちいちデリファレンスしながらのコードは読みにくいし。
ハッシュも同じです。単なるスカラーと配列変数以上に読みやすいものはないかと。
>>146 それってforブロックの中でローカル化されてませんか?
evalするとローカル化されないとか?
>>147 そのevalに突っ込み入れられる実力があれば、
キミの望んだことは実現出来るよな?
まあ、自分の考えに固執しないで、他の人が普通に「hash使え」って
言ってる意味を考えた方が良いと思うけど。
=> perlでは143-145が普通の感覚だし、たかだか変数の
宣誓にevalなんぞ使ってたら「変態さんがいるわ&hearts」
と言われること受けあいだ。
そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
> 書道3段とか簿記3級みたいに客観的にPerlにおけるプログラミング力を第3者に示すもの。 書道の段位なんて流派ごとに異なるので、客観性があることにできないんと思うよ。 日商簿記2級くらいまでなら試験対策する時間さえあれば能力関係なしにとれるから 持ってたからといってだから何?レベルだよね。
Lv8かなぁ?Lv9にはなってない気がする。
>>150 ほんと、7と8の間の河が深すぎる。7.5がほしい。
俺はたぶん6か7だけど。
use strictってどういう効果有るの?ググってもよく分からないや とか思ってる他人のソース弄って何とかしている人がここに一人。
strictやwarningsは融通が利かなくなるので嫌いでちゅわ
いいね、初心者スレらしい。
strictや-wを使って粋がってる自称玄人は笑えるww
無理にstrictやwarings使って本末転倒になってる馬鹿はよく見る
普段から常に使ってるがどういう場面で本末転倒になるんだろう
その昔はグローバル変数をサブルーチンでいじり倒すようなコードがあったけど スコープ区切って引数と戻り値のやりとりするほうが100万倍読みやすいよ
160 :
140 :2007/09/28(金) 18:12:42 ID:???
>>148 >そのevalに突っ込み入れられる実力があれば、
>キミの望んだことは実現出来るよな?
すいません。もう少し普通の会話がしたいです。
>そもそもそんなに個別の変数が必要か否かを考え直したほうがいい
んじゃね?
このよくある「答は一つ、綺麗でスマート」っていうのはどうにも好かない。
>>140 「Perlはあなたが自分の首を締めるのに十分なロープを
提供しているのだ」てな忠告がラクダ本に載ってたな。
#--- Filter/Range.pm ---
package Filter::Range;
use strict;
use Filter::Simple sub {
s{
my \s* \( \s*
([\$\@%][A-Z_a-z][0-9A-Z_a-z]*?) ([0-9]+) \.\. ([0-9]+)
\s* \)
} {
'my(' . join(',', map "$1$_", $2 .. $3) . ')'
}egx;
}; 1;
__END__
#!/usr/local/bin/perl -w
use strict;
use Filter::Range;
my($s1..20) = (1..20);
print $s10;
__END__
Damian Conway ぷろだくとか。
164 :
nobodyさん :2007/09/28(金) 22:27:42 ID:3wKaaJqT
サブルーチンを10個くらい作ってあります。 同じディレクトリに5個くらい違うCGIファイルがあります。 5個のCGIファイル全てに、冒頭の10個のサブルーチンをコピペしてあります。 print routin(1,2); 5個のCGIふぁいるではこういう記述でサブルーチンが使えます。 どうもこれを外部ライブラリ化とかいうのすると print パッケージ名::routin(1,2); で使えるようになるとか。 でもパッケージ名を入れるとなると5個のCGIファイル全てを書き直すのが嫌です。 またパッケージ名が入って見た目がウザくなるのも嫌です。 外部ライブラリにしながらも、メインパッケージにあるのと同じごとくサブルーチンを使うにはどうすればいいでしょうか? メインパッケージに初めに全部もらえばいけるんじゃないかとか妄想していますが。
166 :
nobodyさん :2007/09/28(金) 22:45:38 ID:3wKaaJqT
orz
べつにExporterなんかいらないだろ 全部plファイルにしてrequireでつなげろ
おれだったらOOPが楽かな
>>167 すげえまじで感動したw
つか、require '....pl' ってperl4時代のモンだと思って使ってもなかったよ。
これからも使わんけどw
もちろんstorableとか使用するときには必須>require
があ、Data::Dumper の読み込み時だ。require 使うのorz...
171 :
nobodyさん :2007/09/29(土) 00:51:07 ID:2KPMiuug
みんなrequire つかわないのかw おらぁ使いまくりだ メインCGI一個に 汎用サブルーチンplに処理ブロックごとにpl分割 これが楽でいい。
173 :
164 :2007/09/29(土) 06:51:46 ID:2KPMiuug
>>167 できないんですけど・・・・
s.plのpackage s;にサブルーチンを移しました。
で、
print check(1,2,3,4,5);
でエラーでました。メインパッケージにそんな関数ないと。
もちろん
print s::check(1,2,3,4,5);
なら動作します。
どういうことですか?
ウソ付きましたか?
3時間の出来事をシミュレーションするプログラムを書いています。 一応完成したのですが、時間の捉え方が「残り時間」というものになっています。 これを例えば、9時〜12時の間とかで捉えたいのです。 今は内部の処理が進むにつれて「残り時間」の変数を減算して、「残り時間」変数が0になったら処理おしまいというものです。 これを開始時刻と終了時刻を初めに決めて、+10秒とか命令出しながら実際に時間が進んでるかのような感じに 「今何時?」と聞けるくらいの感じに変えてみたいのです。 使えそうなモジュールがあったら教えてください。
>>173 >package s; に移しました。
何故移す?
変数名を参照することって出来ますか? $test = 'abc'; という変数があるとして、$testの'test'の部分を知りたいのです。 例えば、@a = ($test, $boo, $hoge); という配列があるとして、 これを それぞれ変数名 => 値 というハッシュに変換したいのです。 $h{'test'} => 'abc' のように。
>>176 > @a = ($test, $boo, $hoge);
この時点で $a[0] には $test が持つ値 'abc' そのものがコピーされて入る。
よって代入後に @a 内の各値からコピー元の変数名を辿る事はできない。
178 :
nobodyさん :2007/09/29(土) 21:46:18 ID:m5gmrcyE
文字コードをUTF-8に変換したいのですが use Jcode; $str = "あああ"; print Jcode->new($str)->utf8; とすると Undefined subroutine &Jcode::_Classic::euc_utf8 called at パス/Jcode/_Classic.pm line 255. というエラーが発生してしまいます。 ちょっと調べたらJcodeのバージョンを下げれとありましたがそれは無理なので何か他に方法はないでしょうか。
未だにJcodeが使われるのは子飼弾がちゃんとEncodeの使い方を解説しないからなのか・・・
>>178 使っているPerlのバージョンは?
Jcodeはどのようにインストールしたもの?
>>179 Web関連のムックで書いてなかったか? >Enocdeの使い方
181 :
164 :2007/09/30(日) 08:09:20 ID:9pVP3h63
>>175 そりゃ中身なにもないものをrequireしてもしょうがないからですよ。
一体何が間違ってるというんですか?
メインパッケージにないものをrequireを使えば
routin(1,2,3);
で呼べるというのは本当なんですか?ウソなんですか?
ほらね、strictとwarningsを無理に使うと本末転倒になるでしょ。
>>181 誰もウソなんかついちゃいない。
お前が全然理解できてないだけ。
184 :
164 :2007/09/30(日) 08:40:27 ID:9pVP3h63
>>183 だから何をどうしろというんですか?
最小コードを教えてください。
>>182 181の事を示して言ってるならwarningsもstrictも無関係にエラー出るぞ。
176はそう言う次元のお話しではないし、
178は、my宣言してないからwarningsとか宣言してないと見るが?
別にstrict,warningsを嫌うのは勝手だけど、事象は切り分けてくれ。
ここは初心者スレで勝手に脳内変換して
>>182 を信じてしまう人が
いる可能性もあるんだから。
>>184 うざいなあ、ここで文句垂れてる間にググればとっくに exporter の使い方も
習得出来てるだろうに
% cat foo.pl
sub foo{ 1 ; }
1;
% perl -le 'require q{foo.pl} ; print foo()'
1
>>185 ああごめん。mod_perlと混同して勘違いしてた。
Perlが初めての方なら尚更strict/warningsは
ややこしくなるから不必要だと思うけど。
188 :
164 :2007/09/30(日) 10:10:19 ID:9pVP3h63
>>186 突っ込みが下手すぎ。
package使うなって言って欲しかった。
190 :
164 :2007/09/30(日) 11:09:19 ID:9pVP3h63
もしもお前に部下がいるなら可哀想だ。 まだ使う側でないというなら、今のうちに間違いを指摘してきた相手が目下だと反省のできない上司にならないよう気をつけておけ。
>>188 「最小コードを書け」
って言われたから書いたまでだが?
>>175 で package に関する点は指摘されてるだろ
>>187 mod_perl の mod の字も出てないのに…
自分の読解力、理解力の無さを棚に 上げて回答者を批判する男の人って…
193 :
164 :2007/09/30(日) 14:35:18 ID:9pVP3h63
>>191 >>175 のどこがpackageに関する点の指摘なのよ。
あれじゃサブルーチンを別ファイルに移した事の指摘だろ。
>>192 女ならいいのか?クソフェミニストめ。
質問してもよろしいでしょうか? すみませんが宜しくお願いいたします。 特定の契機を迎えたとき? @_や$_には値が自動でセットされるようになっていますよね? その契機の一覧みたいなものが知りたいのですが、膨大ですか? うまくまとめてるサイトあれば教えてください。
やはり読解力の欠片も無いな
>>179 5.005とか5.6と互換を取るのに便利だったりする。
(5.005は古いバージョン使ってたり、変換規則が違ったりするけど。)
それはともかく、チュートリアルをpodで欲しいとか思うよね。
unicodeのチュートリアルとか、あっちこっちにドキュメントが散らばってて、
しかも、翻訳も無かったりして、初心者にはきついと思う。
コーディングではないけれどPerl関連(Windows関連?)ということでお願いします。 PerlのパスをUNIX風に設定しておくことってできますか?(usr/bin/perl) 今は5.8なんですが、前に5.6の頃、実際のパスがc:\perlだとしても この書き方(パス)で動いてた気がするんだけど・・・
5.8でも動く件
200 :
198 :2007/10/01(月) 01:04:55 ID:???
>>199 すんません、ブラウザでCGIとして起動した場合はどうですか?
関連に気づかなくて書かなかったんですが、
こちらでもプロンプトでは動くんだけど、ブラウザではアウトです。
普通にpath通せばいいんじゃね?
それはPerlじゃなく各々のhttpdの管轄 なので他の適切なスレを当たって下さい
203 :
198 :2007/10/01(月) 02:14:31 ID:???
>>201 ありトゥース!・・・が、しかし。。
恥をしのんでお尋ねしますが、パス通すって・・?
Windowsの環境変数にusr/bin/perlを追記するってことではないですよね。
い、いかように・・・
関連付けでおk。
205 :
nobodyさん :2007/10/01(月) 09:49:39 ID:4GodVsb7
>>180 レス遅くなってすみません。
JcodeやめてEnocdeで対応させました。
perlのバージョンは5.8、Jcodeは最初サーバーには入っていなかったので
自前で自分のディレクトリにインストールして使ってました。
それで問題なかったのですが最近サーバの方が用意してくれたらしく
そっちを読み込むようになってました。
そのサーバにインストールされた新しいJcodeで問題が発生していたと言う次第でした。
しかし新しいJcodeはなんであんなとんでもないバグを持ってるんだろうか。
UTF-8変換できなきゃJCodeの存在意義が無くなるのに。
>>203 環境変数にperl.exeのパスを通せばいい。
もしくは出来るならhttpdの方で指定するとか。
>>203 かなり無理やりな解決方法。
C:\直下にusrを作って、そこへC:\Perl\bin\(Enter連打でinstした場合)をフォルダごとコピー。
でC:\Perl\lib\とC:\Perl\site\もフォルダごとコピー。
これでC:\usr\直下に、binとlibとsiteができる。
それでcgiファイルの頭に
#!/usr/bin/perlでOK。
でも、ppmや、自前でモジュールインストールする度に、本来のC:\Perl\以下よりlibやsiteをコピー
しなければならないし、UpgradeやUninstallの時も当然ながら消してはくれません。
普通の人にはお勧めできない。
実を言うと、C:\直下にusrやtmpやvarなんかを作ってると、perlスクリプトの中からフルパスで
/var/tmp/〜とかやってファイル操作したりするのに、Unix環境といちいち書き換えなくて済むっちゅう
横着ができたりします。
activeperlで>207の方法をやるなら、perldoc reloc_perlを見ると幸せになれるかもしれない。
質問です。 LWP::UserAgentとCrypt::SSLeayを利用して、SSLでサーバと通信を行っています。 相手先の証明書が、期限切れなど信頼できない場合は、以降の処理を打ち切りたいのですが、 それを判別するにはどうすればよいですか?
LWP::Protocol::httpsにヒントがあるかもね
211 :
180 :2007/10/02(火) 02:34:16 ID:???
>>205 ん、別に少し間が開いたくらいは気にせんからいいよ。
ただ、サーバー管理者が入れたのがおかしいってのは変だね。
症状からすると、(わざわざ)pure perl のコードを選択したときのバグっぽいけど
これって fix されたんじゃなかったっけか?
それにPerl本体が 5.8なら Encodeを利用する形でJcodeは入るはずだしなあ。
212 :
nobodyさん :2007/10/02(火) 06:25:36 ID:SbhRpQr+
レン鯖に特定のモジュールがインスコされてるかどうか テストするのに良い方法はないでしょうか?
@INCを総当たり
>>212 実際に use して調べるのが一番確実。
#!/usr/bin/perl -w
use strict qw(subs vars);
my $token = qr/[A-Z_a-z][0-9A-Z_a-z]*/;
my $module = ($ARGV[0] || '') =~ /^($token(?:::$token)*)\z/ ? $1 : '';
my $result = $module ? eval "use $module" : 'usage:
http://.../this.cgi?Module::Name ';
$result ||= $@ || qq/$module ${"${module}::VERSION"}/;
print "Content-Type: text/plain\n\n$result";
__END__
もう少し可読性を高める努力をしろよ。
>>207 インストールしなおしでその構成になるようにしたほうがいいんじゃ・・・
$^Oが取り得る値のリストってどこかにない?
>>215 コードまで書いていただいてありがとうございました。
use <モジュール名> をevalして戻り値を確かめるわけですね。
どうもevalは使うのに躊躇してしまうんですが、こういうときは便利ですね。
>>213 @INCの中を覗くという発想も考えたことがなかったので
やってみたいと思います。
221 :
nobodyさん :2007/10/02(火) 21:03:46 ID:2QBdgnfp
日本語変換の問題について質問です。 コードをEUCで書いて、出力をShift_JISで行うのが目的です。 今はjcode.pl使っています。 activeperlのwinxp用でローカルチェックをしています。 JCODEというモジュールもあるそうですが、activeperlには初期状態でなかったりしますよね。 確か自分は入れた覚えもあるのですが。 オススメは何ですか? 確か他にも変換用のモジュール?はあったと思いますが。 euc,shift_jis,jisの3つだけでのオススメが知りたいです。
>>221 万能解は無いので、Encode / Jcode / jcode.pl / Unicode::Japanese を
一通り使い込んでから、好みと用途に合ったものをお選びなさいな。
いまさらjcode.pl薦めるなよ。
224 :
221 :2007/10/02(火) 23:41:50 ID:2QBdgnfp
jcode.plを除いて一番汎用的に使えるのはどれですか? 汎用的って言っても、サーバーやローカル環境で一番広く使えるものです。 一番広まってるモジュールといえばいいのですかね。
リストをリストのままリストの個数を得るにはどうすればいいですか? (1,2,3,4,5) これを配列にいれずにってことです。 grepとかでもリストが作られますよね。 そういうときにわざわざ配列に入れてから要素数を知るのが面倒です。 scalar(@{[grep{$_>0}]}) っていうのも同じくなんかなぁと思います。 普通にないなら関数作ろうと思うのですが。
scalar(@{[1,2,3,4,5]})
はあ
システムに依存する組み込み関数が使用できるかどうか 手っ取り早く調べる方法ってなにかな?
>>224 インスコしてなかったら自分で読み込むようにすればいいよ。
use libつかうなり同階層に置いてuseするなり。
231 :
225 :2007/10/04(木) 00:46:59 ID:kUiVRXqk
>>230 黒魔術みたいなコードはいけないってこのスレで教えてもらいました。
素人ながら納得しました。
ですからあなたもそういうコード書いていてはいけないと思います。
それも教える側でそれを使うと黒魔術が流行ってしまいます。
僕にはあなたのコードが何をしてるのかわかりません。
++$num for (1) x rand 10; こんな書き方はじめてみたw 7行プログラミングとかに出てきそうだな。 だれか解説というか一般的な形にしてクレクレ
foreach((1) x rand(10)){ ++$num; }
こんなの全然黒魔術じゃないと思うが・・・
中身が1行のfor(もしくはforeach)なんて普通こう書かんか? ↑もう何年もforeachなんて書かずにforで済ませてるからスペル調べちまったw
それは分かりづらい。括弧でくくった方がいいな。 ++$num for ((1) x rand 10);
これだからPerlのコードは気持ち悪いんだよな
238 :
225 :2007/10/04(木) 07:08:27 ID:kUiVRXqk
((1) x rand(10)) これの意味がわかりません。 1*10とどう違うんですか。 それとforに10とか与える意味も。 0..10ならわかるけど。
このスレは精神障害者ばかりですね。
>>231 その程度の実力で関数を自作するってかw
>>238 ひょっとして
>吐かせた結果を保存しないのなら、目の前を流れていく
>個数を数えるしかない。
の意味がわかってないのか?
お前が一定の個数で決め打ちしたいなら最初からそうすればいいだけ。
>> grepとかでもリストが作られますよね。 >> そういうときにわざわざ配列に入れてから要素数を知るのが面倒です。 grepに限って言えばスカラーコンテキストでは条件が真になる要素数を返すわけだが。 % perl -e 'print scalar(grep { $_ > 0 } 0,1,1,0,1)' 3
x 10ならわかるけどなんでrand(10)なん? それがいまいちわからんぽ
いつも10だと面白くないと思って乱数にしただけで特に意味はないだろう。 そんなこと気にしてるとハゲるぞ。
>>238 http://perldoc.jp/docs/perl/5.8.8/perlop.pod 「Multiplicative Operators operator, multiplicative」の項
rand EXPR は 0 以上 EXPR 未満の値を返すので、整数値が欲しい際は
通常 int() を通す。但し perl が整数値を欲しがっている箇所に小数値が
与えられた場合は、自動で整数値に丸められる。
$str = substr('abcd', 0, rand 5); # '', 'a', 'ab', 'abc', 'abcd'
$var = $array[ rand @array ]; # @array 中の要素からランダム選出
x 演算子の右辺は「個数」という整数値を要求しているので、(1) x rand 5
という式は (), (1), (1,1), (1,1,1), (1,1,1,1) のいずれかになる。
>>243 >>241 が指摘してくれているように、最初から個数が分かっているなら
「リストをリストのままリストの個数を得る」必要はなく、$num = 10;
等と書いておけば済む。(1) x rand 10 という式には「要素数が不定で」
「コピペですぐ動作確認できる」リストのサンプルという以上の意味は無い。
これ何? $|++;
出力バッファの自動フラッシュを抑制
ハニーフラッシュ!
抑制じゃねえ間違えた まあいいや
プログラミングPerlのパッケージ、オブジェクトの章を読んでも意味が さっぱりわからなかったのですがどうすればいいですか? みなさんはあそこに書いてあること、あっさりわかりました?
OOP 勉強したいなら Plagger に入門すればいいよ!
255 :
nobodyさん :2007/10/06(土) 12:48:34 ID:PfM+S4yJ
foreach(){} ↑フォーイーチみたいな発音でいいですよね・・・?
256 :
255 :2007/10/06(土) 13:03:13 ID:PfM+S4yJ
追加お願いします。 use strict; my %hash = qw/2 5 s 2 d 3/; print map{"$_ " , 1}keys %hash; >Execution of C:\test.pl aborted due to compilation errors. これ何がいけないんですか? print map{$_ ," ", 1}keys %hash; こう書き換えるとエラーになりません。 activeperl5.8.1のwinxp稼動です。
257 :
255 :2007/10/06(土) 13:23:18 ID:PfM+S4yJ
ぐるせいや。ぐるせいや。
259 :
255 :2007/10/06(土) 15:01:35 ID:PfM+S4yJ
>>258 すいません。わからないです。
教えてください。
> perldoc map見れば分かる > map - An utility to map texts from and to unicode ねーよwww
261 :
255 :2007/10/06(土) 17:19:29 ID:PfM+S4yJ
print map{("$_ ", 1)} keys %hash;
読み方なんてどーでもいいじゃん スクールでも始める気か?
>>260 -fを入れることも自分で分からないようではいかんだろって意味であえて書かなかった
266 :
255 :2007/10/06(土) 19:25:29 ID:PfM+S4yJ
>>264 ありがとうございます。
それでフォーイーチでいいのですか?
用語なんで普通の読み方で本当にいいのかという意味の質問だったのですが。
mapの方ですが、
my $hash = {"A "=>"5" , "s"=>"2" , "d"=>"3"};
これでエラーが出ないんです。"A "でエラーが出ないのに、どうして
print map{"$_ " , 1}keys %hash;
でエラーが出て
print map{$_ ," ", 1}keys %hash;
でエラーが出ないのか。
よくわからないのですが、ハッシュリファレンスとしてエラーが出そうなのは後者だと思うんです。
カンマが足りないってことで。
そして前者はブロックとしても式としても何も問題がないと思うのです。
my $test = 1;
if("$test " , 1){
print "ok";
}
これを走らせてもエラーでないですし。
そこらへんどういうことなのかわかりますでしょうか?
267 :
255 :2007/10/06(土) 19:28:03 ID:PfM+S4yJ
>>266 >それでフォーイーチでいいのですか?
関数名の読み方に正解なんてないから好きに呼べよ。
余程狂ってなきゃ誰も笑ったりしないよ。
で、結局何が問題なんだ?
結論は既に出てるし、perlの仕様について文句言われても困る。
釣りなのか読解力がないのか単なる馬鹿なのか
>>267 それはperlのオプション。
あんたが必要なのはperldocのオプションだから、
コマンドラインからperldoc perldocで確認すべし。
272 :
255 :2007/10/06(土) 20:43:43 ID:PfM+S4yJ
>>268 何故エラーが出るのかわからないのです。
>>266 にあるとおりです。
>>264 さんのところの話ではつじつまが合わないのです。
>map { ... は map BLOCK LIST の場合と map EXPR, LIST の場合があります。
どちらとして評価しても
print map{"$_ " , 1}keys %hash;
これでエラーが出る説明になりません。
273 :
255 :2007/10/06(土) 20:47:23 ID:PfM+S4yJ
>>271 なるほどつまり-fの意味は
perldoc -f map
で、mapの仕様を確認しろって事なんですね。
>>272 {"$_ " , 1}をEXPRとして、keys %hashをLISTと解釈すると、コンマが足らない。
275 :
255 :2007/10/06(土) 22:39:59 ID:PfM+S4yJ
>>274 ん・・・
map EXPR, LIST
↑これかーー!
納得です。ずっと{}の中のコンマばかりに注目してました。{}とLISTの間のコンマのあるなしが問題だたのですね。
フォーイーチでいいんじゃないの?
perldoc に -f をつけるだけで上場できるインターネッツはここですか?
むしろ英単語の for と each をくっつけただけのものを 他になんて読めるのか知りたい
>>278 仏単語の fo と 英単語の reach をくっつけたものという可能性も検討すべきでは?
280 :
nobodyさん :2007/10/07(日) 18:18:02 ID:LZD6O2BK
フォーチだろ。
281 :
nobodyさん :2007/10/07(日) 21:49:16 ID:lRWvT8wN
ソケット使ってホームページを取得するプログラムを書いてます。 HTTP/1.1 200 OKが返ってきて、Content-lengthもある程度あるのに、 フッタが何もないことがあるのですがどうしてでしょうか。 正常に見れるサイトもあります。 use Socket; use FileHandle; $host = "www.ftnet.or.jp"; $path = "/FTtuusin/index.html"; $port = 80; $ip = inet_aton($host) || &error("host($host) not found.\n"); $SOCKADDR = pack_sockaddr_in($port, $ip); $res = &connect($host,$path,$port); print $res; exit;
282 :
nobodyさん :2007/10/07(日) 21:51:37 ID:lRWvT8wN
sub connect { my ($res, $host, $path, $port); $res = ""; $host = $_[0]; $path = $_[1]; $port = $_[2]; # ソケットの生成 socket(SOCKET, PF_INET, SOCK_STREAM, 0) || return -1; # ソケットの接続 connect(SOCKET, $SOCKADDR) || return -2; autoflush SOCKET (1); print SOCKET "GET $path HTTP/1.1\n"; print SOCKET "Referer: $url\n"; print SOCKET "Host: $host:$port\n"; print SOCKET "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\n"; print SOCKET "Connection: close\n"; print SOCKET "\n"; foreach (<SOCKET>) { $res .= $_; } close SOCKET; return $res; }
283 :
nobodyさん :2007/10/07(日) 21:53:04 ID:lRWvT8wN
レスポンスは HTTP/1.1 200 OK Date: Sun, 07 Oct 2007 11:31:44 GMT Server: Apache/2.0.52 (CentOS) Last-Modified: Fri, 16 Jun 2006 05:41:38 GMT ETag: "4474a-daf-deccc880" Accept-Ranges: bytes Content-Length: 3503 Connection: close Content-Type: text/html
フッタって何の事言ってる?
285 :
281 :2007/10/08(月) 00:21:06 ID:???
すまん、確かにフッタって言葉は違う気がしてきた。 本文の部分です。htmlが書かれてる部分。
>>281 「何もない」状態を確実に再現できる例を
用意してくれないと、デバッグの手伝いはできないよ。
少なくとも手元の環境だと
>>281-282 のコードとサイトは
一応動くし全部取得できている。
HTTPは正確には\nではなく\r\nでそ
HTTP/1.0にしたら解決しましたって答えは無しな。 わざわざ作るなら1.1を使う物を作ろうよ。
答えじゃないな。解決法だなorz
ちょっとここでいいのかどうかわかりませんが、質問です。 HTML-Parser-3.56を、cpan2rpmで.rpmにリビルドしようとしてたんですが、 make testの段でエラーになります。 (略・・・ t/unbroken-text......ok t/unicode-bom........ # Failed test in t/unicode-bom.t at line 43. # got: 'Parsing of undecoded UTF-8 will give garbage when decoding entities at t/unicode-bom.t line 24. # Parsing of undecoded UTF-8 will give garbage when decoding entities at t/unicode-bom.t line 28. # Parsing of undecoded UTF-16 at t/unicode-bom.t line 31. # Parsing of undecoded UTF-16 at t/unicode-bom.t line 34. # Parsing of undecoded UTF-32 at t/unicode-bom.t line 37. # Parsing of undecoded UTF-32 at t/unicode-bom.t line 40. ・・・・(略) t/unicode............ok t/xml-mode...........ok Failed Test Stat Wstat Total Fail Failed List of Failed ------------------------------------------------------------------------------- t/unicode-bom.t 1 256 2 1 50.00% 1 1 test and 1 subtest skipped. Failed 1/48 test scripts, 97.92% okay. 1/430 subtests failed, 99.77% okay.
291 :
つづき :2007/10/08(月) 06:55:12 ID:???
で自前で、tar xzf HTML-Pasrer-3.56 perl Makefile.PL make make test したときは、ビルドエラーにならず、 (略... t/xml-mode...........ok All tests successful, 1 test and 1 subtest skipped. Files=48, Tests=430, 5 wallclock secs ( 3.03 cusr + 1.62 csys = 4.65 CPU) と、ちゃんと通ります。 そこで、途中経過のspecファイルと、自前make時の出力を見比べてみると、 1:cd HTML-Parser-3.56 2:grep -rsl '^#!.*perl' . | 3:grep -v '.bak$' | 4:xargs --no-run-if-empty /usr/bin/perl -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)' 5:/usr/bin/perl -MExtUtils::MakeMaker -e ' print qq|PREFIX=/var/tmp/perl-HTML-Parser-3.56-root/usr| if $ExtUtils::MakeMaker::VERSION =~ /5\.9[1-6]|6\.0[0-5]/ ' | 6:/usr/bin/perl Makefile.PL と、cd HTML-Parser-3.56 から /usr/bin/perl Makefile.PLまでの間になにか挟まってます。(↑のはcpan2rpmで出来たspec) 多分、5行目は、仮インストールPREFIXを指定してるとこなので必要だとは思いますが、2,3,4行目でやってることの 意味がわかりません。
292 :
つづき2 :2007/10/08(月) 06:56:35 ID:???
ためしに自分で展開したHTML-Parserに、上の部分だけ(5行目以外)shスクリプトにコピペして実行してみると、 make testでエラーになりました。 さらに、2,3部分のみ実行すると、 ./t/document.t ./t/marked-sect.t ./t/dtext.t ./t/msie-compat.t ./t/stack-realloc.t ./t/headparser.t ./t/crashme.t ./t/script.t ./t/filter-methods.t ./t/entities2.t ./t/unicode.t ./t/unicode-bom.t ./eg/hlc ./eg/hform ./eg/hstrip ./eg/htitle ./eg/htextsub ./eg/htext ./eg/hanchors ./eg/hdump ./eg/hrefsub ./mkpfunc ./mkhctype と、こんな結果になるんですが、これをlist(@ARGV)として perl -MExtUtils::MakeMaker -e 'MY->fixin(@ARGV)'に渡してるんだと思うんですが、 この'MY->fixin(@ARGV)'がなにをやってるのかがわかりません。 MakeMaker.pmやそこからuse,requireしてるモジュールから'fixin'関数を探しましたが見つからず、 また、ggってみても、cpan2rpmの途中経過を報告してるページにHITするだけで、これが何を意味してるかがわかりません。 specから、この2,3,4の部分を消してrpmbuildするとちゃんとビルドが通ることは通るんですが、 なにか重大な落とし穴があるような気がして、気持ち悪いです。
293 :
290 :2007/10/08(月) 07:22:51 ID:???
おっと、MM_Unixのマニュアルに’fixin’を発見。今までWin機にインストールされたマニュアルみても出てこんわけだ。 でも、説明の Inserts the sharpbang or equivalent magic number to a set of @files. で?? sharpbangってなんですか。 さらにUnix版のMakeMaker.pm内で検索かけても’fixin’で出てこない。 なおさら???です。
294 :
290 :2007/10/08(月) 07:37:52 ID:???
なんべんも連投すいません。 sharpbangってのはどうやらファイルの頭の #!/usr/bin/perl ってのらしいですが、ますます訳がわかりません。 一晩寝てないんでもう頭がバグってきました。 もう寝ます。
> 一晩寝てないんでもう頭がバグってきました。 徹夜なんかする奴はばかです。
296 :
281 :2007/10/08(月) 12:47:24 ID:???
>>286 >>281 は余計と思われる部分を省いて、通信に関わる部分だけを書いたんですが
それを実際に自分で動かしてみたら正常に動きました。
htmlを取得したあとの文字列処理が原因だったようです。
ご迷惑おかけしました。サンクスです。
298 :
290 :2007/10/08(月) 21:22:47 ID:???
昼間寝てリフレッシュしたんで、追跡再開。
>>297 のおっしゃる通り、’MY->fixin(@ARGV)’で、292のテストスクリプト一式の先頭行が、
#!perl -w から #!/usr/bin/perl -w に書き換えられてる模様。
でその下に3行ほど、
eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
if 0; # not running under some shell
ってゆうコードが追加されてます。
それ以下、use strict・・・からの実行部分は両者(自前makeとcpan2rpm)で一字一句違いなし。
(ここからはmake testでエラーの出る t/unicode-bom.tに絞って追っています)
なんで上の追加された3行が原因か?と調べてみると、ここの部分は、どうやら一部の/bin/shが頭の
#!/usr/bin/perl(sharpbang)を認識しない時用に直接shから起動させるためのコードの模様。
これが原因ではないっぽい。
う〜んと思ってスクリプトを上から順になぞっていくと、
!!!!!っ! わかったーーー!!
このスクリプトの後半部分で、is(join("",@warn), <<EOT)以下で、warningのトラップをしてるんだけど、
うえの3行が追加されたことによって、当然実行部分の行数が3行づつ下がってるんだけど、
warningトラップの各対応行がもともとのまま(つまり実際の行数-3の)部分と比較しようとして
is()がこけてmake testがエラってたんです。
>>295 いや〜〜、やっとエラーの原因つかめてすっきりしました。これで今晩はゆっくり寝れます。
299 :
sage :2007/10/09(火) 19:35:34 ID:oM/XiNAd
Net::Telnetモジュールについての質問です。 ルーターにログインし、$telnet->cmd("show running-config")にて現在のルーターの設定を取得したいのですが、 取得した設定の中に、現在のプロンプトを示す文字列(例えば'#'など)があった場合、そこの行でデータの取得が終わりになってしまいます。 $telnet->promptコマンドにてユーザープロンプトを設定したのですが、その文字列もルーターの設定の中にあった場合、そこで設定の取得が止まってしまいます。 以下に例を書きます。 use Net::Telnet; use strict; my $telnet = new Net::Telnet( Timeout => 10); #ログイン、特権モードへ $telnet->open(host_name); $telnet->login(user_name,password); $telnet->print("enable");#特権モードに $telnet->waitfor("/Pass/i"); $telnet->print(priv_password);#特権パスワード $telnet->waitfor('/#/'); #特権プロンプトで待つ my @show_run = $telnet->print('show running-config'); $telnet->waitfor("hogehoge"); ここのhogehogeに設定した文字列がrunning-config内にある場合、 そこでrunning-configの取得が終了してしまいます。 なにかうまい回避方法があればご教授願います。
正規表現でもっと詳細に指定してみるとか。
302 :
nobodyさん :2007/10/09(火) 22:14:34 ID:gGNoM/Xe
Can't locate object method "new" via package "XML::RSS" (perhaps you forgot to load "XML::RSS"?) at XML/RSS.pm line 3. って出たんですがこのエラーはなんですか?
XML/RSS.pmの ソースコードの3行目で XML::RSSのロードを忘れたので オブジェクトメソッドであるnewを 配置できなかった。
>>299 $telnet->prompt('/user prompt $/');
類似した関数を各ファイルにまとめて、それをuseして使っています。 しかし、それぞれのモジュールで、use CGI としているのですが、 これにより余計な負担がかかっているということはありますか?
構造を見直すべきだと思うが、 %INCがちゃんとしてくれるから 重複されてロードされるとかはないはず
キャッシュを貯めているフォルダが大きくなりすぎてFTPクライアントではアクセスできません フォルダごと削除したいのですがスクリプトでどうにかできますか?
system "rm -rf /";
309 :
307 :2007/10/11(木) 17:56:32 ID:???
>>308 消すことができました
ありがとうございます
ちょwww
ヤフーで検索した検索の秒数や検索されたURLの一覧を出すような事は Perlで実現可能でしょうか? 例えば「リンゴ」で検索すると自身のサイトで --------------------------------------- ・約27,900,000件 ・0.01秒 ・ja.wikipedia.org/wiki/リンゴ ・www.kcsnet.ne.jp/kyoei ・www.kodomo-iin.com/HL/HL220.html ・www.hasp.tv ・www.yumeringo.com (続く --------------------------------------- このように表示させたいのです。 もし実現可能であれば、どのような仕組みを学べば良いでしょうか。
ヤフーがAPI用意してればできるんじゃない?
ヤフーAPIならとっくに公開してるぞ
314 :
nobodyさん :2007/10/12(金) 04:05:22 ID:i4CjOo+I
XML::RSSについて質問です。
rssのバージョンが1.0の場合、以下のソースの#エラーが出るの部分で
Use of uninitialized value in concatenation (.) or string at rss line 21.
というエラーが出てしまいます。
他の<link>タグなどの場合は表示できるので
<dc:date>などの名前空間を使っているタグの場合に
上記のエラーが出てしまうみたいです。
どうすれば、名前空間のタグデータも表示できますか?
my $rss = new XML::RSS;
my $url = "
http://hoge.con/rss.xml ";
my $dat = get($url);
my $result = $rss->parse($dat);
foreach my $item ( @{$rss->{'items'}} ){
if($result =~ /1.0/){
print "@{$item_list}[0]->{'dc:date'}\n"; #エラーが出る
}elsif($result =~ /2.0/){
print "@{$item_list}[0]->{'pubDate'}\n";
}
}
print @{$item_list}[0]->{'dc:date'} || '', "\n"; とか。
316 :
314 :2007/10/12(金) 04:37:32 ID:???
すいません。
ソースがおかしかったんで張りなおします。
my $rss = new XML::RSS;
my $url = '
http://hoge.com/rss20.xml ';
my $dat = get($url);
my $result = $rss->parse($dat);
foreach my $item ( @{$rss->{'items'}} ){
if($result =~ /1.0/){
print "$item->{'dc:date'}\n"; #エラーが出る
}elsif($result =~ /2.0/){
print "$item->{'pubDate'}\n";
}
}
317 :
314 :2007/10/12(金) 04:50:59 ID:???
自己解決しました。 print "$item->{'dc'}->{'date'}\n"; という記述でうまくいきました。 お騒がせしました。
318 :
nobodyさん :2007/10/12(金) 22:46:03 ID:w18ekEW+
ここにいる人は仕事でもPerlに問わずプログラミングをしてるのですか? そういう仕事に就くにはやはり学校などを出てる必要があるのでしょうか? いわゆる大卒みたいな最低条件というか。 前から一度経験してみたいなと思っていましたが、そういうアルバイトはないんでしょうか。 建設現場の日雇いみたいに気軽にやってみたいです。 本業はありますが、結構時間はあるほうなので。 この世界はどうなってるのでしょうか?
仕事に関する大事なことを自分で調べず2chで聞いてる時点で・・・
セックスアパートって会社で働くといいよ。
321 :
nobodyさん :2007/10/12(金) 23:23:59 ID:w18ekEW+
2ちゃんをバカにしてる利用者ほどその利用方法はひどいって法則誰かが言ってましたね。
プログラマーなんて趣味の延長だろ 24時間PCの前でカタカタやるのが楽しくなきゃやってられない
「CGI Perl 実務経験なし 初心者OK」で求人サイト検索すりゃいいべ。
多分しっかりやらないとプログラムは楽しくない。
プログラマーは3桁残業にも耐えられる精神力+体力が必要。 年取ったら高確率で禿げそう。
327 :
nobodyさん :2007/10/13(土) 15:06:53 ID:iKtPwiMH
$a = 0000010 この文字列を数字に変える($ = 10) 簡単な表記はありますでしょうか? sprintf使ってみたのですが上手くいきません
それは文字列じゃなくて8進数じゃ? もし$a= "0000010"; なら 関数int使えばいい
329 :
327 :2007/10/13(土) 15:13:51 ID:???
すみません 自己解決しました %dで
330 :
318 :2007/10/13(土) 16:40:37 ID:5Vuk1MtC
この雰囲気からすると日雇いなんかなさそうですね。 しかしこういう雰囲気からすると日雇いなんかありませんよね。 ちょっと待って日雇いなんかありませんよ。 実際いきなりそれを本職とするのは厳しい。 どういう雰囲気なのか味わいたいだけと考えるとそういう会社で働いてる人脈を作るのがよさそうですね。 ここの本職の方は会社と自宅以外にどこに行きますか? 明日とかきっと休日だと思いますけど、街へ行ったりするんですか? 家族持ちだとどうしても接点を取っても仲良くはなれなさそうだから。 独身がいい。女を紹介とかすればそれなりに仲良くなれる気がするんですが。 どうですかね。女は嫌いですか?
コーディング初心者質問スレであって、IT 土方向けの仕事斡旋スレではないんだよなぁ。
332 :
318 :2007/10/13(土) 19:19:29 ID:5Vuk1MtC
なるほど。 やはり頭は固いと。
釣りにしては程度が低すぎるんだが、これは素で言ってるのか?w だとしたらやばすぎる。
スルーしとけよ
スレ違いという自分のミスを指摘され 馬鹿にされ悔しさのあまり慢心で書き 出した文章がこれ
336 :
nobodyさん :2007/10/13(土) 21:53:08 ID:fl6REYk4
IPアドレスから携帯かPCかを判断したいんですがどうやればいいんですか?
ここで宣う前に「調べる」ことをお勧めいたします。
338 :
336 :2007/10/13(土) 22:23:53 ID:???
ググっても分からなかったので教えてもらえませんか
どうググったのですか
(´-`).。oO(ググる≠調べる ググる=さがす ・・・と思うけれども。。。)
341 :
336 :2007/10/13(土) 22:58:35 ID:???
perl IPアドレス 携帯か 判断 とかで検索したけど出てきませんでした
俺なら perl 携帯 判定 でぐぐるな。
cpanでmobile ipとかで調べたらいいんじゃね?
>>342 それだとUA判定が多いんじゃ?
携帯 IPアドレス wiki で検索かけたらあったぞ
345 :
336 :2007/10/13(土) 23:56:59 ID:???
UAで判定できるなんて知らなかった。 IPアドレスより楽みたいですね。
346 :
342 :2007/10/14(日) 00:01:08 ID:???
>>344 そうだった。IPで判定したいんだったな。これは失礼。
347 :
336 :2007/10/14(日) 00:06:15 ID:???
UAで判定したら携帯ブラウザエミュだと携帯で判定されるのか。 IPアドレスの方が確実ってことかな?
348 :
336 :2007/10/14(日) 00:16:57 ID:???
携帯ってIPアドレスの種類どんどん増えてってたのか・・・ 諦めてUAで判定します。
CPANにモジュールあるよ。
フォームって別ドメインのCGIスクリプトにも送信できたっけ?
>>349 それって DIS るのが生きがいの人のだっけ?
open関数で開けるファイルって同じサーバーにある必要がありますよね? 別サーバーにあるファイルの情報を参照する方法はあるのでしょうか? あるのでしたら方法をお教え下さいますようお願いします。
353 :
318 :2007/10/14(日) 08:50:07 ID:a8OZDemC
>>333-335 別にバカにしてるわけでもないのに、どうしてすぐそうムキになるかね。
逆に聞きたいが、自分は頭が固くないとでも思ってるのかい?
おまい自分が雇う側の立場になって考えてみな 日雇いで次の日に来るかどうか解らない奴を雇う? スキルレベルも解らずに雇う? つか、銭もらえるだけのスキルはあるのか?
355 :
318 :2007/10/14(日) 12:02:37 ID:a8OZDemC
>>354 >日雇いで次の日に来るかどうか解らない奴を雇う?
もしかして日雇い知らない?
プログラミングに関わらずどんな仕事でも適当なやつはいらないし雇わないよ。
>スキルレベルも解らずに雇う?
どんな職業でも同じ。
君は雇う側になったことがなさそうだ。
もう頭のおかしいヤツ相手にすんなよ ま、いちばん悪いのは病院に連れて行かない親なわけだが
357 :
nobodyさん :2007/10/14(日) 13:05:35 ID:9kSbwdFL
画像付きのBBSに、アクセスログ記録を付けて使っています ところが、特定の人だけ同時に3回記録されています WindowsNT5.1 ブラウザが「Sleipnir」 たぶんブラウザのせいだと思いますが、 1回のアクセスでサーバに3回の動作をさせている事になります 一体どういう事なのでしょう? perlの書き方のせいでしょうか?
実際一番ムキになってるのは君じゃん(w
>>357 とだけ言われてもなぁ、多重コネクションで画像DLなんてよくある話だし。
で、どうしたいのさ?
360 :
nobodyさん :2007/10/14(日) 18:22:36 ID:9kSbwdFL
>>359 画像付きといってもファイルをたまにアップするだけで
ほとんどの利用はテキストの書き込みと、BBSの読み込みです
会員制サイトなのでアクセスの数は少ないです
サイトの関連ログが飛ぶトラブルがあって原因の一つと思います
まず、なぜこの環境の人がアクセスすると、同時刻に3回CGIが動作して
しまうのか、その原因を知りたいです
BBSのスクリプトでは、@の配列に入れたものをforeachで展開しながら
html表示します、アクセスログはこのプロセスに入れ込んでます
当人じゃないからわからんが、Javascriptで読み込みなおしするような なんかをしてるんじゃね? 本人に聞いたらいいよ。
362 :
nobodyさん :2007/10/14(日) 19:59:35 ID:RGItsPbe
質問です。 CPANモジュールまとめサイトってないですかね? いろいろググったけどそれらしきものがなかったので。
363 :
nobodyさん :2007/10/14(日) 20:01:11 ID:RGItsPbe
>>362 追記
日本語モジュール解説 まとめサイトです
perldoc.jp
basic認証が必要な自サイトのアクセスログからある部分だけ抽出して表示させたい のですがまずcgiでアクセスするにはどうすればいいでしょうか?
366 :
nobodyさん :2007/10/14(日) 20:49:09 ID:RGItsPbe
>>364 そこで全部見れるんだ。
ありがとー
結構数すくないっすね
ありがっつ
367 :
nobodyさん :2007/10/14(日) 22:03:04 ID:5YQaKvWD
ブログのページからソースを取ってきてテキスト部分だけを取り出したいんですが
use LWP::Simple;
$buff = get("
http://www..... ");
print $buff;
これでとりあえずソースだけは取ってこれたのですが、テキスト(記事)の部分だけ取り出す方法がわかりません。
よろしくお願いします
368 :
nobodyさん :2007/10/14(日) 22:05:45 ID:RGItsPbe
>>367 正規表現でちょちょいのどんじゃないですかね?
一度調べてみることをおすすめします。
369 :
nobodyさん :2007/10/14(日) 22:15:05 ID:9kSbwdFL
>>361 なるほど
当方MacなのでParallelsのWinに「Sleipnir」入れてみましたが、
プラグインかなにかなんでしょうね
有り難うございました
ごめん、371は勘違い
Web::Scraper が重いんだけど、どうにかならないの?
不満は作者に直接言う 改善案を出す パッチ送る
男は黙って正規表現一択 scrAPIは女の様な軟弱者が使う物
youtubeに上げなおしてくれ。 ニコニコ垢なんかもってないし使いたくも無い。
カレンダーを作りたいと思っているんですが、ライブラリはありませんか?
処理の進捗状況を表示する一番よい方法は何ですか? 一定期間ごとにファイルに書き込むことしか思い付きません。
$| = 1; って何かいいことあるの?
意味をわかった上で言ってるのか? それとも意味を聞いてるのか? とりあえず「perl コマンドバッファリング」あたりでググれ。
自分が使ってるサーバーがLWPが使えないようなので、socketで別サーバーのファイル内容を拾って展開させようとしたんですが、 ローカルではちゃんと動くのにサーバーにアップすると凍ってしまいます。 リストにある複数のブログのrss取得して最新のブログ3件の記事表示、みたいなのがやりたいんですが、 サーバーがLWPの許可してないと難しいですか? なにかいいやり方あったらお教えください。
fpingの出力値の数字だけを抜き出すプログラムを作りたいのですが、うまくできません。 input.txtという名前に下のようなfpingの出力を入れ www.yahoo.co.jp:[0], 84 bytes, 18.1 ms (18.1 avg, 0% loss) www.yahoo.co.jp:[1], 84 bytes, 23.2 ms (20.7 avg, 0% loss) 18.1 23.2と出力したいです。 bytes,より前を切り取り、ms ( も切り取ろうとして $fping = "./input.txt"; open(A,"$fping")|| die "Can not open file"; @b = <A>; close (A); foreach $c(@b){ $c = grep(/(.*?)bytes, (\d{1,4}\.\d{1,2} ms) \(/,$c); } foreach $c(@b){ print "$c\n"; } というプログラムを作ったんですが、うまくいきません。 どこを直せばいいでしょうか?
>>385 $c =~ /bytes, (.*?) ms/;
$c = $1;
じゃだめなん?
387 :
385 :2007/10/16(火) 12:33:21 ID:???
>>386 レス遅れてすいません。
できました!
ありがとうございます!!
助かりました、ホントありがとうございます!!!
>>385 出遅れた…。
perl -lne "print /(?<=bytes, )(.+?)(?= ms)/" input.txt
>>384 どこの鯖使ってるか知らんが、LWP使えないようにしてるってことは
FWでoutboundが遮断されてる可能性が高く、だとすればどうしようもない
390 :
nobodyさん :2007/10/17(水) 00:29:17 ID:7VxwUF8E
SNSサイトにperlを使って接続って無理?
日本語でOK
>>390 WWW::Mixi
WWW::Myspace
393 :
nobodyさん :2007/10/17(水) 08:03:38 ID:BedUMdjt
おはようございます。 下のような流れのcgiで 複数のクライアントから接続された場合 変数$gHogeはクライアント毎に保たれますか? それとも上書きされちゃいますか? my $gHoge = ""; #クライアントからポストされた値が入る。 〜$gHogeを扱う長めの処理が続く。
>>393 実行される度にプロセスが作られるから上書きなんてされない
395 :
393 :2007/10/17(水) 09:01:24 ID:???
>>394 そうですか。期待通りの結果でよかったです。
朝早くからありがとうございました。
396 :
nobodyさん :2007/10/17(水) 23:05:49 ID:7VxwUF8E
>>392 ???
わからないので要望スレに逝ってきますorz
モジュールがわからなくてSNSに接続しようとは・・・
399 :
バターズ :2007/10/18(木) 22:40:14 ID:???
コロンが二つならんでいるのは ダブルコロンって言うんだよ
400 :
nobodyさん :2007/10/20(土) 00:37:33 ID:Ja84SJeF
Location ではtargetが指定できませんが、呼び出したときの 属性は生きるってどこかに書いてありました どういうことでしょう ssiのhtmlファイルの中に書いた、iframeのCGIまたは#exec cgiで クッキー認証できなかったら全画面を再認証画面に飛ばしたいのですが、 やはり無理でしょうか?
401 :
nobodyさん :2007/10/20(土) 05:18:19 ID:VLTga6QI
print <<EOM; <a href="hoge.html">hoge</a> EOM と、 print "<a href=\"hoge.html\">hoge</a>\n"; ではどちらの方が実行速度が速いですか?
403 :
nobodyさん :2007/10/20(土) 07:40:43 ID:VLTga6QI
>>402 さん、ありがとうございます。
大変参考になりました。
404 :
nobodyさん :2007/10/20(土) 07:47:37 ID:x+Q9ulv4
おはようございます。 以下のスクリプトについて質問です。 outフォルダ内の.txtファイル全てに対して ある作業をするというスクリプトなんですが、 ファイルオープンのところでそんなファイルはないから 開けないというエラーが出力されます。 例:hoge.txtがある場合 OPEN ./out/hoge.txt file: No such file or directory at check line 22. どこが間違ってるか教えてください。お願いします。 OSはWindowsXPです。 my @directories_to_search = ('./out/'); #対象のフォルダ find(\&wanted, @directories_to_search); sub wanted{ my $filePath = $File::Find::name; my $find = index( $filePath, ".txt" ); #.txtを対象 unless ($find >= 0) { return 1; } open FH_READ, "<$filePath" or die "OPEN $filePath file: $!"; #ある作業をする。 close FH_READ; }
>>404 22行目ってホントにopen文の所か?
406 :
404 :2007/10/20(土) 08:33:09 ID:???
>>405 え?open文のor dieのエラーメッセージが出力されているから
open文でエラーが発生していると思うんですが・・・
読んで字の如しとしか。 まさかmod_perlじゃないよな?
>>404 openに渡すのは「$filePath」じゃなくて「$_」
File::Findの解説ちゃんと読め
409 :
半角全角が混在する行が一定の文字数を超えたら折り返すようにしたい :2007/10/20(土) 14:21:49 ID:g/E6yd0f
メールフォームを作っています。同マシン上のsendmailを使って送るものです。 送信するメールの本文において、半角全角が混在する行の文字数を数え、 一定の文字数(例えば半角72文字、全角36文字)を超えた行だけを 強制的に折り返したいと考えています。 どのようにするのがよいでしょうか? lengthはバイト数を返す関数なので、 全角文字の真ん中で折り返されると困ることになると考えてます。 もしかすると、長い行はsendmail側が自動で折り返してくれたりするのでしょうか? それとも、何かほかの関数で簡単に数えたりできるのでしょうか? なお、カスタマイズの自由度を考えて自作しているので、 「どこそこのメールフォームを使え」というのは勘弁してください。 以上、よろしくお願いします。
410 :
nobodyさん :2007/10/20(土) 14:28:07 ID:o1wAy6B9
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか? $@ だと、evalでのエラーの値が入る でも、実行値は...? お願いします。
412 :
nobodyさん :2007/10/20(土) 14:55:48 ID:o1wAy6B9
>>411 その通り!ありがとう。
短い$hogeだと関数が成功した1しか返さないことがあるようでアレ違うわと思っていました。
>>409 ちょっと離れるので投げっぱなしになってしまいそうだけど
解答してくれる人が現れる間に考えていました
use utf8;
use Encode;
$str = '
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?
$@ だと、evalでのエラーの値が入る
でも、実行値は...?
お願いします。
';
@stream = split(/\n/,$str); #最初に渡された文字列を 改行 を区切りとして @stream に配列として読み込んだ
map{ s{(.......)}{$1\n}g } @stream; #”8文字”単位で改行を入れてる
map{print encode(sjis,$_)}@stream; #各行を出力するときにsjisに変換してる
とか、なかんじでどうよ?
ただし1バイト文字の扱いがなんか変。
*たぶんutf8でけつまずいてるかんじ。
>>409 jcode.plかJcode.pmにjfoldってなかったっけ?
414 :
409 :2007/10/20(土) 17:45:16 ID:???
>>413 これです。こういう機能がほしかったんです。
jcode.plにはありませんでしたが、Jcode.pmにはありました。
これまで使っていたのがjcode.plだったのでが、
MIMEヘッダの機能も強化されているようなので、Jcode.pmに乗り換えようと思います。
どうもありがとうございました。
いいかげんにEncode使い方覚えろよ
>>415 じゃ、Encode.pmを使って折り返す方法を書いてあげれば?
Encode::decodeしてlengthでカウントしてみろよ
文字コードわかってんなら正規表現で簡単にできることだろ
全部正規表現でやるのは重そうだな。
正規表現で解決するならEncode要らんがな。
Perlのテキスト処理で質問させてください。 UTF8な日本語テキストの半角カナを全角にしたいと思ってEncode::JP::H2Zを使おうと思いました。 しかし、一部の文字(〜など)がEUCに変換する段階で?に変換されてしまい、困ってしまいました。 とりあえず、コードポイントにフォールバックできることがわかったので、 以下のように書いてその場をしのぎましたが、コードポイントを検索して文字に置換するという 作業が入ってしまい(しかも無駄に複雑)、どうもしっくりきません。 もっと簡単にする方法はありますか? $text = encode("eucjp", $text, Encode::FB_PERLQQ); # EUCに変換 Encode::JP::H2Z::h2z(\$text); # 全角変換 $text = decode("eucjp", $text); $text =~ s/\\x\{([0-9A-Fa-f]+)\}/pack("U*", hex($1))/eg; # コードポイントを文字に
>>421 #!/usr/local/bin/perl -w
use strict;
use Encode qw(from_to);
use Encode::JP::H2Z;
my $text = 'このファイルはUTF-8で〜半角カナ混じりの文字列';
from_to($text, utf8 => 'cp932');
from_to($text, shiftjis => 'euc-jp');
Encode::JP::H2Z::h2z(\$text);
print $text;
__END__
別解。
use Unicode::Japanese qw(unijp);
print unijp($text)->h2zKana->euc;
423 :
421 :2007/10/23(火) 20:32:44 ID:???
>>422 ありがとうございます。その変換法で化けなくなりました。
後学のためお聞きしますが、Encodeではutf8を直接EUCにマップできないのでしょうか。
SJISを経由するのはわかるのですが、cp932をshiftjisに読み替えるなど、
トリッキーなことをやっていますね。
機種依存文字(@など)がある場合もそうですが、utf8とEUCの変換法は
どうもよくわからないです。
機種依存文字とか、どうやってEUCに変換するんでしょうか
暗号化関連の質問です メールフォームを使っててブラウザとサーバの間はSSLで暗号化してます でもサーバからsendmailで送信するメールも暗号化してないと意味ないですよね? Perlでどうやってやってます?S/MIMEかPGPが使えるの?(´・ω・`)
そもそもメールを飛ばさないという選択肢を検討すべきではないか
427 :
421 :2007/10/24(水) 02:01:47 ID:???
>>424 なるほど、ぐぐってみてわかりました。
EncodeーEUCJPMSでcp51932も使えるようになるんですね。
標準のEncodeになんで実装しないんだろ、これ。
スペースは or に変換するが、クォートにかこまれたスペースは変換しない。 これの実装がうまくいきません。 例えば tenis ball は tenis or ball に変換するけど 'tenis ball' はそのままっていうのはなんとか出来たんですが、 'tenis ball' 'base ball' のときは 'tenis ball' or 'base ball' にするのがどうしても出来ません。 orを入れたい場所もクォートに囲まれてると判断されてしまうのです。 どなたか助けてください。
>>429 my @list = (
q{tenis ball},
q{'tenis ball'},
q{'tenis ball' 'base ball'},
) ;
for my $line ( @list ){
print join ' or ',
map{ /'/ ? $_ : split /\s+/, $_ }
split /\s+(?=')/, $line ;
print qq{\n} ;
}
foreach(@list){ my @token = m/('[\w\s]*'|\w+)(?:\s+|$)/g; print join (' or ', @token), "\n"; }
432 :
429 :2007/10/26(金) 15:02:18 ID:???
>>430 すみません、できるだけワードは固定してない方がいいのですが・・・うまく動きませんでした。
>>431 おぉ、なんかうまく動きそうです。
でも、クォートの部分を除外して配列に納めたいのですが、どうしたらいいのでしょうか?
>>432 430は全角文字(スペースも含め)を半角に変換してもダメか?
それと「クォートの部分を除外」って意味が分らん。単に
クォートを削除したいだけなら、そのぐらいは自力で考えてみたら?
Encode::JP::H2Z ってなんでeucjpの糞使用なの? ユニコードのまま渡せて処理出来ればいいのに。
>434 そういうことはdankogaiに直接文句つけて来い
>434 じゃあお前さんがそういうの作れば?
>>434 Jcode::H2Z (Jcode.pm のサブモジュール) そのままだから。
utf8もページからフォームを入力して送信させると、 「〜」の文字だけがなぜか正常に送信されないのですが、なぜでしょうか?
439 :
nobodyさん :2007/10/27(土) 22:19:08 ID:jIrqvOa/
return +{}; という記述の意味を教えて下さい 空ハッシュを返すという事でしょうか?
441 :
nobodyさん :2007/10/27(土) 23:21:31 ID:jIrqvOa/
>>440 ありがとうございます、単項演算子についてはわかったのですが
とあるCPANモジュールのコードで
return +{} unless $data;
というコードがあったのですがこれを
return {} unless $data;
と書かずに単項演算子の+をつけるのは
何か意図があるのでしょうか
戻り値自体はどちらでも同じような気がするのですが、、
ブロックとして解釈される場合があるんじゃね
+{ } :無名ハッシュでコンパイル {; } :コードブロックでコンパイル
まぁプログラミングを動画で見てもわからんよなw
質問させてください。 指定した文字が何回続いたかを取得したいのですがどうしたらいいですか? 例)この場合指定した文字は1です。 $a = '1111222'; $b = '1111136'; $aは4 $bは5 よろしくお願いします。
$a='1111222';$i='1';($r)=($a=~m/($i{2,})/);print length $r 全角はシラネ
$a = '1111222'; $c= 1; $n= length(($a=~/((?:\Q$c\E)+)/)[0])/length($c);
perlは色んなやり方があって面白いね $a = '111111222'; $n = '1'; $count = length(($a =~ /($n+)/)[0]);
>>451 $test_str = '111234111111';
$char = '1';
こういう場合は後半気にせず、まず見つけた連続の 3 でいいの?それとも、より長い連続の 6?
「はい、6 が得られるようにしたいんです」だと上に回答を書いた皆さんが優しくキレるかも。
あと、例なんだろうけど $a や $b は地雷踏むことがあるから気をつけてね。
use strict; use warnings; test('1111222' => 1 ); test('1111222' => 2 ); test('111122211' => 1 ); test('111122211' => 1 , 1); test('1111136' => 1 ); sub test {printf "%s:%s:%s\n",$_[0],$_[1],_test(@_)} sub _test { local($a,$b); (sort {$b<=>$a} map {length($_)} ($_[0] =~ m{($_[1]+)}g) )[ $_[2] ? -1 : 0 ]; }
my $i = '1' ; print +( length ) . qq{\n} for split /[^$i]+/ ,$a ;
458 :
456 :2007/10/29(月) 19:24:03 ID:???
見直したらgdgdだったので修正しとく sub _test { ( sort map length,$_[0] =~ /(${_[1]}{2,})/g )[$_[2] ? 0 : -1] }
一つのファイルで処理がたくさん書いてあって分岐させる時に、 例えば $mode = $cgi->param('mode'); というデータを受け取って、処理の場合わけをする場合どういう書き方がエレガントなんでしょうか? 現状は if ($mode eq 'post') { &post} elsif ($mode eq 'edit') { &edit;} elsif ($mode eq 'delete') { &delete} else { &error} こんな感じなのですが、それは初心者の書き方だって馬鹿にされました。 悔しいのでもっと効率的な方法があったら教えてください。
>>459 エレガントかは分からないけど、分岐がある程度多い場合はこんな書き方だとすっきり書けるかと。
%actions = (post => \&post,
edit => \&edit,
delete => \&delete);
if(exists $actions{$mode}) {
$actions{$mode}->();
} else {
error();
}
数個程度なら if で分岐されちゃってもいいと思いますし、実際そうしています。
>>459 それでいいんじゃね?
各サブルーチンに戻り値があるなら「三項演算子」って手もあるし、
以下の様なやり方もあるけど、普通に書いてメンテ出来るものならば
バカにされても放置しとけば?
my %hash = (
post => sub { 1 } , # &post の内容を書く
edit => sub { 2 }, # &edit の内容
delete => sub { 3 }, # &delete の内容
) ;
print $hash{'edit'}->() || q{error} ; #q{error} には&error あたりを、、、
ソース全体を見たら綺麗な書き方があるかもしれんが、
それに関しては情報不足。
ああ、丸かぶりだorz...
せめて、CGI::Applicationくらい使っとけって話なんじゃ。 if文分岐も分かりやすいと思うが、へたに小細工するとますますへたっぴに見える。
三項演算子ってタマに見かけるけど読みづらいんだよな。 使いたくない書き方No1かも。
$expr1 ? $expr2 : $expr3 ? $expr4 : $expr5 ? $expr6 : $expr7 ; 書き方か頭が悪いんだろ
466 :
至急 :2007/10/31(水) 15:17:23 ID:???
CGIを自宅出張でサポートしてくれる方募集します。 CGIに詳しく都内に来れる方であれば可能 一日日払い即金で払います。 詳細はメール下さい。
>>459 エレガントかしらないけどこんなパッケージ作ってる。
(不要箇所削ったのでそのまま動くか不明)
package Local::Base;
use strict;
use warnings;
our $DEBUG = 0;
sub class {ref$_[0]||$_[0]||__PACKAGE__}
sub new {(bless {} => class( shift() ))->init(@_)}
sub mode :method {shift->param('mode',@_)}
sub method_name :method {shift->{method_name}->{ shift() }}
sub default_method :method {die('不正なmodeを受け取りました')}
sub init :method {
my $self = shift;
my %param = @_;
$self->{method_name} = $param{method_name} || {};
return $self->run_method( $self->mode , @_ );
}
sub run_method :method {
my $self = shift;
my $method = $self->method_name( shift );
$method = 'default_method' unless $method && $self->can( $method );
return $self->$method(@_);
}
1;
>>467 外部からinitとか呼ばれちゃわない?
>>467 method_nameチェックしてるから大丈夫
使い方も書いたつもりだったんだけど書けてなかった。
#!/usr/bin/perl
use strict;
use warnings;
use base qw(Local::Base);
my $r = eval{
__PACKAGE__->new(
method_name => {
edit => 'edit',
post => 'post'
}
)
} || $@;
print CGI->header,$r,"\n" unless ref $r;
######################################################################
# editの動作を定義
sub edit :method {
my $self = shift;
print $self->header;
print "EDITモード";
return $self;
}
1;
sub edit :method { この :method って何の意味だっけ perlsub見ても載ってないや 変数にも付けれた気がしたが
perlsub に載ってるし、perldoc attributesすれば詳細分る(perl5.8.1)。 perl attributes でググれば日本語のサイトも沢山出る。 変数に付けられるのは 5.8系
実際、CGI::Applicationとか使うと効率的になるの? 自分でゴチャゴチャ作るよりも。使ってる人いる?
CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える
> CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える CGI::Application もフレームワークじゃないの?
>>470 :methodは組み込みのattribute
Attribute::Handlers使うと自作のattributeも作れる。
…がいつ仕様が定まってなくて変更があるかもってどっかで読んだ気がする。
>>474 ・自分しかいじらない
・少人数で知識の共有が容易
・マニュアルが整っている
のどれかなら自作のフレームワークの方が慣れてるだろうし開発効率いいんじゃないかな?
フレームワーク自体のメンテナンスが(出来る|しなきゃいけない)のはデメリットか?
既製のフレームワーク使うのは
・他の人と知識の共有しやすい
・ドキュメントがある/(第3者も使ってるので)ノウハウが検索しやすい
・フレームワーク自身のメンテナンスを(あまり)しなくていい
ってとこかな?
/public_html/test/log.txt を、UTF8→SJISに変換して、 別名で保存するにはどうすればいいでしょうか Perl 5.8.8なのでuse Encode;を利用する、読み取り専用で1行ずつ変換処理する あたりまでは勉強しました。スマートな方法よろしく御教示おねがいします
ログをShift_JISに変換ではなく、表示する時にsjisに返還して表示するようにして、 データはutf-8のままのほうがよくないかな。
>>477 まずは自分で書いた糞コード晒すのが先じゃね?
>>477 おまえさんの「スマート」の基準が判らんのだが、
Encodeで何か不足でもあったのか?
nkf -s log.txt > log.sjis.txt
>>481 すげー!、シェルスクリプトですよね?
sshができない場合はこんな感じで利用すればいいのかな
system("nkf -s log.txt > log.sjis.txt");
1つ気になるのがjcode.plなど元の文字コードを指定するのがあると思うのですが、
&jcode::convert(\$_, 'sjis' ,'utf8');
nkfでは気にしなくても自動判別完璧なのでしょうか?
もはやPerlに何の関係もない
>>477 use Perl6::Slurp;
use Jcode;
$c = slurp "log.txt";
Jcode::convert(\$c, "sjis", "utf8");
open($fh, ">", "log.sjis.txt");
print $fh $c;
>>482 jcode, Jcode, nkfは、判別できる場合は判別してくれる。
gethostbynameについての質問です。 コマンドプロンプトだとnslookup -> set type=*** UNIXならhost -t *** でクエリタイプを設定できるんですけど、PERLの場合はどうやるのでしょうか。
488 :
nobodyさん :2007/11/05(月) 11:20:15 ID:6nXAnQ+n
ファイルのオープンでエラーになります。 open(FILE,">".$workFname) or die "Cannot Output File: "; あらかじめファイルを持たせておいて、書き込み権限を与えておけば 成功しますが、新規にファイルを作成できません。 どうすればいいのでしょうか。
ディレクトリのパーミッションかな
die するときに $! も含めるべき。
自分の環境では、相対パスではエラーになるので、絶対パスに書き換えてます。 できれば相対パスのままで動くようにしたいです。どうすれば解決できるか分かる 方はおられませんか。まあ、あまり解決策が複雑なら、とりあえずあきらめてこの ままにしておくつもりですが。
>>492 まず「何を」相対パスにしようとしているのかくらい書こうぜ。
あと「自分の環境」は書かなきゃ誰にも伝わらない。
494 :
nobodyさん :2007/11/07(水) 09:25:24 ID:R3XG8Srf
Perlで関数の引数に二次元配列を渡すのは無理ですか。
496 :
nobodyさん :2007/11/07(水) 11:46:06 ID:R3XG8Srf
次のソースのsub kansuのforeachの行は何と書けば正しく動きますか #!perl/bin/perl use strict; sub kansu{ my $ref1 = shift; my $value1; foreach $value1($$ref1) { print $value1 . "\n"; } } sub main{ my @databox1 = (13,1,6,3,9,8); my $ref1 = \@databox1; usort_kansu(@databox1); } main();
誤: usort_kansu(@databox1); 正: kansu(@databox1);
>>496 「言語的意味で」正しく挙動させるには
foreach $value1($ref1) {
(多分)あなたの望んだ挙動にするには
ソースの殆どに手を入れる必要がある。
∴ 本読んでからどうしても分らんかったら
質問し直せ
>>496-498 #!perl/bin/perl -w
use strict;
sub kansu {
my $ref1 = shift;
# my $value1;
foreach my $value1 (@$ref1) {
print $value1 . "\n";
}
}
sub main {
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
kansu($ref1);
}
main();
500 :
nobodyさん :2007/11/07(水) 15:22:14 ID:vLJSXT0R
コーディングじゃないのですが該当スレが見当たらず、新規スレにするような質問でもないと思いこちらに質問します。 .qmailからperlスクリプトを呼び出しているのですが、その場合エラーログを取るにはどうしたらよいのでしょうか? 不正終了しているようなのですが、原因がつかめません。
eval { require スクリプト; }; if ($@) { open(LOG, ">>/path/to/ログファイル名") or die; print LOG "WARNING: $@"; close(LOG); } こういうスクリプトをqmailから呼び出せばどーよ >499 forearch行を書き換える条件だからforearch my $value (@_){ って書いて欲しかったのかと・・
502 :
501 :2007/11/07(水) 15:59:10 ID:???
foreach $value1($ref1,@_) { こうか
503 :
500 :2007/11/07(水) 16:13:30 ID:???
STDERRに吐いた文字はqmailのログにのこるでしょ? ログが見えないならプログラムを置くべきではないと思う。
>>504 に同意だけど、
とりあえず、STDERRをファイルにでもリダイレクトすればどうなん?
506 :
500 :2007/11/07(水) 19:59:45 ID:???
>>504 qmailのログとはmaillogでしょうか?
スクリプトからは何もログを吐いていないんです。
sudoでapache権限で実行してるからログ吐かないのかな。
|/path/to/script.pl >> /path/to/error.log 2>&1
508 :
500 :2007/11/07(水) 20:13:46 ID:???
>>507 ありがとうございます。
.qmailでもログ指定しないといけないんですね。
>>500 何かとんでもない設定でqmail動かして無いか?
510 :
500 :2007/11/07(水) 22:29:30 ID:???
>>509 いえ。
.qmail内でperlのみsudoしてapache権限で動かしてます。
qmailはvpopmail権限で動かしてますよ。
>>507 さんでログ取れました。m(__)m
UTF-8でperlを書きたいのですが、文字コードをperlにどのように知らせればよいのでしょうか?
>>511 plagger のソース読むといいよ!
tokuhirom自重
Perl死んじゃうん?
(・∀・)ニヤニヤ
518 :
nobodyさん :2007/11/09(金) 19:09:09 ID:8S2oyKnm
>511 use dan; で解決するよ。
tokuhirom の直近の発言をコピペすることによりスレを荒らす tokuhacks.
plaggerのソース読めって言ってるやつのほとんどはplaggerのソースが読めない
コード解説読めってならともかくコード読ませたってしょうがないだろ。Perlなんだから
522 :
nobodyさん :2007/11/09(金) 23:35:40 ID:8S2oyKnm
tokuhiromのソース読めって言ってるやつのほとんどはtokuhiromのソースが読めない
プラガー(笑)
524 :
nobodyさん :2007/11/10(土) 10:49:28 ID:Z9OcedPC
web上の圧縮ファイル(.lzh)をダウンロードして保存、
さらにその圧縮ファイルを解凍するスクリプトを作りたいです。
例えば、LWP::Simpleを使った場合
my $dat = get('
http://hoge.com/071110.lzh ');
の後はどう処理していけばいいでしょうか?
> の後はどう処理していけばいいでしょうか? lha 書庫を解凍する処理を行えばよい。
2chみたいに携帯から固有のIDを作りたいんですが どうすればいいんでしょうか。
>>527 i-mode:UTN
EZweb:HTTP_X_UP_SUBNO
Y!:UA
529 :
nobodyさん :2007/11/11(日) 14:32:10 ID:4iiY3aOI
ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。 あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
531 :
529 :2007/11/11(日) 14:47:19 ID:???
>>530 レス有難うございます。
>ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。
なるほど。でも頭では理解できてもそれをコーディングするとなると・・・
.*の部分を弄ればいいのかなぁ。
>あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
はい、このパターンは今回ありえないっす。
532 :
529 :2007/11/11(日) 14:58:10 ID:???
条件文を下のコーディングに変更したらできました。
if( $url =~ /\/([^\/]*\.lzh)$/ ){
正規表現すげー
>>530 さんアドバイスありがとうございました。
.*?も覚えたらいいとおも
534 :
nobodyさん :2007/11/12(月) 16:33:29 ID:XNEEDQVz
そのファイルがバイナリなのかテキスト(shift-jis,euc,utf8)なのかを判断するにはどのようにしたら良いのでしょうか? 最初、linuxの fileコマンドを使用していたのですが誤認識がよくあり使えません。 バイナリなのかテキストなのかだけ分かればいいのですがperlでそれを行うにはどのようにしたら良いのでしょうか?
ファイルテスト演算子
536 :
nobodyさん :2007/11/12(月) 18:17:28 ID:XNEEDQVz
>>535 有難う御座います。
試してみましたが、EUCだったり10文字程度のcp932などの場合に誤認識するようです。
\0が含まれてればバイナリでいいんでないの それ以外だと各文字コードの仕様を調べて 全データがそれに矛盾してないか判断するしかないと思
正規表現使えばいいじゃない
539 :
nobody :2007/11/13(火) 03:52:36 ID:fKqfq45H
ttp://www.jpopfan.co.jp/uranai/uranai000.htm 上のサイトのようなゲームをperlで作りたいと思っています。
htmlのみでも十分なゲームだとは思いますが、あえてCGIゲームとして作りたいです。
(学校の授業の自由課題であるので・・・)
一応以下のようにhtmlは作ってみました。
<html>
省略
<body>
<h1>オーケストラ楽器別診断</h1>
<p>次の質問にお答えください♪</p>
<form action="/nussknac/cgi-bin/kadai.cgi" method="post">
<dl><dt>お名前</dt>
<dd><input type="text" name="name" value=""></dd><br>
<dt>Q1. あなたはプライドが高いほうですか?</dt>
<dd><ul>
<li><input type="radio" name="answer1" value="Yes" checked>Yes</li>
<li><input type="radio" name="answer1" value="No">No</li>
</ul></dd></dl>
<p><input type="submit" name="send1" value="送信"><br></p>
</form></body></html>
540 :
nobody :2007/11/13(火) 03:57:04 ID:fKqfq45H
539の続きです。 HTMLのフォームから情報をCGIに送り、最初の質問に対してYesならAの質問、NoならBの質問・・・というように 答えによって質問を分岐させるように作りたいです。 if文でひたすら分岐するというイメージはありますが、どうすれば、送信ボタンを押した時に次の質問ページにリンクさせる事ができるかが分かりません。 質問ページは一つ一つ作りたいです。 よろしくお願いします。
そういうアルゴリズムも含めて課題になってるんじゃねーのか・・・まぁいいけどさ。 で、htmlはともかくどこまでperl書いたのよ。まさか1行も書かずに相談しにきてるわけじゃあるまい?
何日か前に別のスレでも見たけど、ここで聞いてて課題間に合うの?
あみだくじでいいのか、選択によってポイントがたまってその結果で振り分けられるのか。 色々ロジックはあると思うけど、そこら辺はどうするのかな
>542 提出日まで1〜2週間とかなら大丈夫じゃない? その昔、C言語の授業があって、その授業終了直後に提出したら怒られたことがあったなあ(笑) ごめん、確かに授業聞いてませんでした。
あみだくじでいいなら、 <li><input type="radio" name="answer" value="Aの質問のURL" checked>Yes</li> <li><input type="radio" name="answer" value="Bの質問のURL">No</li> ってして、 print "Location: answerの値\n\n"; でリダイレクトさせていけばいいだけでは?
HTMLでおk
リンク元のURLに%??%??〜が含まれてる場合に、その文字をデコードしてUTF-8として表示しようとしています。 元の文字コードがUTF-8のときは問題なく表示できるのですが、 文字コードの判別を含めてやる場合どうやったらいいのでしょうか? Perlのバージョンは5ですが、プロバイダ(@nifty)のサーバーのため標準モジュールを使用できません。 いきなり変換が難しいならUTF-8か否かを判別できれば、 UTF-8の場合→直デコード UTF-8でない場合→直デコード→jcode.plで変換 でいいのかもと考えているのですが、UTF-8か否かの判別法がわかりません。 よろしくお願いします。
548 :
nobodyさん :2007/11/13(火) 15:19:48 ID:lcS1D/Cp
539です。 一応perlでは以下のように作りました。 #!/usr/local/bin/perl use CGI; $query = new CGI; $q1 = $query->param('answer1'); if ($q1 eq Yes) { open(F, ">>q2.html"); } else { open(F, ">>q3.html"); } でもこれだとエラーが出てしまいます。 どのように直せばいいでしょうか。 リンクのさせ方など教えて下さい。 課題提出は12月までです。 違うスレには書いていないので私ではないです。
use constant Yes => 'Yes';
課題は自分でやれwww
>>54 こんな感じはどうよ。適当に書いたからちゃんと動くかどうか知らんけど。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use FileHandle;
use File::Spec;
my $cgi = CGI->new;
my $fh = FileHandle->new;
my $html_dir = '/path/to/html/dir';
my $output = $cgi->header( -type => 'text/html' );
my $fn = q{};
if ( $cgi->param('answer1') eq 'Yes' ) {
$fn = 'q2.html';
}
else {
$fn = 'q3.html';
}
$fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
my $data = do { local $/; <$fh> };
$fh->close;
$output .= $data;
print $output;
さらに訂正。 誤 $fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<'); 正 $fh->open( File::Spec->catfile( $html_dir, $fn ) '<');
554 :
nobodyさん :2007/11/17(土) 14:33:33 ID:GlJQ98hk
>>554 エラーの原因は@INCが空になってるから。なんでそうなってるのかは知らん。
ActivePerlを入れ直してみたら?
あとここはコーディングスレだからスレ違いだと思わなくもない。
>>555 最新版入れてみたけど同じでした
質問スレいってきます
>>にアンカを3つだけつけたいんだけど、これだと同じとこにリンクをかけてしまいます。 どうすればいいんでしょうか。 for($i=0;$i<3;$i++) { $str=~s/>>[0-9]{0,10}[-]{0,1}[0-9]{0,10}/<a href="$_[1]p=$&">$&<\/a>/; $str=~s/p=>>/p=/; }
$i = 0; $buf =~ s/(>>\d+)/$i++ < 3 ? "LINK:$+" : $+/egs;
559 :
556 :2007/11/17(土) 22:23:56 ID:???
>>558 ありがとうございます。
そんな書き方知りませんでした。
560 :
557 :2007/11/17(土) 22:26:54 ID:???
自作モジュールをロードするときに、BEGINブロックで@INCに追加してからBEGINの外でuseするのは外道
562 :
561 :2007/11/18(日) 19:51:25 ID:???
↑ 「ですか?」が抜けた。 すまぬ
564 :
nobodyさん :2007/11/19(月) 06:13:08 ID:s0DcKkZM
これからプログラムをやりたいと思ってます。 いまからやるならperlは覚えたほうがいいですか?
PHPでいいよ
566 :
561 :2007/11/19(月) 08:54:57 ID:???
567 :
nobodyさん :2007/11/20(火) 11:38:30 ID:PLctc9ni
多重起動の禁止はできたが、解放がうまくいかない。 どこが悪いか教えてください。 #登録&多重起動禁止 use Win32::API; use Win32::Mutex; my $mutex = Win32::API->new("kernel32","CreateMutex",["N", "N", "P"], "N"); die "二重起動" if(Win32::Mutex->open('TestProgram123')); $mutex=Win32::Mutex->new(1, 'TestProgram123'); #解放 my $releacemutex = Win32::API->new("kernel32","ReleaseMutex",["N"], "N"); $releacemutex->call($mutex);
568 :
576 :2007/11/20(火) 14:43:38 ID:PLctc9ni
自己解決 Win32-API使わなくてもできるのねぇ
むしろ何の為のラッパーだよ
570 :
nobodyさん :2007/11/23(金) 21:52:32 ID:BH2PwYj+
質問失礼します。 AとBの文字があるとき、文字列の中のBAを全てABにしたいときはどのような置換をすればいいのでしょうか? 例えば、 $s = "AABABABBBA"; と文字列があったら、 $s = "AAAAABBBBB"; にしたいのです。 $s =~ s/BA/AB/g;とすると、置換後を判定してくれないので、困ってます……
>>570 たとえば。
$ perl -e '$s = "AABABABBBA";while($s=~s/BA/AB/g){}print $s;'
>>570 その場合、これ以上置換できなくなるまで「$s =~ s/BA/AB/g;」の処理を行わなければならない。すなわち、ループである。
s/BA/AB/g;は、置換を行った回数を返す。つまり、0を返すまで処理を継続したいのだから、while文が使える。
したがって、次のようになる。
while($s =~ s/BA/AB/g;){}
whileのあとの{}の中に何も入っていないが、これでお望みどおり動くようである。
sortって云う手もあるよなぁ♪ print join "", sort split "", "AABBABABBBABAABBAABABABABA";
574 :
570 :2007/11/23(金) 22:36:47 ID:???
>>574 遅レス。
他の文字が存在しないと云う条件下なら、素直に文字数カウントするって手もある
perl -le 'my $s = "atataaattttatatat" ; print "a" x ( $s =~ s/a/a/g ) . "t" x ( $s =~ s/t/t/g ) ;'
ま、他の文字が存在してても外側ループ一個つけるだけだけどね。
蛇足だと思ったんだが、、、、
ちょっと分からないので質問させてもらいます。 手作りで掲示板みたいなのを作ってるんですけど Location:で二重投稿を禁止したくて書いたんですが投稿したあとにLocation:って文字が表示されて飛ばないんですけど なんでしょうか? 普通なら飛ぶのに飛びません・・・。 誰か分かる方が居れば教えてください。
>>576 content-typeの前に書いてみ
>>577 出来ました。
ですが書き込みがされなくなりました・・・。
そもそもがどんな仕組み何だかわかんねーと答えようがねーよw こっちはエスパーじゃないんだからさw
一番最初に print "Content-type: text/html\n\n"; # データ形式 を書いてるのが不味いような気がするのは気のせいかな。
>>581 他のところに置いたりすると上手く動作しないんです・・・。
あと、$locationって変数、どこで使ってるんだろ。
勉強し直しておいで。
あ、それは書き忘れましたがKENTWEBさんのところのをちょっと借りたやつです。 # リロード if ($location) { if ($ENV{'PERLXS'} eq "PerlIS") { print "HTTP/1.0 302 Temporary Redirection\r\n"; print "Content-type: text/html\n"; } print "Location: $location?\n\n"; exit; } これがサブルーチンのwriteの最後に置いてました。
とりあえずヒントは、 ・Location: はHTTPヘッダに出力する ・ヘッダとボディの区切りは空行で示す
前も書いたけど、kentwebのってデリミタに<>使うの好きだねえ。データがでかくなってくると、 2バイトも勿体無いと思う。
>586 難しそうですが頑張ってみます。
2バイトさえ気になるような人はデミリタに何使うんだろ。
デリミタねw
タブ?
俺はタブ。excelにも貼るだけで、データやりとりできるし。
俺は適当に,にしてた
>>593 CGIでHTMLを吐く前提なら、 , を入力されると面倒なことになるんだよな。
< > なら < > ってできてしまうからいいんだけど。
↑失礼 < > なら < > ってできてしまうからいいんだけど。
, は,でいいんじゃね?俺もタブ使うけど
ちょいと質問を。 今ソフトバンククリエイティブのCGI/perl ハンドブック第3版 のCGIサンプルで掲示板を作ったのですが掲示板にメッセージが書き込まれなかったらエラーを出そうと 思って四苦八苦しているんですがperl6はよく分からなく苦戦しています。 誰かこの本を持っていて、分かる方がいればご教授お願いします。
>>597 その本持ってないから知らないけど、本当にperl6ですか?
#このスレはご教授ってOKなんだっけ?
>>598 その使い方も間違ってない以上、突っ込む方が野暮or空気が読めないでおk
質問します 他のサーバー上のテキストファイルを読み込ませたいのですがopen関数ではできないんでしょうか?
できない
童貞で40歳まで行ったら妖精になれるよりすごい発想
ただ、PHPでは同じような方法でできるこの不思議。
だれか599についての回答を・・・
>>599 =606
リダイレクトされるためには適切なHTTPヘッダが返っているはずだからそれ調べる。
>>599 >>606 うちの環境では、3回リダイレクトを経て、?&引数がもっさりついたurlに飛ばしても、
print $response->base();
で、引数(’?’以降%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8Aとか)がついた
URLを表示できたけど・・・。
ActivePerl 5.8.8-build822(XPsp2)
LWP/5.808
ブログの自動投稿プログラムを作りたいと思ってるんですが、大まかな仕組みも分からず困っています。 どなたかご教授願えませんか? ちなみに、用途はバーチャルな人間の日記を作りたいと思っています。 日記を出力するアルゴリズムは別に用意しますので、 それをブログの投稿画面に自動でログインして書き込むようにしたいのです。 ローカルからでも構わないのですが、 できれば安いレンタルサーバーから行えれば良いなと思ってます。 検索で『自動投稿』としたらたくさん見つかったのですが、どれもアフィリエイター用のもので、 結構値段も高いですし、記事を予め用意しないとダメなので私がしたいようには出来そうにありません。
610 :
609 :2007/11/28(水) 05:16:24 ID:onMmaiK+
よろしくお願い申し上げます。m(__)m
ひょっとしたら、atom っていうのを勉強したら道が開けるんですか?
日記を出力するアルゴリズム ←これがきになる
日記を出力するアルゴリズム ←ってのはもしかして勝手に日記を書いてくれるプログラムだろうか
日記を出力するアルゴリズムを書ける人ならそれぐらい自分でできそうだけど。 荒らしスクリプトにするつもりじゃないなら、その日記を出力するアルゴリズムの 元ネタの場所を公開すれば信用が得られるかも。
そういうのは荒らしやスパムに使われる可能性が高いから、自分でやりな。
617 :
609 :2007/11/29(木) 18:18:55 ID:fn44RAXr
>>612-615 日記のアルゴリズムが完成したわけではありません
ただそっちは、大したものじゃないにしても何とかなりそうなんです。
一方、自動投稿の方は何から手を付けていいのかすら分からない状態でしたので質問させてもらいました
>>616 やっぱりそうですか
わかりました。何とか頑張ってみます
因みにスパム行為をするつもりは毛頭ありませんが、確かに見ようによってはそう映る可能性も否定できないですね。
あくまでも普通の人間っぽい挙動にしたいと思っているので、投稿の数も一日で多くて3通程度、少ないときは三日ぐらい更新しないような動きを考えてました。
とにかく自分で何とかしないとダメみたいですね
ご迷惑おかけ致しました
>>617 う〜む、どう考えてもやっぱりその
日記を出力するアルゴリズム
ってのが、自動投稿するスクリプトより遥かに高レベルのような気がするが・・・・。
まあいいや、ヒントだけ。
WWW::Mechanize オススメ。
内容や使い方は、自分で調べてちょ。
620 :
609 :2007/11/30(金) 00:45:15 ID:???
>>618 ,619
ありがとうございました。
参考にさせていただきます。
今いろいろ資料を調べたり、さっき図書館で借りてきた
Webクライアントプログラミングって言う本(めちゃふるいですがw)
を読んだりしてます。
HTTP通信などは一度もやったことがないので、
LWPあたりから勉強したほうがよさそうな、
そんな気がしてる今日この頃。
AtomとかXML-RPCとかの資料にまではたどり着けたのですが、
そこに平然と書かれている GETだのPOSTだのという表現についていけない状況です。
あれを全部 perl のコードに解釈するための知識がないのです。
というわけで、だいぶ時間掛かりそうですが、
こつこつやっていこうかなと。
もう少し進歩して、またわからないことがあったら、
ここか
>>614 さんが教えてくれたスレにでも出没いたします。
では、ごきげんよう皆様。
621 :
609 :2007/11/30(金) 03:34:24 ID:???
(´・ω・`) ノシ やっとこさ、livedoor から餌を頂戴できました なんだか、嬉しくて涙が出てきた 。・+゜(つД`)゜+・。 みんなありがと
622 :
609 :2007/11/30(金) 03:51:57 ID:???
>>619 Mechanize というのを完全に誤解してたようです
XML-RPCとかAtomPubなどとはまったく違うんですね。
なんというか、禁断の・・・いや、貴重な情報ありがとうございました。
フォームメールに入力された内容を半角→全角に変換するプログラムがわかりません。 $str = '$mystr'; $kigou ='@!"#$%&\'()=-^\\|{}:;+*?_/<>'; require 'jcode.pl'; if ($FORM{'namae'} ne ''){ $mystr = $FORM{'namae'}; &hankaku; } sub hankaku{ &Jcode'convert(*str,'euc'); if($str =~ /^[0-9]{7,11}$/){ &jcode'tr(*str,'0-9A-Za-z','0-9A-Za-z'); }elsif ($str =~ /\x8E/) { &jcode'h2z_euc(*str); }else ($str =~ /$kigou/){ &jcode'tr(*str,'@!”#$%&’()=−^¥|{}:;+*?_/<>','@!"#$%&\'()=-^\\|{}:;+*?_/<>'); } &Jcode'convert(*str,'sjis'); $str = $value; exit 0; } 1度eucに変換してからと考えたんですが。
625 :
nobodyさん :2007/11/30(金) 13:27:37 ID:7wito75u
2007/11/30-2007/12/01,00-24,[動作させる値] のようなdatファイルを下記でブランチさせると、指定範囲外だと判定されてしまうようなのです。 改善するにはどこを直せば良いでしょうか・・・最後の日付部分の比較だけで判定されてる・・? localtime(time)取得やDAT読み込みは大丈夫っぽいです。 foreach $sdat(@set){ next, if $sdat eq "\n"; @sdat = split(/,/,$sdat); @ddat = split(/\-/,$sdat[0]); @d1dat = split(/\//,$ddat[0]); @d2dat = split(/\//,$ddat[1]); @tdat = split(/\-/,$sdat[1]); if( ($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[0] eq '*' || $d2dat[0] >= $year)) &&($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[1] eq '*' || $d2dat[1] >= $mon)) &&($ddat[1] eq '' || ($ddat[1] ne '' && $d2dat[2] eq '*' || $d2dat[2] >= $mday)) &&($d1dat[0] eq '*' || ($ddat[1] ne '' && $d1dat[0] <= $year) || ($ddat[1] eq '' && $d1dat[0] == $year)) &&($d1dat[1] eq '*' || ($ddat[1] ne '' && $d1dat[1] <= $mon) || ($ddat[1] eq '' && $d1dat[1] == $mon)) &&($d1dat[2] eq '*' || ($ddat[1] ne '' && $d1dat[2] <= $mday) || ($ddat[1] eq '' && $d1dat[2] == $mday)) &&($sdat[1] eq '*' || ($tdat[0] <= $hour && $hour <= $tdat[1])) ){ chomp $sdat; $url = $sdat[2]; last; } }
ひどすぎわろた
627 :
nobodyさん :2007/11/30(金) 15:56:59 ID:7wito75u
失礼。自己解決しました。
628 :
nobodyさん :2007/12/10(月) 07:32:09 ID:aPvXjzqK
Perl5.x+CGIです。 現在、複数のプロセスから、同じデータにアクセス(読み書き)したいと考えています。 異なるプロセス間で共有される静的な変数、というようなイメージです。 外部ファイルやデータベースなどを経由する方法以外で、 このような処理を実現するにはどのようにすればよいか、ご存知の方がいましたらお願いします。 やはりmod_perlが適当でしょうか。
静的な変数? ていうかそれプロセスが落ちたらデータは消えていいってこと? 素直にファイルなりDBなり使えばいいとおもうんだけど、それができない理由は?
質問の意味がわからないけど mmapやmemcacheみたいなの?
読み書きするのに静的ってナンダロ スレッド使うMPM+mod_perlで:shared使うとか shared memory使うとかそういう話かな? 質問の仕方が初心者臭いし素直にDB使っとけって気がする。
632 :
628 :2007/12/10(月) 20:47:52 ID:???
>629-631 ありがとうございます。遅くなってすみません。 ご想像通り初心者です。初めて触ったのは何年も前ですが、仕事とか全然関係ないので。 Perl ←―→ 外部ファイル、DB ↑ ここのコストが凄く重いので、可能な限りアクセスを減らしたいと考えています。 Perl側で保持しておけば多少は減るかなあと。 要は、「キャッシュ」のようなものだと思っていただければ。 >629 >プロセスが落ちたら はい、構いません。もう一度、データ本体から取得するだけなので。 >631 >読み書きするのに静的 「静的変数」と「定数」は全くの別物という認識だったのですが、 もしかするとPerlの世界だと違うのかもしれません。少し調べてきます。 >630-631 >mmap、memcache、shared 軽く調べてみただけですが、そういうことです。勘違いしてるかもしれませんが。 この辺のキーワードを参考に、深く見てみようと思います。
633 :
nobodyさん :2007/12/12(水) 13:49:47 ID:uWSb2hJm
すみません質問です。 複数画像ファイルが入っている特定フォルダから更新日が一番最新のファイルを 探して表示させたいのですが出来ますでしょうか? 尚、ファイル形式は不定です。 教えてください。 宜しくお願いします。
(stat 'filename')[9]
質問です。 aaa.htmというファイルを読み込んで、その中に書かれている変数を変数展開したいと思ったのですがそう簡単にはいきませんでした。 print qq|$_|; とすれば変数展開されるかなと思いましたがそれもだめ。 置換を使えば簡単なのですが、置換以外の方法がありましたら教えてください。 --------aaa.htmの内容-------- <html> <body> $a </body> </html> --------ソース-------- $a = 'aaa'; open(IN, "< aaa.htm"); @html = <IN>; close(IN); print "Content-type: text/html; charset=Shift_JIS\n\n"; foreach (@html) { print $_; }
HTML::Templateでも使っとけ
637 :
635 :2007/12/12(水) 16:52:55 ID:???
evalをつかったらなんとかなりそうです。 >636さんレスありがとう
638 :
nobodyさん :2007/12/12(水) 17:26:25 ID:BkwLyerT
Encode.pm 5.85でEUC→UTF-8変換時に、 「」などの漢字が化けてしまうのですが、 これを化けないように工夫するにはどうすればいいのでしょうか?
>>638 Encode::EUCJPMSを入れて、cp51932を使う。
自己レスな上に遅レスです。 色々と検討してみた結果、速度や安全性に疑問も多いですが、とりあえずshm○○を使ってみようかなと思います。 ありがとうございました。
642 :
nobodyさん :2007/12/14(金) 03:20:01 ID:jWEjvsMQ
質問です。
Usteramで録画したflvをダウンロードしたくて、
http://unknownplace.org/memo/2007/10/03を参考に以下のソースを実行しました 。
#!/usr/bin/env perl
use strict;
use warnings;
use AMF::Perl;
use LWP::UserAgent;
my $cid = shift || '5Fq8cQp9eHsEEknbQ22OOZniqS2xUiuz';
my $amf = AMF::Perl::Util::Object->new;
$amf->addBody('client.watch_video', '/1', { cid => $cid });
my $outputstream = AMF::Perl::IO::OutputStream->new;
my $serializer = AMF::Perl::IO::Serializer->new($outputstream, 'utf-8');
$serializer->serialize($amf);
my $amfdata = $outputstream->flush;
$amfdata =~ s/\xff\xff\xff\xff/\0\0\0\x31\x0a\0\0\0\x01/;
my $ua = LWP::UserAgent->new;
my $req =
HTTP::Request- >new( POST => '
http://gw.ustream.tv/gateway.php ' );
$req->content( $output );
$req->content_type('application/x-amf');
$req->content_length( length $amfdata );
my $res = $ua->request($req);
my $deserializer = AMF::Perl::IO::Deserializer->new(AMF::Perl::IO::InputStream->new($res->content), 'utf-8');
use YAML;
print Dump $deserializer->getObject->getBodyAt(0)->{value};
643 :
642 :2007/12/14(金) 03:21:23 ID:jWEjvsMQ
実行結果は以下の通りです。 Content-Length set when there is no content, fixed at /Library/Perl/5.8.6/LWP/Protocol/http.pm line 196. Can't use an undefined value as a HASH reference at test.pl line 37. どうすればいいでしょうか。 よろしくお願いします。
37行目って何処よ
$text = <STDIN>; として、処理中に何らかのテキストを入力させたいです。 英数字は問題ないのですが、日本語を入力したときが変です。 aあ と入力して、バックスペースを押すとちゃんと消去されません。2回おせば「あ」の表示は消えるのですが、 受け取った文字のaも消えてしまっています。 解決策を教えてください
ついでにききたいのですが、 @text = <STDIN>; ってやったときに、入力を終わりにするにはどうすればいいのですか?
>646 そこから調べてるかどうかはともかく、公式サイトを見るのは確かだな。 まあ、IPアドレスが追加されること自体はあんまり無いし……。
>>649 ホストに変換するのは失敗することあるらしいぞ。
直接IPから判断した方が確実。
気にするほどじゃないとは思うけど、どうなんだろ
perlで2ちゃんねるの専用ブラウザみたいなのって作れるんでしょうか。
ネットワークをサポートしていて、文章の出力が出来るなら大抵の言語で可能だと思うよ。
653 :
642 :2007/12/17(月) 11:34:49 ID:FgX+pG+l
>>644 37行目は一番最後のprintの部分です。
たとえば、sample.plに、 require('lib/lib.pl'); &dosomething(); と書いておいて、lib/lib.plに、 sub dosomething{ open(FH, '>> baka.log'); print FH time."\n"; close(FH); } とすると、lib/の中にファイルができるのではなく、ひとつ上にできてしまいます。 これをlib/の中に保存したいのですが、ライブラリからの相対パスで保存する方法はないでしょうか。 または絶対パスを使うしかないのでしょうか。 ヒントだけでもお願いします。
656 :
654 :2007/12/18(火) 16:52:48 ID:???
>>655 ありがとう!
こーゆー用途に使うのな。
ハッシュ配列の各要素をリファレンスとして関数の引数に渡したいのですが よくわからなくて試行錯誤の末下のような方法にたどり着きました $AA{'name'} = '1234'; $BB[0]{'name'} = 'abc'; $BB[1]{'name'} = 'ああああ'; $BB[2]{'name'} = '!?'; kansuu( \%AA ); $tmp = \@BB; kansuu( ${\$tmp->[0]} ); kansuu( ${\$tmp->[1]} ); kansuu( ${\$tmp->[2]} ); sub kansuu { my $h = $_[0]; print "$h->{'name'}<br>"; } BBの要素を kansuu() に入れるために もっとスマートな方法(っていうか正しい書式)がありましたら教えていただけないでしょうか?
my %AA = ( name => 1234 ); my @BB = ( {name => 'abc'}, #$BB[0]に無名ハッシュ(リファレンス)をいれる {name => 'ああああ'}, #$BB[1]に〃 {name => '!?'} #$BB[2]に〃 ); kansuu( \%AA ); #\をつけることで%AAのリファレンスがわたる kansuu( $bb[0] ); #$bb[0]の無名ハッシュリファレンスを渡す kansuu( $bb[1] ); kansuu( $bb[2] ); sub kansuu { printf('%s<br>',shift->{name});#ハッシュリファレンスは->をつけて要素を取り出す }
$,@,%,\と(),{},[]と->の組み合わせで大抵何とかなる。 正直スカラーのリファレンスの説明は自身がないけどおよそあってると思う my $scalar = 'abc'; #スカラー my $scalar_ref = \$scalar; #スカラーのリファレンス my $anon_scalar_ref = \do {my $anon;}; #微妙に無名じゃないけど my @array = (1,2,3); #配列 my $array_ref = \@array; #配列のリファレンス my $anon_array_ref = [1,2,3]; #無名配列のリファレンス my %hash = (a=>1,b=>2,c=>3); #ハッシュ my $hash_ref = \%hash; #ハッシュのリファレンス my $anon_hash_ref = {a=>1,b=>2,c=>3}; #無名ハッシュのリファレンス my $slacar_object = bless $scalar_ref => __PACKAGE__; # スカラー使ったオブジェクト my $array_object = bless $array_ref => __PACKAGE__; # 配列使ったオブジェクト my $hash_object = bless $hash_ref => __PACKAGE__; # ハッシュ使ったオブジェクト #素直に取り出せる printf "scalar=%s\n",$scalar; printf "array=%s\n",$array[0]; printf "scalar=%s\n",$hash{a}; #アドレスっぽいのがとれる printf "scalar_ref=%s\n",$scalar_ref; printf "array_ref=%s\n",$array_ref; printf "scalar_ref=%s\n",$hash_ref; #リファレンス先の値書き換えたり取り出したり $$scalar_ref = '書き換えちゃった';printf "scalar=%s\n",$$scalar_ref; $array_ref->[1] = '書き換えちゃった';printf "array=%s\n",$array_ref->[1]; $hash_ref->{b} = '書き換えちゃった';printf "scalar=%s\n",$hash_ref->{b}; #デリファレンスする(copyが作られる) my $scalar2 = ${$scalar_ref}; my @array2 = @{$array_ref}; my %hash2 = %{$hash_ref};
CGI.pmでmetaを出力したいのですがうまくいきません。
↓これを出力したいのですが・・・
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
ttp://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/cgipm.html このページの解説によると、
use CGI;
my $q = CGI->new;
print $q->start_html(
-head=>meta({'http-equiv' => 'Content-Type'
-content=>"text/html; charset=$CharSet"}
),
このようなコードになるはずなのですが、やってみると
Undefined subroutine &main::meta called
というエラーがでます。meta()がメインのサブルーチンだと解釈されてるみたいです。
print $q->start_html( -head=>$q->meta({'http-equiv' => 'Content-Type' -content=>"text/html; charset=$CharSet"} ), とやると一応うまくいくのですが、なぜか <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> このようにもう一つ余計なメタが出てしまいます。どうすればいいのでしょうか? CGI.pmは3..31です。
663 :
660 :2007/12/19(水) 23:37:11 ID:???
664 :
657 :2007/12/20(木) 08:31:41 ID:???
>>658-659 ありがとうございます!
超わかりやすくて助かりました
今のプログラムの色んなところがもっと簡潔に書けそうです
> 超わかりやすくて助かりました > 今のプログラムの色んなところがもっと簡潔に書けそうです 本当はわかってないくせに。
最低限は書かれてて分かりやすいとは思ったぞ
読む気もしねぇよ
でもああやって思いつく限りの書き方試して要素やハッシュ値見てればなんとなくでもわかってくるはず。 めんどいけど。
あんな変な列挙を眺めるんじゃなくて、続初めてのPerl読むべきだろ。
perl5.10 に移行した人います?
ノ 依存コードは書いてないけど
ノシ cygwinで5.10入れてみた use 5.10;で書いてみてる
変数の中身を展開せずに確認したい場合ってどうすればいいんでしょうか? $test = "今日は\n いい天気です $wether"; こんな変数があるとして、$test自体は展開してほしいんですが、 中身の\nや$wetherは展開せずに出力したいのです。
' ちなみに、weather?
>>674 $testに代入した時点で展開しちゃってるでそ
そもそも確認したい意図は何?
リファレンスにしてアドレスを確認する手もあるけど
677 :
674 :2008/01/06(日) 14:08:20 ID:???
うーん、無理みたいですね。諦めます。一応問題は解決しましたので
>>675 そうです;
>>676 なるほど・・・
意図は正規表現でゴチャゴチャいじったあとの文字列が
どうしてもめちゃくちゃくになってしまうので、変数の位置関係を調べたかったのです。
679 :
nobodyさん :2008/01/06(日) 23:12:25 ID:wcb81UNa
$kekka = int(200 * 0.29); print "$kekka"; このような計算をしたら、結果が57になりました。 intって小数点が発生した時に切り落とすはずですよね? えと、なぜこんなことになるのか意味が分からないのですが、 誰かご教授お願いします
それ、今じゃ間違いじゃないってのが一般的。 語源の知識としてはありだけど、誤用が定着するなんていくらでもあることだから。 いつもいつも空気読めない人が指摘するよな。
>>679 $kekka = int(((my $n=200 * 0.29)=~/(.*)/)[0]);
print "$kekka";
こう書けばOK
回答にはなってないけれど、こちらの環境でもいくつか試してみた ので、その結果を書いておく。 何でこんな風な結果になるのだろうか。私も分からなかった。 $kekka = 200 * 0.29; print "$kekka"; 出力:58 $kekka = 200 * 0.29; $kekka = int($kekka); print "$kekka"; 出力:57 $kekka = int(200 * 0.29); print "$kekka"; 出力:57 $kekka = int(2 * 29); print "$kekka"; 出力:58
浮動少数の扱いの問題。 use bignum; これで解決。
686 :
nobodyさん :2008/01/07(月) 21:15:48 ID:XSyaqzwg
>>685 おぉ いきました!
詳しい原因はよくわからないですが、ありがとうございました。
ためしにPerlじゃなくてLispで (* 200 0.29) ってしてみたら57.99999999999999だってさ。機械の計算って難しいことがあるな
誤差については、がっこで習うものだと思ってたけど、そうでもない?
俺は習ったけど、もしかしたら教えてないところも少なくないかもしれん
情報工学を扱う授業でもなきゃ教わらないんじゃね? 少なくとも俺は浮動小数点の丸め誤差については習ったことない。 あと高校の世界史も。
692 :
nobodyさん :2008/01/08(火) 00:31:05 ID:k+nta2fc
丸め誤差の知識はありますけど、 コンピュータの中で200*0.29ってどうやって計算してるか分からない そもそも結果が57.9999・・・・になると言われても、どういう計算をしているのか さっぱりw
しかも (* 20 0.29) これは5.8って表示されるから困るw
自前のショッピングカートの消費税を int($sum * 0.05) みたいに計算してるんだけど、大丈夫だろうか…
俺は一番最初の質問者ではないが、浮動小数点の丸め誤差については、 wikipediaにも載ってたね。 問題の解決には、 use bignum; つかえばいいわけで、それでいい のは分かるけれど、それとは別の話で、小数を100倍して整数で演算をして、 あとで100で割ったりする方法だったらちゃんとでるから use bignum; しなくてもいいんだよね?
>>696 0.29が有効数字2桁だとあらかじめ分かっているなら100倍すればいいけどなあ。
既知でないときにはuse bignum;じゃないか?
>>697 レスサンクス。
いや、意味の無い部分の考えかなと思ったんだけど、
そっちの方がメモリが少なくて済み、処理が早くなったりするのかなとか
思ったのよね。ま、すごく小さな世界をいっているんだろうけれど。
うーん、俺も難しいことはわからんけど、 俺は細かい実行時間を気にしてミスをするより、コードの可読性を優先したいな。と思った。 大量のデータを扱う人から見ればふざけた態度かもしれないけどね。
LL的には人間にとっての最適化(コードの可読性)のほうが重要だからそれでいいと思うな
701 :
nobodyさん :2008/01/09(水) 03:08:01 ID:480klIK2
リーダビリティ重要。(高橋メソッド風に)
IPを10進数に変換したものと、 サブネットマスク形式のリストをマッチングさせたいんですが、 どんなループさせればいいですかね? #判定ルーチン内 foreach (@list) { my ($min,$max) = subnetMinMax($_); return ($ip >= $min and $ip <= $max) ? 1 : 0; } としてるんですが、grep等を使ったほうが良いんでしょうか? ループ内でサブルーチン呼ぶのがちょっと気になります。
訂正orz x: return ($ip >= $min and $ip <= $max) ? 1 : 0; o: return 1 if($ip >= $min and $ip <= $max);
@listの中にマッチするものが複数存在する可能性があって 何にマッチしたか全て取りたいならgrepだけど 有るか無いかだけでいいならループ回して見つけ次第結果返していいんじゃない?
return $ip >= $min and $ip <= $max;
>>704 なるほど。このままにしますありがとうございました。
>>705 そっか、そうですよね。
聞いてみて良かったです。
「うんこ」を含む行の最後に「出る」と追加することってできますか? 「うんこ」の前後は英数字・日本語交じりで文字数は不定です。 $_ =~ s/(うんこ)/$1でる/; だと、うんこ〜出るの間の文字が文末にきてしまいます。 文末指定は$みたいなので $_ =~ s/(うんこ)/$1でる$/; としてperlを実行させると、エラーなのか、プログラムが終わりません。
if ( $うんこ =~ /うんこ/ ) { $うんこ .= ’でる’ }
「うんこを含む行」「改行」 ⇒ 「うんこを含む行」「でる」「改行」 if (index($_, 'うんこ') >= 0){ $_=~ s/$/でる/; }
710 :
707 :2008/01/12(土) 13:54:47 ID:???
>>708 全角を半角にしてやってみたりしましたが、エラーでした。
>>709 できました。ありがとうございます。
ただ、>=0の意味が分かりません。
改行は\nじゃないんですか?
なにこのうんこスレ
713 :
707 :2008/01/12(土) 22:50:20 ID:???
>>712 すみません、わかりました。ありがとうございました。
714 :
nobodyさん :2008/01/13(日) 13:16:41 ID:rzzkvCmj
怠惰が美徳だの エロエロ言語だの 言うけどさ 俺が習ってきた主な4つの言語のなかじゃ 間違いなく一番習得が苦しかった ぞ つまり、学習コストは高い Perlより習得が難しい言語ってあるの? 私見では達人レベルを目指すならC++が全言語のなかで一番習得困難 そこそこのプロレベルを目指すならPerlが一番困難(C++はそこそこのプロならまだ簡単)
715 :
nobodyさん :2008/01/13(日) 13:17:19 ID:rzzkvCmj
スレ間違えた( ゚д゚ )
配布用のスクリプトを書く予定なんですが、 変数名のつけ方で悩んでいます。 たとえば、 my $title; my $script_content_title; my $ScriptContentTitle; sub param{} sub parse_URL_encoded_string{} sub ParseURLEncodedString{} 等、色々書き方ありますが 短い方が良いのか、わかりやすい名前が良いのか、 又、大文字、小文字を混ぜて使うべきか、覚えやすい名前にするべきか、 意見ください。 賛否両論あると思いますが、極力万人受けするものを選びたいです。 長文すみません
配布スクリプトの中身の変数名なんて誰も見ねぇよ
perldoc perlstyle
変数や関数の名前の付け方は、どんなプログラムを書こうとしている かというところもあるからな。 例えば、関数名で html_ をつけるとそうでないものとの区別がついて 分かりやすくなるけれど、全部の関数に html_ がついてたら 逆に無意味に長いだけとなる。 ここでアドバイスが欲しかったら、その書こうとしているプログラムや ソースをもう少し具体的にだすとかしないと話は進まないと思う。
721 :
716 :2008/01/13(日) 23:22:17 ID:???
>>719 ありがとうございます。全部読みました。
基本的にはアンダースコアを使うべきだそうです。
スコープによって使い分けるのが良いみたいですね。
$Global_Data #グローバル
$tmp #局所
$LOCK_KIND #定数
>>720 プログラムの種類によって書き方が変わる、変えられるのがperlの利点かもしれませんね。
>全部の関数にhtml_
そういうのはパッケージにまとめればOKですかね。
おかげ様で書き方が頭に浮かんできました。ありがとうございました。
Perlプログラマは"不精"なので面倒なタイピングはしません。 でもPerlプログラマは"傲慢"なので他人のコーディングスタイルを気にしません。 こんなイメージ。
怠惰と傲慢と短気だっけなラリーの三原則。 ネーミング重要。(高橋メソッド風に) でも職人芸的なところあるよねネーミングセンスって。 なかなかそこは難しい。
果たして自閉症の描くイメージとは
>>716 もう解決したみたいだけど、Perlベストプラクティスもおすすめ
ダミアン先生の盲信はいけないけど、かなりためになるYo
ダミアン先生はPerl界屈指のハッカーだが、著作物での記述にクセが全くないわけではないからね。 一般論としては、上を目指すならいろんなハッカーのコードや文章にたくさん触れることが必要。 これがなかなか大変だし難しい。 そのためにはネット上のコミュニティーやリアルのイベントにこまめに参加したり ブログを定期的にチェックし続けないといけないから。 そういうことをしてない自称Perl使いが結構俺の周りにはいて、 そういう奴らは我流のあまりエレガントじゃないスタイルから抜け出せないでいる。
727 :
nobodyさん :2008/01/14(月) 18:57:12 ID:4AKnbZN2
ファイルに入っている文字を出力するつもりなのですが、 メタ字が混ざっていることもあり、ちゃんと出力できません。 あらかじめファイルの中のメタ字に\を振って置くとしても、かなりの手間になりそうですし、 何か効率の良いメタ字対策はないでしょうか?
728 :
727 :2008/01/14(月) 19:02:23 ID:4AKnbZN2
すみません。微妙に文書が狂っていました。 ファイルに入っている文字からの出力の際の 文字化けする文字の対策をお願いします。
729 :
716 :2008/01/14(月) 20:00:43 ID:???
>>725-726 オライリーファンの俺には最高の本かもです。
>>727-728 余計な事してるからじゃないですかね?
quotemetaなんてのはどうですか?
文字コードなんかも書くと返事もらえるかも。
>>727 情報不足です。
「ファイルに入っている文字」…どんな文字? 文字コードは何?
「出力するつもり」…どこに出力するの?
「メタ字」…具体的にどの文字ですか?
「ちゃんと出力できません」…具体的にどのように出力できないのですか?
ありがちなのは、ファイルの中と、コンソールの文字コードの設定が異なっていて、文字化けしたように見えるとか。
メタ文字をいったん解釈してしまっているとか。
ヌル文字とかタブとか垂直タブとかグループセパレータとかasciiの制御コードはそもそも「文字」ではないですし。
「文字」をどう「出力」したいのかにもよります。
コードを示してはどうですか。
731 :
727 :2008/01/14(月) 20:18:57 ID:4AKnbZN2
$i = 0; while($list = <IN>){ (undef,$name[$i],undef) = split(/:/, $list); $i++; } @name = sort(@name); while($line = <@name>){ print "<option value='$line'>$line</option>"; } えーっと、コードはこのような感じです。 ファイルのDBにアクセスして、その中の一部を取り出しソートしてhtmlで出力するという形です。
メタ文字がhtmlの解釈の問題を引き起こしてるんじゃないよね?
metaタグで宣言している文字コードと異なるとか… html中で使われてる文字コードと出力してる変数の文字コードの不一致とか…
734 :
727 :2008/01/14(月) 20:30:22 ID:???
>>733 タグで宣言しているコードは関係ないのではと思います。
出力するとき、一部の文字がうまく表示出来ていませんから。
735 :
727 :2008/01/14(月) 20:32:56 ID:???
現状としてはファイルの中の「ソ」とかに\を付けていけば表示はうまくいくのですが、 ファイルをその後書き換えたりするとそれも出来なくなるのではないかと思っております。
>>735 use utf8;
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ':encoding(shiftjis)';
# windowsなら shiftjis -> cp932
↑やってみて
ソース中に日本語文字列書くならutf8で保存してね。
あw binmode IN, ':encoding(shiftjis)'; かな?
>>731 DBにアクセスしているのにファイルハンドルから@nameに格納しているとはいかに?
@nameへの格納の仕方が心許ないです。せめて以下のようにするとか。
my @name = map { (split(/:/))[1] } <IN>;
splitの対象が全角のコロンですが、perlソースと取り扱うデータの文字コードが合っていないと
間違いの元ですよ。
で、optionタグで書き出すべき文字列のリストが@nameに入っていて、それをどうしてグロブ
演算子を使っているのかわかりません。私はこんなこと一度もしたことありませんが…。
ここで、@nameの各要素がいったん解釈されてしまっていて、カタカナのソなどSJISの2バイト目の
\x5cが取り除かれてしまっています。単に
for (sort @name) {
print qq{<option value="$_">$_</option>\n};
}
でいいと思うのですが。
CGI::Applicationで index.cgi?rm=<デタラメなキー> のように run_modesで定義されなかったrun_modeを指定するとエラーが発生させられてしまうのですが 未定義の場合デフォルトのrunmodeを起動させる方法は無いでしょうか?
$self->run_modes( AUTOLOAD => \&catch_my_exception, );
743 :
nobodyさん :2008/01/16(水) 04:59:20 ID:FWbaTTLj
5.005です。 以下のような、引数が省略可能なサブルーチンがあるとします。 sub Func(;$\@\%) { (省略) } このとき、引数が渡されたのか、それとも省略されたのかを Func内で判断する方法を教えてください。 なお、そのままifに入れると偽となるような値(例えばスカラーの値が0)の場合も、 引数が渡されていると判断します。
>>743 引数の数から判定
sub Func(;$\@\%) { print scalar @_ }
Func(); # 0
Func(undef); # 1
Func(1, @hoge); # 2
>744 ありがとうございます。 なるほど、サブルーチンを使う時は常に@_を意識しないとダメだってことですね。
@_ ってカタツムリみたいだよね。 @_ii
747 :
nobodyさん :2008/01/16(水) 14:19:16 ID:Z4nycbhz
かたつむり大作戦
748 :
nobodyさん :2008/01/16(水) 20:06:54 ID:L/Qn1HzA
質問です! 入門書を見ながら「URLにパラメータを加える」というのをやりました。 〜〜/test.cgi?list=man とURLにパラメーターをくっつけ、cgiで &ReadParse( *form ); $sex = $form{ 'list' }; と受け取ったつもりだったのですが、結果をprintしてみると manman と2回表示されてしまいます。これは何が悪いのでしょうか?
いるんだよ、自分で勝手に照会用のコードを切り詰める奴
750 :
748 :2008/01/16(水) 20:51:36 ID:???
失礼しました。手当たりしだい試してたら解決しました。 なんだか色々と間違ってたようです。
751 :
nobodyさん :2008/01/16(水) 22:40:40 ID:QOevDgBW
CGIモジュール等を使わない、 一般的なuriデコードのバグってどんな事ですか? 同じkeyに複数のvalがある場合の対処はしてます。
>>751 区切り文字が & でなく ; のときとか、マルチタイプで送られてきたときとか、XSS対策とかかな?
ちょっと考えてみてほしい ドラゴンボールというのは、集めれば願いがかなうアイテムだ それに対して、 ウンコは、いくらドッサリ集めてもウンコにしかならない このように両者は一見似ているようで本質的に異なる
>>751 巨大なクエリーとか、lengthがでたらめとかかな?
# httpdの仕様にもよるな
uriデコード?とは関係ないけど CGI.pm使うとmod_perl環境(Apache::RegistryやModPerl::Registry)で -ParseHeadersやPerlSendHeader offしてあってもheaderを正しく扱えるので CGIでもmod_perlでも動きます。ってプログラムが作りやすくなる。
>>751 バグってどういうこと?
引数には、ある程度想定されるものしか入らないはずなんだから、
$form{'hoge'} とか、引数として使う値に想定される正しい値が入っているかのチェックを行えばいいんじゃないの?
757 :
751 :2008/01/17(木) 18:58:22 ID:???
>>752 区切り文字はCGI.pmでも&か:ですよね。
>>754 cgi側では解決できないような感じしますね。
>>755 それは良いコト聞いた。
>>756 オライリーの本読んでたら一般的にバグがあるとの事です。
CGI..pm使えとの一点張りです。
なので、どこにバグがあるのかなと ← いまここ
みなさんレスありがとうございます。
とりあえず
>>751 がド初心者だということは分かった。
760 :
nobodyさん :2008/01/18(金) 12:04:46 ID:Z4Jr4bli
ファイルをサーバにアップロードしたいCGIがほしいのですが どこかいいサンプルないでしょうか? アップロードしたいファイルはエクセルファイルです
ぐぐれかす
アップロードしたがってるCGIが欲しいんだろ
意思を持つCGIコワス
>>760 こんな感じですか?
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI qw/:standard/;
use constant MAX_WAIT => 10;
my $q = new CGI;
$q->charset('utf8');
my $wait = rand(MAX_WAIT);
my @mind = qw(uploadしたい uploadしたくない uploadしてもいい);
my $mind = $mind[ int( rand(scalar @mind) ) ];
print start_html(
-head => meta({-http_equiv=>'refresh', -content=>"10; URL=$ENV{SCRIPT_NAME}"}),
-title => 'CGIの気持ち'
),$mind,end_html;
>>766 $waitは、どこで使ってるの?
-head => meta({-http_equiv=>'refresh', -content=>"$wait; URL=$ENV{SCRIPT_NAME}"}),
とかやりたかったのか?
768 :
nobodyさん :2008/01/19(土) 14:38:24 ID:gMv3rNuv
すみません、少し数学の話になるかもしれませんが、 100%の確率のうち30%が当たりという設定をして くじを引かせる場合、 my $rate = 30; my $atari = int((rand(100))) + 1; if($atari <= $rate){ print "あたり\n"; } これで30%ということに理屈ではいえるのでしょうか。 それとも上か下かなので2分の1になるのでしょうか。 ご教示いただけますと幸いです。
算数のレベルだぞ
すみません
>>768 そういうときは、そのコードを何万回か繰り返してあたりとはずれのカウントを取って、
実際に30%くらいになるかを調べればいいんですよ。
>>768 10000回だけ繰り返してみた。
あたり=3031
はずれ=6969
>>771 ありがとうございます。
>>773 実行有難うございます。
私の方でもやってみましたが、平均値が30%になりました。
安心しました。
#!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";
776 :
760 :2008/01/19(土) 23:18:40 ID:???
ファイルをアップロードするCGIを探してます。
日本語おかしかったですね、すいません。
サンプルを探したんですが
>>775 のままだったら
ファイルをアップしたときにファイル名が
アップロードした日付になってしまいます。
ファイル名を変更することなくアップロードするにはどうすればいいでしょうか?
777 :
nobodyさん :2008/01/20(日) 00:14:39 ID:1RDcSYMg
my $outputfn = "$outputdir/$timestamp$ex"; のところを、そうじゃなくすれば良い。
>>776 マルチタイプを分割して、そのヘッダ部分に名前あるよ。
ついでにフォルダ名も表示してやれば、閑古鳥鳴くこと間違い無し。
サーバにファイル名を任意に保存出来るって危険じゃね? 同名ファイルの処理が必要になるし、文字化けとかあるし。 文字化けとかしたら、ダウソとか出来なくなる場合もあるし、 削除とかはsshログインして * とか使って消さないといけなく なる場合もある。(解決は出来るから問題なしともいえるのだが) 日本語はファイルと一緒にコメントとして管理すべきだと思うけど、 どうかな?
782 :
nobodyさん :2008/01/20(日) 19:19:48 ID:xw354eHR
上の人とは別人だけどファイルのアップロードに関して質問 open(OUT, ">$filename"); binmode(OUT); while (read($fh, $buf, 1024)) { print OUT $buf; } close(OUT); close($fh); 上記なソースをよく見かけるんだけど、 三行目で一気に処理するんじゃなくて、 1024バイトずつ取り出して処理する理由って何?
1000MBのバッファ蓄えろというのか
784 :
775 :2008/01/20(日) 19:37:21 ID:???
>>777 具体的にどうかえればいいのでしょうか?
教えてくださいとはいいません。
やってください
>>780 ご意見ありがとうございます。
完全に自分専用とかなら別なんだろうけどな。
>782-783 に関連した便乗質問で悪いけど、 レン鯖とかも考えた時の常識的なメモリ使用量ってどのくらい? シュワルツ変換とか使っていいものかいつも悩む。
>>786 「レンタルサーバ メモリ使用量」でぐぐってみたらどうかな?
ま、突き詰めるとそのサービスの仕様次第となるだろう。
シュワルツ変換も「やってはいけない処理」ではなく、重たい処理
でしかないからな。それだけの質問では何もいえない。
具体的なソースを出して、この負荷は問題ないか?とかなら分かるが。
788 :
nobodyさん :2008/01/21(月) 21:15:32 ID:29cYlZ80
input type=file で送るファイルを指定しますが、 この場合のファイル名そのものを取得するようにするには どのようにしたらよいですか?
>>788 HTTP_CONTENT_TYPEを見て、boundaryで区切って分割して、そのヘッダを読む。
790 :
nobodyさん :2008/01/21(月) 22:20:09 ID:29cYlZ80
>>789 有り難うございます
よく分かりませんが、ヒントを元にくぐってみます
791 :
nobodyさん :2008/01/21(月) 22:33:12 ID:MggCWroJ
toolkitについての質問です。
toolkitのテンプレートを利用ユーザに編集させてたいと思っているのですが、
[% myheader = 'my/index.cgi' %]
[% INCLUDE myheader %]
などされるとソースが見えてしまいます。
なんとか規制できないでしょうか?
phpのsmartyであれば以下のように、テンプレートからのインクルードを規制することができます。
同等の機能はあるのでしょうか?
$this->security = true;
$this->security_settings["INCCLUDE_ANY"] = false;
$this->security_dir = "/path/to/templates";
$this->trustes_dir = "/path/to/php";
または、テンプレート内で使える関数を指定できるとかありますでしょうか?
日本語マニュアル見てみましたが、それらしいものがありませんでした。
http://www.hakoniwa.net/tt/
>>787 亀レスですみません。ぐぐってみました。
>782-783 のような流れをたまに見るので業界の暗黙知が
あるのかと思いましたが特に無いようですね。
会社毎に見ていくと具体的な数字を出している所は少なかったですが、
少ないところで2MBと10Mb(=1.25MB?)でした。
ムーアの法則があるので、数値は出しにくいところがある。 あるサーバで5秒くらいかかっていたのが、最新のでは1秒くらいで終わるので、 ぜんぜん問題にならなくなったとか。 でも、1分を1秒にするのはムーアの法則でも5年以上はかかるわけで、 そのくらいの規模はどう頑張っても無理だろという話だ。
>>791 INCLUDE自体を抑制するやり方はわからんが、
If a BLOCK definition is not currently visible then the template
name should be a file relative to one of the INCLUDE_PATH directo-
ries, or an absolute or relative file name if the ABSOLUTE/RELATIVE
options are appropriately enabled.
これを利用すれば普通は十分じゃねーの?
テンプレート編集自体はtoolkit使うわけじゃないだろ? そこでチェックすりゃいいんじゃね?
796 :
791 :2008/01/23(水) 00:37:55 ID:fM6ljyqY
>>794 >もし、ブロック定義が見つからない場合は、テンプレート名はINCLUDE_PATHのディレクトリにあるファイルか、ABSOLUTE/RELATIVEオプションが付いていれば絶対/相対パスにあるファイルを対象とします。
とのことですが、相対・絶対でスクリプト指定できてしまうということですよね?
考えても理解できませんでした、具体的にどのように利用すれば大丈夫なんでしょうか?
>>795 たしかにテンプレート編集時にinclude等、使わせたくない文言を削除する方法もあるのですが、
入れようとしているシステムが銀行ほどではないんですけど、絶対にユーザにソースが漏れてはいけないシステムなんです。
(今後のシステム拡張等も含んで)チェックミスが出てきやすい作りで作るのはあまり好ましくないと考えています。
html-templateでも、includeなど規制する機能はなさそうですし・・・。
使いたい機能はifとloopだけなんですけど、
perlでセキュリティ完備したテンプレートエンジンほかにあるのでしょうか?
>>796 HTML::Template には no_includes ってオプションがあるけど?
INCLUDE_PATH以下に見られちゃいけないファイル置かないという選択肢はないの?
>>796 そんな大事なシステムをお前程度のスキルの人間が任されていることに
激しく不安を感じるのだが...
INCLUDE_PATHに関数渡すと・・・
データベースにutf8でデータを入れて、携帯の絵文字対応のsjisで取り出そうとしようと思っています。 $s = Unicode::Japanese->new; $s->set($aaa); $str = $s->sjis-imode; という風に、perlで記述したところ、0という値しか返ってきません。ちなみに$aaaをそのままprintすると、文字化けします。 何がいけないのかよくわかりません。どなたかお答えいただけるとうれしいです。
sjis-imodeが悪いと思うよ。sjis_imodeだろ。 $str = ($s->sjis) - 'imode'; と書いたのと同じだな。いちおうエラーにはならないが、 use strictとuse warningsを使ってればいろいろ怒られる のではまらないですむパターンの間違いなので、なぜ 使わなかったのかよく反省しとけ。
さっそくのご返答ありがとうございます。 試してみましたところ、こんどは??????という文字列が返ってきました。 いま現在、iモードシュミレータを使って表示させているのですが、これは携帯を使ってテストしないのが悪いのでしょうか?
>>804 iモードシミュレータとなるとそれはもはやPerlの話題ではないな。
適切なところへいって質問するほうがお互いのため。
その前に$strを16進ダンプ表示してみて期待したバイト列になってるか
どうかぐらいは確認しといた方がいいとは思うが。
806 :
791 :2008/01/23(水) 21:46:29 ID:fM6ljyqY
>>797-802 いろいろな案有難うございます。
一つづつ試してみます。
どうもありがとうございました。
807 :
nobodyさん :2008/01/23(水) 23:17:40 ID:FgvU3OwA
だれか
>>775 をいじってくれる
心のやさしくて暇なやつはおらんのか
サーバに日本語のファイルをUPしたいんだ
するなといわれてそれを納得しておいてなんだそれはw
809 :
プログラミング歴2ヶ月 :2008/01/23(水) 23:19:54 ID:bNex267N
ローカルホストで動かしたときに、mkdirでディレクトリを生成できていたのに いざwebにアップロードしてみると、ディレクトリの生成をやってくれません。 この場合、原因として何が考えられるのでしょうか。 ちなみにperlのパスはあっています。 mkdirなどでググって見ても、よくわかりませんでした。。。 ヒントだけでもいいんで、どなたかよろしくお願いします。(_ _)
>>809 まずはパーミッションの確認からだろうな。
>>809 他には2階層以上のディレクトリはmkdirで作れないとかかな?
812 :
プログラミング歴2ヶ月 :2008/01/24(木) 00:03:36 ID:+24Wb9Pu
>>810 ,811 さん
ご親切にご教授いただきありがとうございます。
先ほど、パーミッションを変更したところ解決いたしまして、とても感謝しております。
しかしそれと同時に新たな問題が浮上してきまして、困っています。。。
mkdirを行った後に、とあるdatファイルに文章を出力しているのですが、
出力した後の改行コードが■になってしまいます。。。
こっちもローカルホストではうまくいっていたのに、なぜなんでしょう??
>>812 ヒント
・UNIXではLF、WindowsではCRLF。
・\nはLR、\r\nがCRLF。
・FTPのアスキーモードで転送すると自動相互変換してくれる。
815 :
プログラミング歴2ヶ月 :2008/01/24(木) 00:53:36 ID:+24Wb9Pu
>>813 ,814さん
解決しました。ありがとうございました!
マジに感謝してます。
>>815 例えばxyzzyみたいに、改行コードを確認したり、変更できる
テキストエディタを入れておいたほうがいいよ。
サクラエディタおすすめ。
保守
819 :
nobodyさん :2008/01/28(月) 12:09:42 ID:fVIm37qB
Perl初心者です。 簡単なPerl/CGIのプログラム(掲示板など)が書ける程度のレベルです。 mod_perlの超初心者向けの解説本、ウェブサイトがあれば教えてください。 できれば日本語でお願いします。 あと、今は退社された方が書いたらしい、現在稼動中のプログラムのソースを入手したんですが、 ソースの最後に exit; って思いっきり書いてたりするんですが、これって大丈夫なのでしょうか?
821 :
nobodyさん :2008/01/28(月) 15:21:58 ID:eRROoQGz
ありがとうございます。 これに関して、オーバーライドを利用したコードを書いているとき、 ある関数(この場合はexit)が、どのパッケージに属しているかを調べる方法があればお願いします。
822 :
nobodyさん :2008/01/28(月) 16:14:02 ID:Fd8GryNX
ときどき見かけるcodepageというのはどういうものなんでしょうか。 たとえば、TeraTermPro with SSHの設定でcodepageというのがあります。 ほかにもありますがこれを例にとります。 ヘルプやgoogle検索で調べても引っかからないのでここでおたずねします。 locale=japanese codepage=932 だとどうもShift-jisの設定をなんらかの形でやるみたいです(付属ヘルプ)。 locale=japanese codepage=65001 だとutf-8みたいです。 それで、私のマシンはWindowsなので、codepage=932で統一しておけばいいんでしょうか。 ケースバイケースなのでしょうか。 相手マシンがFreeBSDで通信することがあるのですが、その場合は、 設定の漢字受信/送信ともutf-8でokですか?? unixだとeucとも聞きますが、最近はutf-8化したほうがいいようなことも聞きます。 ので、よくわかりません。 もちろん、ソースを何で書くかはケースバイケースなのは知っています。 分からないのは、TeraTermの設定で 漢字受信/送信 と codepage という2つのよく分からない項目がある点です。 TeraTermは有名なので当然スレがあるかと思ったらありませんでした。 それにperlプログラミングでよく登場するので、ここで質問させていただきました
exitはダメだけどexit(0)なら大丈夫、 実はそう言われてるけど逆で、exit(0)はダメだけどexitなら問題ない、 最近のヤツはどっちでもいい(具体的なバージョンはか書かれてない)、 色々と情報が混ざってて、調べれば調べるほど混乱してきた orz
動いてんならいいじゃない
そうします。
UTF8の文字列で、全角ひらがなが入ってきた場合、全角カタカナに変換しようとしているのですが 思うように行きません。 $name =~ tr/ぁ-ん/ァ-ン/ 一度、sjisやらecuやらに変換して、文字コードで置換させないと駄目でしょうか
UTF8ならむしろ文字コード変換しないほうが置換しやすくないか?
>>826 そんなことはない。
use utf8してないとかdecodeしてなくて$nameがバイトのままとか
そういうあたりじゃねーの?
use utf8;
binmode STDOUT, ":encoding(utf8)";
foreach (ord('ぁ') .. ord('ん')) {
my $h = my $k = chr($_);
$k =~ tr/ぁ-ん/ァ-ン/;
printf "%x %s %s\n", $_, $h, $k;
}
>>829 誘導thx!! いやースレタイ検索で引っかからなかったもんで。
確かにこりゃ罠だな……
832 :
nobodyさん :2008/01/30(水) 17:37:10 ID:irpAKk1D
ActiveperlでローカルPC上に作成したWEBサイトにIE等でアクセスし、 その処理結果をファイルにしてデスクトップ上に出力したいのですが、 デスクトップまでのパスをどう取得すればいいか分かりません。 ログインユーザ毎にデスクトップのパスが変わってしまうので、 そのあたりを上手く解決できる方法があれば知りたいです。
perlとは関係ないがユーザ毎に環境変数ってのが存在する
use strict;use warnings; use Win32::OLE; my $sh = Win32::OLE->new('WScript.Shell'); print $sh->SpecialFolders("Desktop"); use strict;use warnings; use Win32 qw/CSIDL_DESKTOP/; print Win32::GetFolderPath( &CSIDL_DESKTOP );
835 :
nobodyさん :2008/01/30(水) 21:04:32 ID:FClDhuIR
require Hoge; は通るんですが、 no strict 'refs'; require "Hoge"; が通りません。Can't locateとなります。 文字列からrequireするにはどう書いたらよいでしょうか。
Hogeってのを用意すればいい
どうもです。 Hogeはあるつもりなんですが、前者と後者は同じものを指してないですか?
拡張子を省略していたせいだった気がしました。ありがとうございました。
839 :
832 :2008/01/30(水) 21:59:46 ID:???
>>833 システム環境変数とユーザー環境変数ってやつですよね。
ここにあらかじめデスクトップへのパスを設定するという事でしょうか?
>>834 ソースありがとうございます。
実際に実行してみたんですが、CGIとして実行すると
SYSTEM ユーザ名義で実行され、ログインユーザでのパスが取れませんでした。
DOS窓から実行するとバッチリなんですが…。
少し調べた所、WMIで実現できそうな気がしてきたので
そちらを当たってみようと思います。ありがとうございました。
3年ぶりくらいにPerlを使ってみたのですが、 以前は日本語の検索の時、EUCを使わなくてはいけないとかあったと 思いますが、普通にshift-jisで書いて、パターンマッチも問題なし だったのですが、今のバージョンのPerlは文字コードとか気にしなくて 良くなりました?それともたまたま文字化けしなかっただけ?
>>840 これを実行してみたらどうなる?
print "表現";
print '表現';
>841 だめっすね。 まだjcode.plとか使ってるんですかね。 実は全てunicodeで問題なくなったりしてますか? 日本語のパターンマッチで注意することとかまとめた いいページ知ってたら教えてください。
>843 thxです。しばらく離れていましたが、少し思い出しました。 結局Perlはその間進化していなかったのね。
クライアント、サーバ共にWindowsで、SQLServerとVB使っている システムでも記号とか入力しようとすると駄目な場合もあるからな。 シビアに全部に対応とか考えなくても良いのではと思ったり。
>>844 Perl は 5 が出てから結構経っているはずだよ。
3 年前に触ったのも 5 じゃないかな?
そこまで大きな変化が無いからこそ、という
メリットももあるんだけどね。
次に 6 には、構文とか大きな変化があるらしいから
そっちに期待だなw
たとえば This is a pen.という入力があって、 「This」にマッチしたら、 htmlの色のタグを付けて<font color>This</font>と置換する場合、 これをやると次に「This is」に色を付けたい場合マッチしなくなる のですが、上手いやり方あります? 先に「This is」の置換を する位しか思いつかない。
検索に使うデータは別に持っておくというのはどうだろうか。 Thisにマッチしたとき、 いきなり This → <tag>This</tag> と変換するのではなく、例えば「1番目の単語にマッチした」という情報だけ保存しておく。 で、最後にまとめて置換する。 Perlの持つ強力な文字列操作が活かされないという欠点はあるが。
$in_str = "This is a pen."; $out_str = '<font color="red">' . $in_str . "</font>"; ここで $str に検索対象の文章を入れる。 $str =~ s/$in_str/$out_str/g;
>849 それ同一箇所を何度も置換する場合でも大丈夫?
>849 <tag>This</tag> is a pen. が$strに入ったら、次にThis isは一致しないでしょ?
優先度つけて順番にやるしかない その優先度はあなた次第だもの。
s/This is|This/REPLACEMENT/gみたいなことしたいんだろうか? 一括してやるなら長い方を先にすればいい
This is a pen. ↓ <tag>This is</tag> a pen. このあとに、「tag」というフレーズで検索する可能性は否定できない。 いや、細かくマッチ条件つければ別だろうけど。
856 :
nobodyさん :2008/01/31(木) 21:12:55 ID:ZyBf2Z6K
配列と文字を引数とする場合の書き方がよく分かりません。できるのでしょうか? 以下のようにやってもだめでした。 &subtest(@arr,$str,@arr2); function () { my (@arr,$str,@arr2) = @_; }
>>856 (@arr,$str,@arr2)は新しい配列として扱われるので、サブルーチン側では区切りが分からん。
arrとarr2は参照を渡すとか、要素数が分かってるならサブルーチン側で@_をspliceするとかがいいかも
>845 長い方を先にした場合、 ThisとThis isとis a penがあって、 結論は<font>This is a pen</font>に色を付けたいのだ。 848の方法かなぁ。 ただ、入力テキストが100M位、マッチする検索リストが1万個とかなので、 動かせるか・・・。 Perlよりwordマクロとかの方がいいのかなぁ。 wordなら何度重なって色付けても問題ないし・・・。
860 :
1/2 :2008/02/01(金) 03:03:29 ID:???
>>858 途中まで書いてまじめにやると面倒だという事は分かった。
あとは頑張ってくれ。
#!/usr/bin/perl -w
use strict;
my $str = 'This... This is, This is a pen.';
my @target = ('This', 'This is', 'is a pen');
my $tag_o = '<font color="#ffff00">';
my $tag_c = '</font>';
my $tag_r = qr|</?font[^>]*>|;
my $tag_e = qr/(?:(?!$tag_r).)*/s;
for (@target) {
my $re = join qr/(?:$tag_r)*/o, split /(\s+)/;
$str =~ s/($re)/add_tag($1)/eg;
}
print $str;
861 :
2/2 :2008/02/01(金) 03:04:31 ID:???
sub add_tag { my $substr = $_[0]; if ($substr !~ /$tag_r/o) { $substr = "$tag_o$substr$tag_c"; } elsif ($substr !~ /\Q$tag_o\E/o) { $substr =~ s/(\Q$tag_c\E)/$1$tag_o/go; $substr .= $tag_c; } elsif ($substr !~ /\Q$tag_c\E/o) { $substr =~ s/(?=\Q$tag_o\E)/$tag_c/go; substr($substr, 0, 0) = $tag_o; } elsif ($substr =~ /^($tag_e)\Q$tag_c\E($tag_e)\Q$tag_o\E($tag_e)\z/o) { $substr = "$1$2$3"; } elsif ($substr =~ /^($tag_e)\Q$tag_o\E($tag_e)\Q$tag_c\E($tag_e)\z/o) { $substr = "$tag_o$1$2$3$tag_c"; } else { die $substr; # ココを頑張ってくれ。 } $substr =~ s/\Q$tag_c$tag_o\E//go; $substr; }
862 :
nobodyさん :2008/02/01(金) 04:53:15 ID:hS8kNEG7
if(A1 < B1 && A2 < B2 && A3 < B3 && A3 < B3 && A4 < B4) { $page_dsp .= <<"EOM"; <tr> <td colspan="2" > <form action="????.cgi" method="post" onSubmit="return send_check()"> <select name=ku class=slc> <option value="no"> EOM #この中の条件式(ifの条件付オプション)は省略 {$page_dsp .= "<option value=\"1\">\n"; } $page_dsp .= <<"EOM"; </select> <input type=hidden name=back value="no"> <input type=hidden name=id value="$kid"> <input type=hidden name=pass value="$kpass"> <input type=hidden name=mode value="ku"> <input type=submit class=btn value="オン"> </td></form></tr> EOM } else{$page_dsp .= "<tr><td colspan=2 align=center>終わり</td></tr>\n"; } 以上のように、最初の5つの条件 (各々全部の、左の数値が右の数値と同じかそれ以上の時にセレクトを非表示) で動かしたいのですけど、5つの条件中3つの条件しか満たしてないのに非表示に なります。 条件が5つ揃ってから非表示にするにはどうすればいいですか? ご教授お願いします。
落ち着け
865 :
nobodyさん :2008/02/01(金) 16:52:45 ID:hS8kNEG7
命令が作動しなかったのは今回は説明で省略した命令(ifの条件付オプション)と 最初の5つの命令との相性が悪かったからかもしれませんね。 省略した部分内には、最初の5つの命令を一個ずつ(計5個)指定して、条件が満たされるごとに オプション項目が一つずつ消えていき、全部満たしたら最初の5つの命令でセレクト ごと非表示にするつもりでいたんです。
相性とな?
バルクメモリさしたら動かなかった 相性が悪かったということだな
修士出たら就職を考えている現在3回生の情報の学生でperlが一番すきですが、 今年に入ってからいろいろと求人情報を集めてみたところperlの仕事少ないですね 噂には聞いてましたが、僕は何が何でもperlを仕事にしたいのです まあそれはおいといて、perlを仕事としてみたときどんな感じですかね? 皆さま先輩方の多くはperlを仕事としていらっしゃると思ったので、 是非とも業務内容、他言語と比べたときの待遇、仕事のやりがいなどなど、 ポジティブな意見(勧め)もネガティブな意見(愚痴)も生の声としてお聞かせ願えればと存じます。
perlを仕事にするところはほとんど無いと断言できるです。 仕事の中でperlを使うことはたくさんの現場であるです。 おいらは今、製造業の中でperlを利用しています。 昨今の機器はLANでデータを採取できたりします。 それを高ぁーいWindows専用のアプリでデータ加工することなく、unix(含むlinux)なサーバにてcronでデータ採取・計算・加工してDB(DB_Fileで充分)に登録。(もちろんperlで) そいつを拾ってエクセルに貼り付けるだけ(もしくはSpreadsheet::Writeで書き込むも良し)でもデータの共有が出来たりします。 記録計のようなグラフを作るにしてもGDだけで充分。 部品の計測をするのでも、今時のマイクロメータは数値をUSBで送ってくれる物があったりします。(USBテンキーみたいな出力をしたりする) それをExcelにちまちま放り込むよりか、単純テキスト(csvでも良いけれども)で保存して、perlを使っていろんな形や計算をさせることも出来たりします。 以前勤めていたWEB屋(主にデザインやHTML書き)でも、Excelのデータを1件1HTMLファイルに変換する作業がありました。 (その求人に応募したのだ(照)) 3000件近いデータを変換すると云うことで、2-3か月近い工程を組まれていたことがありました。 どうやら手動で書き換え作業をと目論んでいたようです。 けれどもデータ構造と特性を見極めるのに2日、それを変換するperlスクリプトを2日、変換作業たったの10秒って事がありました。 その当時、その部署の長は目を丸くしていましたです。 まだまだperl=CGIっていう感覚で居られたからです。 その後、ちまちまと元データ(Excel)の修正が入ってきても数秒で修正完了。 デザイン変更があってもテンプレートを書き換えるだけでおしまい。 あまった2-3か月の期間、他の仕事を色々とこなしていました。 ようは仕事に使う道具の1つとしてperlというのを持っていればどんな業種にでも使えるんじゃないかな。 そんなこともあって製造業の現場であるにもかかわらず、おいらのところにだけは使い慣れたMacOSX(iMacG5)なんてのを無理を聴いて貰って備え付けましたですです♪
perlを仕事で使うなら修士はオーバースペック。 高卒で十分な土方に好き好んで修士雇う経営者がいるのか?
修士雇う経営者がいないなら高卒って言えばいいだけのこと そんなこともわからないのか?
perl土方は頭悪いな。 高卒で足りる仕事には高卒の賃金しか払わないという事だよ。
>>872 それ、学歴詐称にあたるんじゃないの?
ちょっと前、問題になったでしょ。
perl土方は新聞を読まない。
WEB系いきゃいいんじゃないの? 個人的にはなにがなんでもPerlとかいってるPerl使いは嫌だけど
Perlがちょっとくらいできても仕事ねえぜ、と修士出の自宅警備員が言ってみる。
>>874 それ公務員ね。試験区分に対象の学歴があってそれに沿うことが望ましいとされてるから。
というかこれマ板のネタだろ。
ちょっと失礼します。
僕はWebprog板に
>>869 と同一内容の書き込みをした者です。
>>869 は偽者であって僕がマルチポストをしたのではないことを明言しておきます。
トリップをつけたので本物しか相手をしないようお願いいたします。
迷惑をおかけして申し訳ありません。
お騒がせしました。
質問です。XML::RSSを使って、外部から取得したRSSを加工してHTML(euc-jp)に出力しているのですが、 一部の記号(それも機種依存文字含む)が文字化けします。 − → \x{ff0d} o → \x{339c} 機種依存文字に関しては、根本的に対応することに意味があるのか疑問ですが、せめてwindowsな環境で 文字化けしないようにしたいのです。どうしたらいいでしょうか? あんまし分かっていませんが、重要そうな部分だけ。 use XML::RSS; use LWP::Simple; use encoding 'euc-jp', STDOUT => 'euc-jp'; use open IN => ":encoding(euc-jp)"; use open OUT => ":encoding(euc-jp)"; binmode OUT => ":encoding(euc-jp)"; my $rss = new XML::RSS; $rss->parsefile($site_file); my $item_list = $rss->{'items'}; $item = ${$item_list}[0]; my $desc = $item->{'description'}; #一応対策っぽいことをやって一部の記号には対応できた $desc =~ tr/\x{005C}\x{00A5}\x{2014}\x{203E}\x{2225}\x{FF0D}\x{FF5E}\x{FFE0}\x{FFE1}\x{FFE2}/ \x{FF3C}\x{FFE5}\x{2015}\x{FFE3}\x{2016}\x{2212}\x{301C}\x{00A2}\x{00A3}\x{00AC}/;
880 :
879 :2008/02/02(土) 15:48:16 ID:???
ちなみに、 〜 → \x{FF5E} に化ける問題は、一番下に書いた置換で解決したのですが、\x{FF0D}は何故かそのまま 文字化けしたままです…
881 :
879 :2008/02/02(土) 15:55:11 ID:???
すいません、
>>880 は単純ミスでした、取り消します。
882 :
879 :2008/02/02(土) 15:57:31 ID:???
忘れていました。エラーメッセージが出ます。 hogehoge.cgi: "\x{ff0d}" does not map to euc-jp at hogehoge.cgi line 183.
求人ってほとんどPHPだよなぁ。プラスDreamWeaverの使用をセットで。 perl使ってるところはライブドアとかはてなとか高レベルに使いこなしてるところばっかり。 初〜中級のところは全部PHPになってしまった。
モバイルならPerlも使ってるとこそこそこあるんでないか
正規表現とか以外なら、構文同じなんだからすぐに移植できるだろ。 あとはPEARとかを使いこなせればいいわけだから、Perlの基礎がある のなら、1週間程度で、出来るといえるんでね? Perlで作ったコードをPHPに移植して、これ、私が作りました、みたいな。
PEARってperlでいうCGI.pmみたいなもん?
887 :
質問 :2008/02/03(日) 13:04:56 ID:34/ZwImQ
このスレでよいかわかりませんが・・・ 項目を選択しボタンをクリックすると、あるページには選択した項目の画像ファイルを表示し、 もうひとつのページにはその選択した項目を表示させたいのですがどうしたらよいでしょうか? 最初のページには <form action="A.cgi" target="表示させたいページ"> を埋め込んでいるのですが、当たり前ですがこれだと"表示させたいページ"にしか表示できません。 A.cgiのなかでさらにこの部分だけは他のページへ表示させるとかできませんか?
>>887 それは、Perlの話じゃなくて、htmlの話じゃないの?
フレームタグを使って区切るか、テーブルタグを使って全部を表示させる方法がある。
板違いなので、これ以上の質問はしないように。
>>879 メッセージのとおりで、変換表に該当するものがないんでしょ。
euc-jpMSとか使わないといけないんじゃないの?
perl 5.8.5 CentOS 5.1 「out of memory」のときのエラーハンドリングの方法を教えてください。 dieのときは $::SIG{__DIE__} = sub {〜〜〜}; でいけることまではわかったのですが 「out of memory」がハンドリングできないのです。 よろしくおねがいします
OSの制限だから、ハンドリング考えるよりコード見直す。 それができないのなら、OSの制限上げる。メモリ積む。
perl5.8 my @value=(0,1,3,8); #任意のkey my @hoge=('hoge1','hoge2','hoge3'....); #表示用配列 my $disp; foreach (@value) { $disp .= ',' if $disp; $disp .= $hoge[$_]; } という処理をしているんですが、これってJOINでできませんか? map使ってもこれより簡単に書けないですよね?
こういうこと? my @value = (0, 1, 3, 8); my @hoge = ('hoge1', 'hoge2', 'hoge3', 'hoge4', 'hoge5', 'hoge6', 'hoge7', 'hoge8', 'hoge9'); print join ',', @hoge[@value];
>>894 おお。ありがとうございます。コードがすっきりします^^
すいません。もう一点。 my $value = "0,1,3,8"; my @hoge = ('hoge1', 'hoge2', 'hoge3', 'hoge4', 'hoge5', 'hoge6', 'hoge7', 'hoge8', 'hoge9'); これは join ',',@hoge[sprit',',$value]; ですよね? splitしてjoinして勿体無い感じ。。
splitとspliceは別物
valueがスカラーで入れなきゃ一回joinで済む話。
899 :
nobodyさん :2008/02/11(月) 09:15:09 ID:7AZat8M4
ファイルの最後の行番号を取得したいんですが、 my $endline = $. while (<FH>); としてとりえず取得できたんですが、 その後 seek FH,0,0; として、また1行目から別の処理したいんですがうまくできません。 seekの戻り値をprintしてみると1を返してますが、先頭には戻ってないようです。 windows環境なのが原因でしょうか?
my $endlineだと局所化されて外側で取得できなくない? seekしても$.はリセットされないから先頭に巻き戻したら$.= undefとかすればいい
>>900 さんレスありがとうございます。
>局所化
あ、ほんとだ。ミスってました。
undef $.;
reset $.;
それぞれ試してみましたが変化ありませんでした。
その後に
while (<FH>) {
if ($. == $bigin .. $. == $end) {
といった処理をしたいんですが、どうもうまくいきません。
$. = 0;としたらうまくいきました。 ありがとうございました。
文字コードについて質問します。 utf-8から7bitJISへの変換なのですが、(メール送信のため) Encode.pmもJcode.pmもローマ数字をJISにしてくれません。 Encodeでは「\x{2160}」と変換不可の場合のユニコード値に変換され、 Jcodeでは「?」になります T(ローマ数字1) \xE2\x85\xA0 utf8 → \x1B\x24\x42\x2D\x35 JIS と手動で変換してやれば良いのですが、escシーケンスの処理がどうしたものかと・・・
use lib '../lib'; のように相対パスを使うと出来るけど use lib '/i/cgi-bin/lib'; のように絶対パスを使うと動かなくなります サーバーの設定によって絶対パスだと読み込めなかったりするんでしょうか 普通のリンクだと絶対パスでリンクできます
>>904 本当にそれが絶対パスであれば使えると思うのだが、おそらく違うんだと思う。
>>904 perlから使う絶対パスはwebサイト上の絶対パスじゃないよ。
・ http鯖がルートとして扱うディレクトリからの絶対パス
・ 鯖のOSの絶対パス
の違いを理解しような。
908 :
906 :2008/02/13(水) 10:48:35 ID:???
有難うございます 調べてみます
909 :
904 :2008/02/13(水) 10:49:51 ID:???
>>907 ありがとうございます
Encode::EUCJPMSモジュールをいれて、
use Encode::EUCJPMS;
use Encode;
my $cp50220_str = Encode::from_to( $utf8_str , "UTF8" , "CP50220" );
で良いのでしょうか?
実はフォーム入力はShiftJISでして、CP932からutf-8に一旦エンコードしています。
これで問題はないでしょうか?
>>910 UTF-8に変換するときにエラーになってなきゃ大丈夫なんじゃない?
〜 あたりが微妙ではあるけど。
912 :
nobodyさん :2008/02/14(木) 10:56:12 ID:AY3pAm1W
教えてください。サーバではなくて、自分のPCにPerlをインストールしています。
#!/usr/bin/perl
use strict;
print "IEを起動します...\n";
system("C:/Program Files/Internet Explorer/iexplore.exe");
exit;
__END__
上のようにすると、IEは起動するのですが、コマンドプロンプトは残ったままで
タスクマネージャーにも perl.exetが残っています。(残るというか待ってるようですが…)
IEを起動したあとはPerlも終了して欲しくて検索したらexecというのがあったので
exec("C:/Program Files/Internet Explorer/iexplore.exe");としたら起動しませんでした。
IE起動後速やかにPerlを終了させるにはどうすれば良いでしょうか。
PerlはActivePerl 5.8.8をインストールしました。
もう一つは、my $url = '
http://www.google.co.jp/ '; とした時に
IEにこの$urlを開かせるにはどうすればよいのでしょうか。よろしくお願いします。
ヒント: system("start", $url);
/\___/ヽ ヽ / ::::::::::::::::\ つ . | ,,-‐‐ ‐‐-、 .:::| わ | 、_(o)_,: _(o)_, :::|ぁぁ . | ::< .::|あぁ \ /( [三] )ヽ ::/ああ /`ー‐--‐‐―´\ぁあ
916 :
910 :2008/02/14(木) 12:58:24 ID:???
>>911 ありがとうございます。
「〜」は手動でE3 80 9Cに置き換えています。
では教えていただいた方法でやってみようと思います。
fedora8なマシンで監視装置をでっち上げようとしています Net::SMTPについて教えて下さい use Net::SMTP; my $smtp = Net::SMTP->new( $mailhost ); $smtp->mail( $MailFrom ); $smtp->to( $MailTo ); $smtp->data(); $smtp->datasend( "From: $MailFrom\n" ); $smtp->datasend( "To: $MailTo\n" ); $smtp->datasend( "Subject: $e_subject\n" ); $smtp->datasend( "Mime-Version: 1.0\n" ); $smtp->datasend( "Content-type: text/plain; charset=ISO-2022-1\n" ); $smtp->datasend( "Content-transfer-encoding: 7bit\n" ); $smtp->datasend( "Reply-to: $MailFrom\n" ); $smtp->datasend( "$body\n" ); ここでbodyに例えばtestdataと入れると$bodyもメールとして届くのですが、 $bodyをtest:dataとする(半角コロンが入っている)と、$bodyが送られません 何が悪いのかご教示下さい
半角コロン
つ[ $smtp->datasend( "\n$body\n" ); ]
920 :
917 :2008/02/14(木) 15:31:16 ID:???
921 :
919 :2008/02/14(木) 15:57:21 ID:???
>>920 よかったな。
バグった状態だと$bodyが送られてこないんじゃなくヘッダに入ってたはず。
メールヘッダと本文の切り分けは「半角コロンが入ってない行が登場した所から本文」って事になってるから、
どんな文が入るか分からん時は、ヘッダの最後に空行を入れれば桶。基本なんで覚えとくと便利。
922 :
917 :2008/02/14(木) 16:25:19 ID:???
>>919 覚えておきます
ありがとうございました(^^
これで沈みます
>>921 ヘッダと本文は空行で分けられます。
ついでに言うと、改行は CRLF (\r\n) にすること。
MTA によっては受け付けてくれません。
924 :
exe :2008/02/19(火) 11:44:47 ID:L1DAdjnk
ファイルにaからz、AからZを交互に連続で出力し、最後に改行して、この処理を10回繰り返す方法を教えてください。 aAbBcCdDeE・・・yYzZ のような形です。お願いします。
宿題は自分でやろうな。
print "aAbB.....yYzZ\n"; を10個コピペでおk
927 :
exe :2008/02/19(火) 14:24:58 ID:L1DAdjnk
すいません。10回出力はわかるんですが、for文を使ってaAbBcC...zZの表示方がわからないのでどなたかお願いします。
for(1..10) { for(65..90) { print pack("C*",$_); print pack("C*",$_+32); } print "\n"; }
929 :
exe :2008/02/19(火) 14:42:37 ID:L1DAdjnk
nobody さんありがとうございます。 ちなみに↓の形で書くと、どうしたらよいでしょうか。 何度もすいません。 open (FILE, '>test1.txt') or die "$!"; for my $count (0..9) { for my $i ("a".."z") { } print FILE "\n"; } close(FILE);
# # $countってなんぞ? # open (FILE, '>', 'test1.txt') or die "$!"; binmode(FILE); for my $count (0..9) { for my $i('a'..'z') { print $i; print uc($i); } print FILE "\n"; } close(FILE);
# # ↑はウソ # open (FILE, '>', 'test1.txt') or die "$!"; binmode(FILE); for my $count (0..9) { for my $i('a'..'z') { print FILE $i; print FILE uc($i); } print FILE "\n"; } close(FILE);
932 :
exe :2008/02/19(火) 15:06:17 ID:L1DAdjnk
ありがとうございます。$Countは適当においてる変数です。
933 :
exe :2008/02/19(火) 15:54:07 ID:L1DAdjnk
先ほど↑で作ったファイルを出力として、小文字のみを取り除いた結果を標準出力に表示するにはどうしたらよいでしょうか? 自力でやらないといけないのはわかっているのですが、時間がなくて・・どなたかお願いします。
# # そういうウンコみたいな仕事を漏れにも回してくれよ # $sent = 'dTgZtyYthSGetLt'; $sent =~ s/[a-z]//g; print $sent;
馬鹿だな、まずはおっぱいうpしてからだろjk・・・
936 :
exe :2008/02/19(火) 16:55:41 ID:L1DAdjnk
仕事では無いです。笑われてるかもしれませんが初心者の 自分にとっては色々難しくて。時間もありませんでしたので・・
938 :
nobodyさん :2008/02/19(火) 17:30:48 ID:gLoGL0Ae
いやそれが最強。wgetのWIN版もあるからな。-qも付けると良い。
LWP
941 :
937 :2008/02/19(火) 19:26:35 ID:???
>>938 ありがとうございました
無事 取得することが出来ました。
あと[`]でくくるのはなぜなのでしょう?
942 :
938 :2008/02/19(火) 20:13:58 ID:???
>939 モジュール使った方が互換性高いし、そっちの方が良いと思ったんで。 >940のLWPを使うのが最良だと思うが、使い方調べてる気分的な余裕がないんで、 wget使ってそのまま今に至る感じだ。 >941 外部コマンド実行だから。``で囲むと外部コマンドを実行して標準出力が戻ってくる。 ちなみに"perl -T"でやってると、そのままじゃ外部コマンド動かない事があるんで注意。 $ENV{'IFS'}, $ENV{'CDPATH'}, $ENV{'ENV'}, $ENV{'BASH_ENV'}, $ENV{'PATH'}を 退避・削除してから外部コマンドを実行し戻す必要がある。
LWP
945 :
937 :2008/02/20(水) 12:35:11 ID:???
@urlの中に500くらいのサイトのURLが入っています。 そのURLのページにキーワードか書かれているかどうか調べるとき、 foreach (@url) { LWPで取得してキーワードが見つかったら、$count++; } みたいにすると一つずつなので物凄く時間が掛かります。 10個くらい一気に取得する方法はないでしょうか?
同じプログラムを10個並列に走らせてそれぞれに50サイトずつ担当させるのが一番楽だと思うよ。
こういう場合ってほとんどはLWPで取得するのが一番時間かかってるのかな?
fork
プロセスで並列化するとプロセスAは終わってるけど プロセスBは重いサイトがリストにあって終わってないとか 無駄に待ち時間増えるから、threads使える環境ならthreadsのが楽でない?
JISの文から携帯電話の絵文字部分を退避させたいと思っています。 正規表現について教えてください。 通常の2バイト文字と同様に絵文字[\x75-\x7B][\x21-\x7E]がエスケープシーケンス \x1b\x24\x42と\x1b\x28\x42に囲まれます。 エスケープシーケンスをそれぞれ $esc_in = "\x1b\x24\x42"; $esc_out = "\x1b\x28\x42"; とし、絵文字を $emoji = "[\x75-\x7B][\x21-\x7E]"; とします。 元の文を $str="今日は晴れでした■気温は10度です。";(■は笑顔の絵文字 \x79\x79 ) この$strは $esc_in今日は晴れでした■気温は$esc_out10$esc_in度です。$esc_out とエスケープされます。 やりたい事はこれを $esc_in今日は晴れでした$esc_out[7979]$esc_in気温は$esc_out10$esc_in度です。$esc_out というように[]で絵文字コードを囲い、エスケープシーケンスの整合性をとるというものです。 どなたかご教授いただけないでしょうか?
それのどこがWeb Programmingなんだ?
JISコードは加工には向かないので、Encode::JP::Mobileあたり使って いったんutf8文字列にしてから加工して戻す方がたぶん見通しいいよ。
955 :
952 :2008/02/21(木) 03:31:08 ID:???
>>954 ありがとうございます。そちらの方で検討させていただきます。
このような複雑な置換について私は苦手でして、もしこれがお分かりになられるなら後学のためにも教えていただきたいのですが、ご無理でしょうか?
マッチした文字列の前後は$esc_inで囲って マッチした文字列はルールに沿って変換 ってことかな?
×$esc_inで囲って ○$esc_inと$esc_outで囲って
無理に書くとこんな感じ? 全くお勧めしない。 # 絵文字部分を1文字ずつ加工。 # 1バイトずれてマッチしたり、ascii部分にマッチしないようにしてるので面倒 $str =~ s{ ( (?:\G | ^[^\1b]*\x1b\x24\x42) (?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*? ) ([\x75-\x7b])([\x21-\x7e]) }{ sprintf "%s\x1b\x28\x42[%02x%02x]\x1b\x24\x42", $1, ord($2), ord($3) }gex; # 冗長なエスケープシーケンスの並びを除去 $str =~ s/(\x1b\x24\x42)+/$1/g; $str =~ s/(\x1b\x28\x42)+/$1/g; $str =~ s/\x1b\x28\x42\x1b\x24\x42//g; $str =~ s/\x1b\x24\x42\x1b\x28\x42//g;
959 :
952 :2008/02/21(木) 14:20:04 ID:???
>>958 ありがとうございます。
やはりすごい複雑になってしまうんですね。
(
(?:\G | ^[^\1b]*\x1b\x24\x42)
(?:[^\x1b]{2}|\x1b\x28\x42[^\x1b]*\x1b\x24\x42)*?
)
を見てもさっぱり理解できません。
これが絵文字でない文字を指すというのはわかるのですが、詳しく教えていただけないでしょうか?
または参考になる書籍などがありましたら教えていただけないでしょうか。
960 :
952 :2008/02/21(木) 14:25:02 ID:???
書き忘れましたが、Encode::JP::Mobileを使い無事utf8にできました。 これを作った方すごいですね。こんな便利なものがあると知りませんでした。
961 :
初心者 :2008/02/21(木) 14:43:22 ID:eHzrHpy8
perlでカレンダーを作るのですが、プログラミングする内容としては何がひつようでしょうか? 何から書いていいやらとっかかりがわかりません。どなたかアドバイス等をお願いします。
ggrks
とりあえず以下のサブルーチンを作る 1. 本日の年・月・日・曜日を返す 2. x年y月z日の曜日を返す 3. x年y月1日の曜日を返す 4. x年y月の月末日を返す 5. x年y月の前月を返す 6. x年y月の翌月を返す 7. x年y月z日の前日を返す 8. x年y月z日の翌日を返す
964 :
初心者 :2008/02/21(木) 15:13:33 ID:eHzrHpy8
ありがとうございます。
965 :
初心者 :2008/02/21(木) 15:26:58 ID:eHzrHpy8
今年のようなうるう年かどうかを調べるにはどうしたらよいのでしょうか?
966 :
nobodyさん :2008/02/21(木) 15:35:05 ID:/bZGgDSr
閏年の定義に当てはまるかどうかを調べればよい。
>>965 西暦が4で割り切れて、100で割り切れなければ閏年。
西暦が4で割り切れて、400でも割り切れれば、100で割り切れても閏年。
いちいち相手にするからググればわかるような質問が絶えないんだよな
968 :
nobodyさん :2008/02/21(木) 15:38:45 ID:/bZGgDSr
悪かった。今は反省している。
閏年を知る必要は無いはず。 月末=翌月1日の1日前( x年y月の月末日=(x年y+1月1日)-1日 )だから、 PerlインタプリタとOSとライブラリにバグがなけりゃ閏年だろうが、平年だろうが 関係なく計算できる。 Date::Calc使って計算すりゃ一発で出るだろ。
ググっても分からないような初心者質問って?
>>969 ggrksには同意だが、
たとえば誕生日の入力で2/29が妥当かどうかってのは閏年を判別しなきゃいかんだろ。
質問者の意図は知らんが。
973 :
969 :2008/02/21(木) 18:13:29 ID:???
>>972 名前: 初心者 ID:eHzrHpy8 が継続的に質問してるんで、
ID:eHzrHpy8 : 「>961 カレンダーを作りたい。」
nobodyさん: 「>963」
ID:eHzrHpy8 : 「>965 月末日を知るのに閏年を知りたい」
って一連の流れだと思ったんだが、違うのか?
要するに2月のカレンダーを作るときには、3月1日の日付から−1してやって、日付を取得すれば
いいってことを
>>969 は言ってるんだね。
カレンダーを書くルーチンを考えたことないから、参考になるね。
localtime使う前提だよね? 末日計算を前提としてる話とごっちゃになっとる
もちろん。 でもさ、カレンダーを書くcgiくらい、散々ソースが転がっていそうな気がするんだけどね。 その辺の中から、適当に拾ってアレンジすれば目的は果たせるんじゃないの?
自分が使うカレンダーならどっかから拾ってくればいいが、 課題ともなるとそうもいかないんじゃない?
というか、今更perlの課題とか出す大学とかあるの?
>>952 とまったく同じ文章が今日MLに流れてきてたけど、同一人物?
テスト^^;
自分用モジュールつくってるんだけどさ package hoge; use strict; my $test = 'ABC'; sub new { my $pkg = shift; bless { hoge => $test, },$pkg; } みたいに先頭で定数定義してメソッド内で使いまくるのって問題ありますか? これならuse strictしない方が良かったりする?
外部値で初期化したいなら引数として渡せば?
>>982 問題ないとおも。
ただ、定数として明示したければ、
use Readonly;
Readonly my $test = 'ABC';
しといた方が
定数は大文字にする習し
(・∀・)
>>983 箱から出したくないしので、blessに絡めたくないんです。
ちなみに全メソッドで使います。
>>984 CPAN配布物ですかね?
名前からして便利そうですが、標準で入ってないのは遠慮したいです。
>>985 おk
コールバックあたりも調べてみます。
とりあえずみなさんありがとうです。
use Vars, oursなんてあったのか。
以前は値を返すだけのsub使ってた。
993 :
982 :2008/02/23(土) 22:24:31 ID:???
>>991 ダウソしました。できるだけ理解してから使ってみます。
>>990 ,
>>992 サブルーチンでやるならsub Readonly () { 'ABC' }でおkですね。
とりあえず自分用はそうします。
もし他人に配布するような事があれば
>>989 ,
>>991 が良いっす
短時間ですごい勉強になりました。ありがとう
保 守
次スレ希望
テンプレ貼るなら立ててやるよ
乙です。 埋め
埋め
埋め
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。