Perlコーディング初心者質問スレ Part 41
1 :
nobodyさん :
05/03/10 00:47:16 ID:sT66OcmD Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
2 :
nobodyさん :05/03/10 00:47:50 ID:sT66OcmD
前スレと同じテンプレにしたけど、足りない箇所、間違いあったら訂正よろしこ 過去ログ貼るとき「httpが多すぎます」って出た。こんな制限あったんだ そそ、「コーディングとは云々」ってやつ無かったけどあれやめたの? 前スレ終盤、とんでもないスレ違いの書き込みがあったので気になりますた
ひらがな -> カタカナ変換はぐぐりまくって $value =~ s/\xa5\xa4/`/g; $value =~ s/\xa4([\xa1-\xfe])/\xa5$1/g; $value =~ s/`/\xa5\xa4/g; とやればできるとなんとかたどり着いたのですが、この逆の カタカナ -> ひらがな 変換がどうしてもヒットしません。 ご教示いただけますと幸いです。
11 :
nobodyさん :05/03/10 08:33:39 ID:Cjqv3NW2
ダウンロードツールを作ってます。 ボタンを押して、ページを切り替えるタイプの掲示板cgiのログを落とせるようにするには どうすればいいのですか? getでページ切り替えを送信する掲示板ならまだできそうですが、postで情報を送信する掲示板だとどうしていいかわかりません。
12 :
nobodyさん :05/03/10 08:40:58 ID:Cjqv3NW2
>>10 正規表現の左右逆にしてできないん?
>>11 getでできるならpostでもできるだろ。
何なら書き込みフォーム以外の <form method="post"> を <form method="get"> にすれば? とか。
15 :
nobodyさん :05/03/10 15:29:02 ID:Mmpnq31h
例えばとあるCGIを起動したら
http://www.hoge.com/index.cgi にPOST形式でクエリを送り付けたいのですが不可能ですか?
この送り先は自分のCGIではないです。
CGIの起動はcronで毎日1回です。
getならリダイレクトとかでできると思いますが、POSTはどうすればいいんでしょうか?
>>15 CGI proxyとかそんな感じじゃないの
socketとかLWPとかで検索してみたら
17 :
271 :05/03/10 17:35:54 ID:0qqwutep
csvファイルを読み込み処理するプログラムを作っています。 csvが","のみで区切られているときは、split(/\,/,$file) 等で読み込みできます。 しかしcsvファイルがaaa,"bbb,ccc",dddのようになっている 時に上手く分割する方法を思いつきません。どおすればいいのでしょうか?
>>17 いったい区切り文字は何なんだよ。
," なのか ", なのか , なのか?
, なんならそれでできるはずだが
どこの271だw
Text::CSVってモジュールあったような。
>>12 のでグルるとJapanese.pmってのがやたらと引っ掛かるけど、
DLしてみたら31万バイトもありやがる。これじゃ鯖が可愛そうな
んで、自分でそのときの必要に応じて作ったほうがいいと思うが
どうよ。漏れは
>>10 じゃないが。
>>10 こいうこと?
perl -e '$str="aaa,\"bbb,ccc\",ddd"; @str=split(/,\"?/, $str); print $str[1], "\n";'
bbb
24 :
23 :05/03/10 18:13:06 ID:???
25 :
23 :05/03/10 18:16:07 ID:???
こうしないとダメだたorz split(/\"?,\"?/, $str); すかす変なデータやなぁ
どうせ split したあと "" => " の unescape とかもしなきゃいけないんだろうから、 Text::CSV か DBD::CSV を使っといた方が良さげ。
>>10 use String::Multibyte;
my $euc = String::Multibyte->new('EUC_JP');
my $kana = $euc->mkrange('ァ-ン');
my $hira = $euc->mkrange('ぁ-ん');
my $kanahira = $euc->trclosure($kana, $hira);
my $value = 'ヌルポ';
$value = $kanahira->($value);
--
perl 5.8以降
use encoding "euc-jp";
my $value = 'ヌルポ';
$value =~ tr/ァ-ン/ぁ-ん/;
28 :
nobodyさん :05/03/10 19:59:47 ID:0qqwutep
30 :
23 :05/03/10 22:15:15 ID:???
藻前、区切り文字の意味わかってねーだろ。
31 :
23 :05/03/10 22:17:23 ID:???
ってか、タブ区切りでもCSVってExcelで拡張子つくけど・・・
漏れはK3形式だな。
>>29 はK3てわかってねーだろ(w
相手がわかってないと思ったら知ったかぶりばかりしてないで説明すりゃいいじゃん。 ちょっとちょっかい出されたくらいで不毛な煽りで返すのは大人げないからやめれ。
33 :
23 :05/03/10 22:31:42 ID:???
何か勘違いしてたみたい。 (´Д`) ( 八) 〉〉 スミマセンスミマセン
34 :
nobodyさん :05/03/10 22:34:02 ID:Lndb2Cof
>>34 ソケット使えて、しかも怒られないところ教えて
おまえさんのアソコこそが最高のソケットじゃないか
39 :
15 :05/03/11 11:01:25 ID:BXH5EoKa
40 :
15 :05/03/11 11:21:11 ID:BXH5EoKa
41 :
nobodyさん :05/03/11 11:43:03 ID:wWuZgVEw
あるcgiの中で foreach (@QUERY){ ($n,$v)=split(/=/); next if $n eq "data" && $v !~ /[^\d\%]/ && (@data = split('%',$v)); $v=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $n=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; ・・・ って書いてあったんですが、3行目のnextの部分が、どういう処理をしているのかがわかりません。 どなたか、日本語訳を教えてください。
>>40 >cron起動だと出力内容を受け取れませんよね。
試してみた?
43 :
15 :05/03/11 11:49:53 ID:BXH5EoKa
っていうかLWPってかなりごちゃごちゃと難しいんですね。
DBI程度しか使ったことない人間にとってはorz
でもこれを理解すればかなりのことができるような予感。
頑張ります。
>>41 next if 条件式
これは条件式が真であればそれ以降の処理をすっとばして次のループに移るのです。
つまり
$n eq "data" && $v !~ /[^\d\%]/ && (@data = split('%',$v));
$nを文字列比較してdataと同じで且つ、$vの中には\dと%以外が入っていて、
最後の代入文を実行する。
3つの文が全て新ならnext発動です。
44 :
15 :05/03/11 11:52:32 ID:BXH5EoKa
>>42 すみません。勘違いでしたm(_ _)m
とにもかくにもwwwってのはブラウザに限らないんですね。
LWPの解説をちょっと読んだらそういうことが書いてありました。
クローラーもLWP使えば作れちゃいそうな感じですね。
ただ、モジュールというよりモジュール群のようなので難しいです;
>>41 QUERYの内容がurl encodeされていたらurl decodeをする
46 :
41 :05/03/11 11:55:17 ID:wWuZgVEw
>>43 いずれにしても、最後の代入文は実行されるということで
いいんですよね?
47 :
15 :05/03/11 11:59:20 ID:BXH5EoKa
>>46 &&という演算子を勉強するといいです。
0 && 1
この場合1は評価されません。
1 and 1
1は評価されます。
>>40 英語でわからんとかごちゃごちゃ難しいとか言ってないで
そこのサイト(ってCPAN本家だけど)の An Exampleだけで目的のことはできるような。
49 :
15 :05/03/11 12:02:58 ID:BXH5EoKa
>>49 のサイトの
# ユーザ・エージェント オブジェクトを作成
use LWP::UserAgent;
$ua = new LWP::UserAgent;
$ua->agent("AgentName/0.1 " . $ua->agent);
これなんで
$ua->agent("AgentName/0.1 " . $ua->agent);
こんなことしてんだ?
$ua->agent("AgentName/0.1");
の間違いだろ。
51 :
41 :05/03/11 12:08:42 ID:wWuZgVEw
>>46 条件文の&&は 且つ という意味でいいと思っていますが。
しかし、最後の文は比較するのではなく、代入してるっぽいので
前の条件文が評価されなくても、代入されるのかなと思ってますが。
間違ってますか?
52 :
48 :05/03/11 12:11:10 ID:???
自分もLWP::UserAgent以外使ったことないんだけどね。
53 :
48 :05/03/11 12:14:04 ID:???
>>51 間違いです
条件が満たされなくなった時点で次の判定式はスルーされます
54 :
15 :05/03/11 12:28:51 ID:BXH5EoKa
これは面白いですね! 他のページの出力内容を自分のページに埋め込むことができるというのはすごい! LWPを紹介してくださってありがとうございますm(__)m
なんとなく、 Perl や Web プログラミングをおぼえたてのナイーブだったあの頃を思い出させるスレの流れ。
56 :
41 :05/03/11 12:57:15 ID:wWuZgVEw
>>53 ということは、1つ目の条件式をクリアしたあと、
2つ目の条件式をクリアしたときにだけ
代入されて、次のループに移るってことですね?
57 :
48 :05/03/11 13:17:32 ID:???
>>56 正解
複数の式を||でつないだ場合は逆に式が真の時点で判定は終了する。
小数点切り上げって関数がないようですがどうすれば? $n = 100/49; if ($nが小数点を含んでいたら){ int $n+1; } なんか面倒なのですがこれが普通ですか?
というか小数点を含む数値がどうか調べる関数もないorz
馬鹿な話ですがuseってプログラムの先頭に書いたほうがいいんですか? 使う直前の方がいいですか? 後者だと重複useがでる可能性がありますが、それを良しとするなら見やすいですよね。 意見お願いします。
62 :
15 :05/03/11 14:20:21 ID:BXH5EoKa
実装できました。 ところでこのLWPって制作側としてはものすごい便利ですが、これを使うと、 ユーザが直接アクセスしてもいないサイトへユーザの情報が自動的に送られてしまったりしますよね? 例えばとある悪質なアダルトサイトがあったとして、悪質だと気付かずにそこに 月額契約をした場合にその入力内容をそのまま他の数十のアダルトサイトへも LWPでリクエストが送られて自動的に登録されてしまうような惨事も起きてしまう可能性もありますよね。 当然勝手に登録されたといっても、住所や電話番号からクレジットの暗証番号まで正確なので 下手したら裁判でも負ける気がするのですが・・・・ まあもちろんアダルトサイト管理人がLWPを使わずとも手動で顧客の情報で他のサイトにも 登録するのと同じことですが。 このあたりってみなさん気にしたことありませんか?
63 :
10 :05/03/11 14:30:12 ID:???
返答遅れてすみません。色々試してました。 正規表現を逆にしてみたりPerlメモの文字コードの 正規表現を見ながら自分なりに書いていたつもりだった んですけど、上手くいきませんでした。 Unicode::Japaneseは315,392 バイトあるということで、 プロジェクトマネージャに却下されました。。。 色々とご教示いただき、誠に有難うございました。 もしも カタカナ->ひらがな変換に成功した際はこちらで 報告させていただきます。
64 :
15 :05/03/11 15:05:14 ID:???
>>63 よくわかんないけど、jcode.plですぐできるんじゃないですか?
jcode::tr(\$str,"ア-ン","あ-ん");
もしも半角カナもというならこれをやる前に
jcode::h2z_euc(\$str);
をやるだけ。
バイト云々ならlength関数とか使いながら一旦適度な長さに分割してそれからくっつける。
そういうルーチンを自分で作ればいいけど何か問題でもあるのかな?
65 :
15 :05/03/11 15:07:40 ID:???
追記 単に分割は危ないので、ちゃんと文字の区切りでやりましょう。 my @strings = $string =~ /[\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE]/og; これはeucコードでなくてはならないので先にeucに変換して下さい。
66 :
15 :05/03/11 15:21:57 ID:BXH5EoKa
あ、すみません。LWPで1ヵ所質問です。
# リクエストを作成します
my $req = new
HTTP::Request POST => '
http://www.perl.com/cgi-bin/BugGlimpse ';
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
今動作確認したらどうやら
$req->content('match=www&errors=0');
この値は自動的にURIエンコードしてくれてはいないみたいですが、
たとえば
hoge=あいうえお
なんて場合には自分で「あいうえお」だけエンコードしろっていう仕様なのでしょうか?
>>62 https以外で本名、住所書いたことないし。それもある程度有名なところ。
その他のwebで入力した情報は一般に公開したものと思ってるから気にしてないしそういうとこ個人情報は書かない。
4月から個人情報なんたらは始まるけどどうなんでしょうね。
LWPはhttpsでも問題なく使えるがそういう問題ではないのか? よくわからん。そもそも勝手に登録されたものなんて無効だよ。 気にする必要なし。
69 :
60 :05/03/11 15:39:38 ID:???
お願いします;
Perlって ー の文字がエラーになるって聞いた覚えがあるんだけど、EUCで書いてれば無問題?
eqとか==の演算子って$_をデフォルトで対象にしてくれないみたいですが、 そういうことをしてくれるモジュールってありませんか? for(0..4){ print "3回目" if 3 eq; } とかできると便利なんですけどね。
あっそ
aa... eq
76 :
nobodyさん :05/03/11 18:45:46 ID:stOV0FtX
こんなのは? print "3回目" if /^3$/;
横着したがるのもたいがいにせいよと
>>10 $value =~ s/\xa4\xa5/`/g;
$value =~ s/\xa5([\xa1-\xfe])/\xa4$1/g;
$value =~ s/`/\xa4\xa5/g;
>>10 ところで、ひらがな→カタカナの変換はあれで大丈夫?
$value = "ばぅばぅ";
$value = "靴が痛い";
こんなのが、ちとヤバイと思うのだけれど。
>>60 大抵は先頭だね。
でも、配布するモジュールでもなければ好きな所に書いていいと思うよ。
(それから、encodingは、エンコードを始める位置で宣言する必要があるはず。)
>>72 sub at($);
for(1..4){
print "3回目" if at 3;
}
sub at($){ $_ == shift }
# 意味不明な世界へようこそ。
80 :
60 :05/03/11 21:13:35 ID:???
>>79 やっと来た・・・・・
やはり先頭ですよね。でももしも間違って
100行目: use DBI;
.
.
.
700行目: use DBI;
とかしても表面上にはエラーにならないくらいだから、内部的にも何の問題もないんですよね?(encordingなどは別として)
use はコンパイル時に評価されるのでは? 実行時に評価されるのは require で。
>>80 useやrequireは何度呼び出しても問題にはならないことになっている。
モジュールを先頭で呼び出すのは分かりやすくする為にすぎないので、実際に使う分にはどこに書いても構わない。
モジュールの依存関係がわかりやすいように useは頭に並べておくのが良いと思います。
自分のサイトでだけ使うサブルーチンライブラリなんかで、 後からどんどんルーチンが増えていく時に、useだけルーチンから出しておくと、 何かと面倒。 なので俺は両方に書いてる。
Perlで会員制ネットショップのCGIを組むとします。 ログインとかログアウトってどうやるんですか? CGI::Session使えば簡単なセッションはできますが、相手のIDとPASSをセッションファイルに入れればいいのかな? なんかセキュリティ云々がよくいわれてますが、どちらにしても言うほどのセキリティなんか実装しようがないですよね。 つまりどのレベルまですれば一般レベルなのかということです。 CGI::sessionでセッションIDはクッキーに焼くことで渡し、セッションファイルにIDとパスを。 IDとパスが実在すればログイン状態。 ↑これはセキリティ的に足りないでしょうか?
>>86 ・IPの一致チェック
・cookieはディスクに保存させない
・可能ならSSLを使用
スクリプト作成者にできることはこれくらいでは。
それと、パスは保存する必要なしかと。
88 :
nobodyさん :05/03/12 02:35:22 ID:DLGfeKNq
すいません。四捨五入させなさいとはどう記述すればいいのですか?m(__)m
>>86 セッションで渡り歩かなくても済むような構成にしてしまうのも手。
渡り歩いた履歴はCookieに溜め込んで、最後のページでIDとPassを入力させて完了とか。
>>88 int()をちょいと工夫すればOK。マイナスには気をつけるよろし。
PerlMagickは初心者でOKなんかな。 透過PNGの出力ができないんだけど、仕様ですか? (透過しない) 透過GIFならできました。
>>88 $num>0 ? int($num+0.5) : int($num-0.5);
>>91 小数点切り上げもそれくらい短くすっきりとできませんか?
$num==int($num) ? $num : int(++$num);
その短いコードが何をやってるかぐらい理解しようや
>>60 ちょっといまさらだけど。
useは、通常の実行文ではなくて、コンパイル中に実行される文だから、普通は先頭。
例えば、
1 + 1;
use hoge;
2 + 2;
とか、書いてしまっても、
絶対にuseから処理される。
if(bool){
use hoge;
}
とか書いても、ifとか、そんな次元じゃなく、
1番最初にuseが処理される。
だから、普通は先頭に書く。
実行結果は、どこに書いても同じになるかもしれないけど、やっぱ普通は先頭。
スコープに影響するプラグマモジュールなら、話は別で、
適切な場所に書いておくよろし。
(ただし、この場合も実際にはuseは最初に処理されている)。
requireは、実行中に処理される普通の文なので、常に適切な場所が良いと思う。
でも、どこに書いても構わないなら、やっぱ先頭がいいなー。わかりやすいから。
97 :
nobodyさん :05/03/13 08:25:22 ID:oiuJgK8i
掲示板つくってるのですがログを読み込んで全部配列に入れて処理してます。 メモリやばいですよね?
>>97 ログの大きさにもよるが、負荷考えるならまず
書き込んだらhtmlに吐き出すタイプにしような。
パーミッションの変更はchmodで出来るけれど、 確認する方法はある?
ふつー chmod … || die
>>87 テンポラリクッキーを使うのですか?でもそれって相手側に協力を求める必要があるんですよね。
IPチェックはちょっと面倒ですが、ログイン時の人間であるかどうかを確認するとセキリティの向上には
なかなかの効果がありそうですね。
SSLは当然です^^
>>89 それだとちょっと利便性が落ちそうですね。
会員価格とかが実現しづらくなります。
あ、IPチェックも無理だ・・・・・
携帯は確か毎回違うIP提出してくるキャリアがあるんだった・・・・
remove関数
コーディングのスレじゃなくて perl全般の質問スレになったの?
うん。
>>109 でも、WebProgにあるのにActivePerlのインストール方法とか聞く奴がいるからなあ。
>>110 それはスレを分けても変わらないでしょ。
基本的にこの板内のPerl関係の質問は大抵同じ人間が回答してるんだから
個人的には分割することに意義を感じられないな。まあ既に分かれてるものを
無理してくっつける必要があるというわけではないけどさ。
確かに板自体がもうずっと人少な杉だし 回答者はどのスレでも一緒だろうな そろそろどっかとまた合併すんじゃね?
そもそもマとムとwebprogと分けるに至った経緯が知りたい。 ヲタク板なんて細分化する必要ないのになぁ。
ゲ製も別だし
ユーザ層が違うんだよ。
116 :
nobodyさん :05/03/15 10:01:02 ID:3Ik8WJWF
gzip圧縮転送についてですが tp://tech.bayashi.net/pdmemo/gzip.html これを/bin/gzipでなくCompress::Zlibでやりたいのですが open(STDOUT,"| $gzip -1 -c");の部分をどのように処理すればいいか 分かりません。どなたかご教授願います。
>>115 ユーザ層ごとに分けてどうするのよ。どうせ同じPerlだろ。
周辺関連に差は出るが、広い意見だったりちょっと関係ない知識までつくのが大手掲示板の利点でしょ?
CGIは作れるがwindowsで使える簡単なソフトは作れないなんていう人はこの板には結構いそう。
なんかもったいない。みんな一緒なら、知らずに目に入って付く知識で十分できるようになるのに。
って個人的な意見ゴメンね,(__),
>>115 が言いたいのはマ、ム、ウェブプ、ゲ製で
扱われる言語や話題のユーザー層が違うってことだろ
120 :
116 :05/03/15 11:56:36 ID:3Ik8WJWF
>>117 ご回答ありがとうございます。
教えていただいたwebに私のやりたい処理と似たような処理が紹介されてましたが
ちょっと違う感じです。スクリプト内部にprint文で書かれた内容全部をgzip圧縮させて
転送させたいです。スクリプトを貼り付けると、以下のような感じで処理したいです。
##の部分がうまくいきません。
#!/usr/bin/perl
use Compress::Zlib;
if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}
## ここで$bufferに<h1>Hello world</h1>以下の出力内容全てを代入したい
print Compress::Zlib::memGzip($buffer);
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaaa";
>>120 printした後は標準出力に渡されるのでPerlでは圧縮しようがないのだが。
パイプでつなぎたくなければ圧縮してからprintするしかなかろう
すいません。助けてください。 ID番号の出るスレッドに書き込みしたのですが どうしてもそのレスを消したい場合に方法はないのでしょうか? すごく困っています。絶対入れてはならないことをレスしてしまったもので・・
>122 どこやねwん
125 :
116 :05/03/15 13:03:28 ID:???
>>121 ご回答ありがとうございます。
tp://www.rfs.jp/sitebuilder/perl/02/08.htmlを参考にして子プロセスを作ることで出力を$bufferに代入することができました。
回答していただいた方々ありがとうございました。
参考までに成功したスクリプトを貼っておきます。(直したほうがいいところは指摘お願いします)
#!/usr/bin/perl
use Compress::Zlib;
if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}
if( open BUF, "-|" ){
while ($buf = <BUF>) {
$buffer = $buffer.$buf;
}
close(BUF);
print Compress::Zlib::memGzip($buffer);
exit(0);
}
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaa";
127 :
125 :05/03/15 13:06:21 ID:???
すいません。全角でインデントするのを忘れてました。 それ以外で直したほうがいい部分は指摘ください。
128 :
122 :05/03/15 13:31:20 ID:???
削除スレ教えていただきありがとうございます。 ですが、とてもじゃないけど、該当する項目がなくって無理でした。 というのが、自分の独り言を赤裸々にタイピングしてる途中に、 間違って「書き込む」のボタンを押してしまったんです。 しかも、人に知られたら恥ずかしいし、どうしようもない内容なんです。 で、IDが1日たっても変わってなかったってのもあって、きっと誰かが それに気付いて恥をかくか、煽りの的になるなーと思うと、もー気になって 気になってパニックしてます。書き込みは慎重に行うべきですね。
>>127 いや、全角インデントとかの話じゃなくてさ。
まあ好きにしてくれ。
>>128 というか何を血迷ってここに書き込んでるんだ?
Perlとどういう関係があるんだよ。
DBIでMySQLにつないでるんですが、例えばnameフィールドが重複してるデータだけ検索するのって可能ですか?
MySQLだけでは無理だと思うのでPerlでやるしかないと思うのですが、
name,age,mail
太郎,19,
[email protected] 次郎,28,
[email protected] ....
こういうデータからnameの重複文だけ表示させたいのです。
こういうのって1回ずつやらないといけないのでしょうか?
my $data = select 1番目のデータ取得
my @重複 = select 色々 where name=$data
みたいに。(変な書き方ですみません。)
dataの中から例えばメールアドレスが重複してるのがあるかないか、あるなら
それをすべて表示。
一発で
[email protected] という値がいくつ重複してるか、
[email protected] がいくつ重複してるかを調べたいのです。
>>131 全データのnameフィールドを取り出してハッシュで数えれば一撃。
134 :
48 :05/03/15 16:49:20 ID:???
>>131 >MySQLだけでは無理
普通にできますが
SELECT count(*) AS `count`, * FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
135 :
134 :05/03/15 17:01:28 ID:???
確認したらエラーが出たので訂正 SELECT count(*) AS `count`, `name` FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
>>131 対象列がnameからmailに変化してるのにワロタ
ム板の香具師にこのスレが低能集いスレに扱われている件について
>>125 見ただけでもヘッダのつき方が滅茶苦茶だと思う。
問答無用で圧縮されたものを送っているというのも。
139 :
138 :05/03/15 22:06:55 ID:???
おっと、ブラケットを読み間違えてた。ごめん。
>>137 どっちも見てる奴がほとんどじゃないの?
いや、でも誤読を誘発しやすそうなコーディングではあると思うよ。
143 :
138 :05/03/15 23:51:35 ID:???
腹が立ったので書き直してみた。 圧縮された内容にヘッダが付かないようにしたのと、 forkに失敗したときの対策。 my $pid; if ($ENV{HTTP_ACCEPT_ENCODING} =~ /((?:x-)?gzip)/){ my $encoding = $1; if ($pid = open(BUF, "-|")){ local $/; my $buffer = <BUF>; close(BUF); print "Content-encoding: $encoding\n", "Content-type: text/html\n\n", Compress::Zlib::memGzip($buffer); exit; } } if (not defined $pid){ print "Content-type: text/html\n\n"; } print <<"EOF"; <html> <head><title>test</title></head> <body><h1>Hello world</h1><p>test-test</p></body> </html> EOF exit;
if ($ENV{HTTP_ACCEPT_ENCODING} =~ m/((?:x-)?gzip)/ and open BUF, '-|'){ my $encoding = $1; local $/ = undef; print "Content-Encoding: $encoding\n", "Content-Type: text/html\n\n", Compress::Zlib::memGzip <BUF>; close BUF; exit; } print "Content-Type: text/html\n\n", <<"EOF"; <html> <head><title>test</title></head> <body><h1>Hello world</h1><p>test-test</p></body> </html> EOF
144 > 143 ? しかし local $/ = undef; っていいな、使える。 いままで気づかなかったよw コードはいいけど、HTML中途半端なのは何でかなw どうせ省略するなら title と p だけでいいのに。
>>144 圧縮する内容物にもヘッダが付きますが、必要ですか?
147 :
125 :05/03/16 08:48:11 ID:???
148 :
nobodyさん :05/03/16 11:21:44 ID:uAWX38vA
htmlファイルをopenして、その中のリンクを取り出し、アンカー名 URL、というふうにしたいのですが、 URL中に?があるときだけうまく取り出せません 念のためエスケープしてもうまくいきません たすけて 348 while ($main=~m/(<a href=\"(.*?)\">(.*?)(?: +?)?(?: +?)?<\/a>)/ig){ 349 $matc1=$1;$matc2=$2;$matc3=$3; 350 if ($matc2 eq $matc3){ 351 $main=~s/\Q$matc1/$matc2/; 352 }else{ 353 $main=~s/$matc1/$matc3 $matc2/; 355 }#if else; 356 }#while;
>>148 いろいろ無駄っぽw
$main =~ s{<a href="(.*?)">\s*(.*?)\s*</a>}{ ($1 eq $2) ? $1 : $1 .' '. $2 }eig;
あ、: $2 .' '. $1 か。
>>150 別にeqまでしなくていいでしょ。それならtitleとか考慮したら?
s{<a\s+.*?href="(.*?)".*?>\s*(.*?)\s*</a>}{$2 $1\n}ig;
> 別にeqまでしなくていいでしょ
え、なんで?
>>148 でそう書いてるなら、その条件で書くべきなのでわ。
どっからどこまでしたいのかなんてわからないよ。
あと、考慮するなら s オプションもつけとけば。
>>152 ごめん本人のコードは汚いから全く読んでないんだ^^;
日本語だけ読んだ。
ごめんよ〜。
> 汚いから
ワロタw
まあ
>>148 は参考にするよろし。
すみません、質問です。コードを書いて構文チェックしてみたらsyntaxエラーが出て、 色々と絞ってみると下記のコードがエラーの原因だと分かったのですが、どのように治せばいいのでしょうか? while ( my ($code, $ress) = each(%DATA{'expect'}) ) { } %DATA{'expect'}はハッシュのハッシュです。これを%DATAに変えてみるとエラーが出なかったので、 ハッシュのハッシュをeachにぶちこんでるのが何か悪いのかな、と思いましたが解決方法が分かりません。。 どなたかご教授して頂けると幸いです。
%{ $DATA{'expect'} }
157 :
97 :05/03/17 11:09:03 ID:???
>>98 はいwhileで1行づつ読み込んで処理しようと思います。ありがとうございます。
>>99 Flash用なのでテキストに書き出すことにしまふ。ありがとうございます。
158 :
125 :05/03/17 12:01:21 ID:???
再びの質問で大変恐縮なんですが、もう1つ教えてください。
>>143 のスクリプトでgzipの圧縮レベルを設定してみたのですが
Compress::Zlib::deflateInit( -Level => 1 );
という行を追加してCompress::Zlib::memGzip($buffer)の内容をファイルに書き出してみて
ファイルサイズを調べてみたのですが
-Level => 1の場合と-Level => 9の場合とでファイルサイズ変わんないのですが
使い方間違ってますか?
$bufferの中身はいろいろ変えてみましたが、やはり変わりませんでした。
159 :
nobodyさん :05/03/17 13:27:19 ID:+OmKbfyB
質問です。 多数のファイルを生成する際に、ファイル名としてユニークな名前がほしいのですが Perlの定石としてはどんな方法を用いるのでしょうか? timeからファイル名を作ろうかと思ったんですが、同じ名前になることもあるだろうし 通し番号を持つのも面倒だし、と思いまして。
160 :
とうかつ :05/03/17 13:38:35 ID:ZeP4drG9
perlのファイルアップロードに関する質問です、よろしくお願いします。 HTMLの<INPUT type="file">フォームで指定したファイルをcgiと同じ場所にアップロードしたいと思っていますが、 どうしても成功しません。、以下に関連ソースを書きます。 ●フォームHTMLの中の記述 <FORM> <INPUT type="file" name="pic_file_name" size="80"> <INPUT type="button" value="写真の追加" onClick=doAddPic()> </FORM> ※この<FORM>〜</FORM>内に他に多数の<INPUT>あり。 ●フォームHTMLのJavaScript記述 <SCRIPT language="JavaScript"> <!-- function doAddPic() { document.Form.action = "./pic_upload.cgi"; document.Form.method = "post" document.Form.enctype= "multipart/form-data"; document.Form.submit(); } //-->
161 :
とうかつ(続き) :05/03/17 13:39:20 ID:ZeP4drG9
●pic_upload.cgi use CGI; my ($buffer); $CGI::POST_MAX = 1024 * 1000; # max = 1MB # オブジェクト作成 my $query = new CGI; my $file_handle = $query->upload('pic_file_name'); # ファイル保存 my $save_name = "UploadFile.xxx";# 名前は仮 open (OUT, ">$save_name") || die "Can't open Savefile!"; binmode (OUT); while(read($file_handle, $buffer, 1024)) { print OUT $buffer; } close (OUT); close ($file_handle);
162 :
とうかつ(続き) :05/03/17 13:39:57 ID:ZeP4drG9
・cgiは最後まで正常に走る。 ・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。 ・途中 print "$file_handle"; としても何も出力されない。 ・クエリーname 'pic_file_name' でファイル名は送られている。ほかのINPUTデータについても正常に送られている。 ・フォルダの権限は777 ・perlのバージョンはv5.8.0 apacheは自分でインストールした物ですので特別な設定が必要だったらかけている可能性も考えられます。 もし可能性がありましたら教えて下さい。 何とか動かしたいと思っていますのでご支援お願いします。
>>159 定石とか知らんけど
my $file = time();
while (-e $file . '.txt') { $file++; }
$file .= '.txt';
とかじゃね?
>>163 それだけだと危ないよ。
>>159 1個のプロセスがファイル作成関連処理のをしている間は
他プロセスにはさせないようにしれ。
>>162 >・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
>・途中 print "$file_handle"; としても何も出力されない。
もう答えは出てるじゃん。アホ?
>>164 じゃあ一旦 temporary.txt に書き出した後、
>>163 でチェックして rename するとか。 ダメ?
>>160 まず不必要でしかも微妙そうなそのJavaScriptをやめてみるとこから始めてみるのはどうだろう?
168 :
とうかつ :05/03/17 14:11:41 ID:ZeP4drG9
>>167 早速やってみました、JavaScriptを抜いた普通のHTMLでやってみましたところ
正常にアップロード出来てしましました、ありがとうございます。
それはそれでまた困ったな…submitボタンの区別が出来ない…
>>166 誰やねんおまえは。159か?
普通に排他処理使って特定ファイルを開いてる間に本処理をやればいい。
>>168 お前はこのスレ以前の問題なんじゃないか?
>>169 JavaScriptは別の所で質問させていただきますね
>>159 Perl の定石はしらないけど、漏れはいつも djb 風に、
sprintf("%d.%d.%d", time(), $$, $uid++);
みたいなのを使ってます ($uid はプロセス内で unique になる数字) 。
ファイルシステムをネットワークで共有している場合は、
さらにこれにホスト名も付けます。
>>168 できたのかw
で、なんで submitボタン〜 とか考える必要があるの?
というか type="button" で submit させる方がいかがなものかと。
とりあえず class と CSS で指定しとけば 「区別」 はつくんじゃないの?
>>169 いやファイルロックの話じゃなくて、ユニークなファイル名をつけたい、って話なのだよ。
>>172 だからAというファイル名がユニークであるか確認してからAというファイルを新規に作成
するには排他処などで他のプロセスをとめないいけないんだよ。
もしかして新規作成するファイルをロックするとかいう勘違いしているのかな?
174 :
48 :05/03/17 16:24:48 ID:???
>>174 ・・・・あなた俺より詳しいじゃない。
個人的には48はこのスレで一番まともな回答者だと認知している。
なのであなたに「どうでしょうか」といわれるととても恐縮だorz
なんか鬱だな・・・
176 :
nobodyさん :05/03/17 17:01:32 ID:Ykle1A6k
現在いるページ(〜.cgiのperlのページ)がhttpsかhttpか否かをしるためには、 どうすればいいのでしょうか? なお、サーバはApacheです
>>175 ひとつのプロセスで複数のファイルを作る場合は、
time + ランダムな文字列(a-z..A-Z..0-9)数桁
でやってます。
100%名前が重ならないとは言えないけど、
仮に6桁の文字列を付加したとして、1秒に10個ファイルを作成した場合でも、
各ファイル名の重なる確率は約568億分の1
$time = time
@key = ('a'..'z','A'..'Z','0'..'9');
1 while (length($keys .= $key[rand(@key)]) < 6);
↑みす途中でおくっちゃった $name = time; @key = ('a'..'z','A'..'Z','0'..'9'); 1 while (length($name .= $key[rand(@key)]) < 16);
179 :
171 :05/03/17 17:47:25 ID:???
あ、そうそう、漏れはちょこっといじったことしかないんだけど、 本格的にやるなら Data::UUID を使うという手もあるかもしれません。 大袈裟過ぎるかもしれませんが。
2chのスレからデータを取得して、四桁の番号(全角も半角も)があるスレを抜き出すスクリプトを作っているのですが マッチの誤動作防止のためにEncodeのdecode関数を使っているのですが処理がこれでもかと言うほど遅くなってしまいます。。 どなたかもっと早く処理できる方法をご存じでしたら教えて頂けないでしょうか。
181 :
159 :05/03/17 20:47:11 ID:???
うーん、いろいろな方法があるんですね。 一意的な方法があるのかと思っていました。 今回使うファイル名はそのままURLになるので、単純なモノを使いたいと思います。 あと、これは興味本位なんですが2chのスレッド名に使われている方法はどんな方法なんでしょう?
>>180 うーん、マシンをもっと速いのに替えるとか
でもそんなに遅くなる? 俺んちの自宅鯖だと1Mbyte decode するのに0.3秒ぐらいだけど
>>181 There's more than one way to do it が perl の哲学だからな
2ちゃんねるのスレッドURLは unix timestamp
だから同一時刻に複数スレッドが立つと同じURLになってしまう
これを避けるために1秒に1スレしか立てられないよう排他処理をしているはず
>>158 Compress::Zlibのソース見ると、圧縮レベルを決め打ちしているので、
gzopen(),gzsetparams()を使うしかないと思われ。
>>183 > これを避けるために1秒に1スレしか立てられないよう排他処理をしているはず
仕様が変わっていなければの話だけど、
既に同じ番号のスレがあるときは+1して同じスレがあるかを再度チェック。これを繰り返してる。
>>184 漏れの環境 (Linux + perl 5.8.4) で実行させてみたが、どっちもすぐ終った
CPU時間でsjis版が0.199秒、utf8版が0.258秒
>>186 そう、排他処理が不完全で、二つのスレが合体するという問題が起きていた。
昔の話だけど。
>>184 WindowsXP + perl 5.8.4 + CPU 700 (w で、 utf8 : 0.52 , shiftjis : 0.27 だった。
まー、UTF8 経由する分、ある程度は遅くなって当前なのでは?
あの、教えてください。 今、言語覚えようとはじめたんですが、 エディタをテラパッドに決め手 プログラムを打ち込んだのですが プログラムはどうやって動かして確認するんですか? winXPです。
「初めて CGI Perl」とでもしてぐぐれw
悪意の妨害者(プロセス)がいると仮定した場合の排他制御はどうする?
えーーと・・・・・・何で排他制御の話になったんだっけ?
自分のPCをサーバーにしないといけないみたいですね。 独学が大変なのはわかりました^^;
や、ブラウザで見るんじゃなくて、コマンドプロンプトで Perl 使うくらいだったら、サーバ立てなくてもいいんじゃない? まー 「サーバ立てる」 つっても、Apache (か Httpd とか) インストールするだけだし、実際やってみると思うよりは簡単だと思うけど。
俺みたいなスクリプト小僧にならないでね
199 :
184 :05/03/18 06:37:22 ID:???
>>187 >>190 テストして頂いて恐縮です。僕の実行環境に問題があるみたいですね。。
僕の環境だとutfが二分ちょい、shiftjisが数秒です。(Athlon XP 2500+)
Perl入れ直したりしてみます。どうもありがとうございました(_ _)
200 :
nobodyさん :05/03/18 07:56:29 ID:YtF+f69M
perlで自動登録リンクのようなものを作っています。 登録後にメールを送る処理をするのに、次のように書いています。 メールは送られるのですが、なぜか一部の文字が化けてしまいます。 上の例だと「貼」、「構」あたりで化けてしまいます。 文字コードの関係で漢字が化けてしまうのでしょうか? 他の部分は化けていません。 解決策や原因がわかる方がいたら、教えてください、よろしくお願いします。
201 :
200 :05/03/18 07:57:55 ID:???
#メール送信部分 sub mail_send{ my $temp=$_[0]; my $mail; if ($m_sendtome){$temp.=" , $m_mailad";} $mail = "To: $temp\n"; $mail .="From: $m_mailfrom\n"; $mail .="Subject: $_[1]\n"; $mail .="Errors-To: $m_mailad\n" if $m_sendtome; $mail .="Content-Transfer-Encoding: 7bit\n"; $mail .="Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n"; $mail .=$_[2]; &jcode::convert(\$mail,'jis'); open (OUT,"| $sendmailpath -t") || die &error("sendmailが使用できませんでした。"); print OUT $mail; close (OUT); } # メール本文 sub mail_ok{ return <<EOD; 登録が完了しました。下記のタグを貼り付けてください。 必要のない方は貼り付けなくても構いません。 署名 EOD } #メインの中でmail_sendを実行 &mail_send($mailadd,$honbun,&mail_ok());
202 :
200 :05/03/18 07:59:27 ID:???
また、なぜか送信メールの改行が mail_ok の中の改行と違って1行になってしまいます。 原因・解決策わかる方、よろしくお願いします。
203 :
158 :05/03/18 08:03:13 ID:???
>>185 変更できないようにされてたんですか。。残念です。。
調べて頂いて有り難うございました。
>>159 普通は、
use Fcntl;
...
my $name;
do{
$name = 適当に生成;
} until(sysopen(FH, $name, O_WRONLY|O_CREAT|O_EXCL));
...
close(FH);
みたいな感じ。
O_EXCLを使うことでファイルオープンとファイルの存在確認をアトミックに行えるところがミソ。
sysopenではなく、FileHandleまたはIO::Fileモジュール使うことが多いけど。
クックブックのレシピ「一時ファイルを作成する」を参照のこと。
もうちょっと複雑な処理が混ざったり、sysopen()やモジュールを使いたくないなら、
処理をきっちり排他制御する。
>>201 貼にx5Cが含まれているからでしょうね
return <<'EOD';
とシングルクォートでエスケープされないようにしたらいいかな
それとメールのヘッダーの改行は\r\nと決められてます。\nでも動作するようですけど。
206 :
200 :05/03/18 08:32:51 ID:???
>205 そういう風にしないとだめなんですね。 \nも直しました。 そしたら、文字化けが直りました!!! なのですが、行数の関係で、実は省略してあったのですが、 sub mail_ok{ return <<EOD; 登録ID : $_[0] 登録が完了しました。下記のタグを貼り付けてください。 必要のない方は貼り付けなくても構いません。 署名 EOD } などとして、引数を含めています。 returnで返す前に、普通に変数に入れてから返したほうがよいでしょうか? それとも、他にこの中でそのまま変数を表示させるよい方法があるのでしょうか? 重ね重ねすみませんが、可能かどうかだけでも教えてください。 よろしくお願いします。
>>206 じゃあ文字化け文字に\をつける
sub mail_ok{
return <<EOD;
登録ID : $_[0]
登録が完了しました。下記のタグを貼\り付けてください。
必要のない方は貼\り付けなくても構\いません。
署名
EOD
}
208 :
200 :05/03/18 08:48:48 ID:???
あぁ、できました!! 漠然と中の文字がおかしいんだろうと思ってたものの、 原因がわからずに他のとこをいじったりして、ずっと悩んでました。 これでうまくいきそうです。 原因がわかったので関係するサイト等をぐぐって勉強してきます。 ほんとにどうもありがとうございました。
教えてください
webページをhttpダウンロードしてくるプログラムを作りたいのですが、参考に
http://x68000.q-e-d.net/~68user/net/http-2.html をコピペして実行すると、
print SOCKET "GET /index.html HTTP/1.0\r\n";
で止まって進まなくなります。
winME時代に同じことしたときは動いた覚えがあるので、
winXPのファイアウォールとウィルスセキュリティのファイアウォールを切ったのですが、まだ変わりません。
ほかにチェックする場所はありますか?
winXP sp2+perl 5.005_03+コマンドラインから実行中です。
210 :
209 :05/03/18 20:33:20 ID:???
すいません、サーバーにうpすると動くので、サンプルは間違ってないと、多分思います。
バカか
ヽ/⌒ヘ~ ,、 ., 't,_,ノ丶 (__,\、 r'~゙i、 ばっかでーす♪ / ! '` / ● ⌒ ヽ,、\, (〇'゙ l__/ ● | `〜 〜 △v i、_,゙i し'i ゙〇ノ L,_il 厦 ゙゙ー| ii r'゙\/゙i,~、 ∧∧∧ | " ij ノ/゙、/ ( ) ,;、 > ゝ~゙ ゝ ソ ~ T ~ 、(_/ (,,/ <ヽ | //
213 :
nobodyさん :05/03/19 12:39:33 ID:VZlT0CLh
perlで画像の加工方法について質問です。アップロードした画像(bmp,jpg,gif)のサムネイルを自動作成しようと思っています。 perlは画像加工に弱いとのことで、調べてみた結果imagemagicというものをインストールするという手があるようですが、 しかし恐らくソースコードを置くだけのライブラリならともかく、稼働先でインストールのようなことは出来ない可能性があり 他の手段を探しています、何かメジャーな手はありませんでしょうか?
214 :
nobodyさん :05/03/19 13:26:09 ID:a8Nv17ZI
@saveという配列の中にある変数$textに文字を入力(代入?)してもらって保存 ↓ また$textに別の文字を入力、『$textに入力された文字群』というくくりの中で、上のとは別の文字として保存 この保存した二つの文字を取り出して 『$textに入力した文字群から●を抽出し、@save内の変数$plusを付加する』 ……というのは可能でしょうか? 『$textに入力された文字群』というくくりの中で、上のとは別の文字として保存 この動作が、どう書いたらいいものか解らなくて…
>>214 チミはperlの前に日本語を勉強すべきだ。何を聞きたいのかまったくわからん。
フォーマットを使っているのですが、内部的にUTF8のモードで使うと二バイト文字も@バイト文字も どちらも同じ大きさ?だと解釈されてしまって結果的にちゃんとフォーマット通りに出力されません。 どなたか解決方法を教えて頂けると嬉しいです。。
おかしいな徹夜明けだから日本語がうまく理解できないよ
218 :
nobodyさん :05/03/19 15:08:22 ID:a8Nv17ZI
>215 $textっていう変数に文字や数を複数回代入 その文字や数の中から特定の文字を検索する という作業です
>>216 「フォーマット」 の意味がわからんw
>>218 @save = ( 'かくかく $text しかじか', 'あれこれ $text どれ●これ');
$text = 'ほげ●はげ';
foreach (@save) { s/\$text/$text/; }
したあと、
$plus = 'ひげ';
foreach (@save) { s/●/$plus/; }
ってこと?
でも 「●」 が $text 内にあったのかどうかは区別できないし、って?
さっぱりわからんw
同じプロセス内でやるなら、テキストに使われない文字でマークアップしとけばいいんじゃない?
なんかもの凄いアホが来てるな。 もっとわかりやすく言わないとだめだよ。君の質問をイチイチ時間かけて解釈してまで 回答してくれるひとは滅多にいないから。 さぁもう1回頑張ってまとめてみなさい。
>>214 $textの中から任意の文字列を取り出したいだけでしょ?
my ($new_text) = $text =~ /任意の文字列正規表現/;
>>216 my $kanji = "あああ青春の歌";
format STDOUT =
@<<<<<
$kanji
.
write;
これをこのままで実行すると「あああ」という結果が得られて、
use encodingなんかを使うと「あああ青春の」になるという話だとしたら、
フォーマットを書き直した方がいいと思うけど。
224 :
216 :05/03/19 16:08:00 ID:???
>>219 Perlのformat機能です。
>>221 ありがとうございます。私も初めて使いました。少し必要になったので。。
なるほど。UTF8を一回shift_jisなどに変換して処理するという手もありますね。
>>223 わかりにくくてすみません。大体そんな話しなんですが、
format STDOUT =
@<<<<<<<@<<<<<<<に
'てすと','てすと2'や'tst,'tst2'をぶち込んだときに、
どちらも二つの要素の間の半角スペースの数が同じになってしまうので
フォーマットに一貫性が無くなってしまうんです。
つまり、'てすと','てすと2'や'tst,'tst2'を先ほどのフォーマットに入れると、"
てすと てすと2
tst tst2
となってしまうんです。use encodingしてない時みたいに
てすと てすと2
tst tst2
(半角スペース二個を全角一つに置き換えてます。)となって欲しいんですが。。(等幅フォントじゃないと分かりにくいかもです。)
>>224 Shift_JISと仮定して書いてみた。
use encoding "shiftjis";
use Encode;
my @str;
format RAW_FORM =
@<<<<<<<@<<<<<<<
map{ encode("shiftjis", $_) } @str
.
open(RAW_FORM, ">&STDOUT") or die $!;
binmode(RAW_FORM=>"raw");
@str = qw(てすと1 てすと2);
write RAW_FORM;
@str = qw(tst tst2);
write RAW_FORM;
close(RAW_FORM);
exit;
かなり強引。
227 :
216 :05/03/19 18:43:12 ID:???
>>225 出来ました。。随分時間掛かってたので嬉しいです。
ありがとうございました〜(_ _)
228 :
218 :05/03/19 18:44:09 ID:???
すみません。うまく書けません。日本語も不自由ですが知識もないせいだと思います…orz ●は便宜上の記号でした。 もう最初書いたのから掛け離れてるんですが、やりたかったのは @saveの中には$textと$plusと$rimitと$resultがある $textが設定されたテキストフィールドに『ほげ』と入力すると、 datファイルに『ほげ』が保存される 処理A------------------------------------------------ $rimitが100に達した時、$result = $text . $plusみたいな感じで$textと$plusが連結 $resultがdatに保存される ----------------------------------------------------- $textに改めて文字『ほげ』が入力される→datに保存される ※最初の『ほげ』とは別物として認識させたい 二度目の『ほげ』が処理A後$resultとしてdatに保存される時、 前回の『ほげ』と見分けがつかなくなるので $plusは00、01…のようにナンバリング等で別々の値にしたい $textに二度目以降文字が入力された時、datに保存されている$textの値が 上書きされるのかされないのかがまず判らなくて悩んでいた次第です ホントすみません…
あれ?昼に徹夜明けで帰って さっきまでたっぷり寝たのに日本語がわかんない 今度は寝すぎかな?
理解不能 理解不能
>>228 はとりあえず要所要所スクリプトで例書いてごらんw その方わかるかもw
いや、もういいです つまんないネタになるだけだと思うので お邪魔しました
自分の日本語がおかしくないとでも言いたげだな。
まあまあ。(*´∀`)ノ
while (1) { print "Hello Unko World!\n"; }
"unknown world" と "unko world" は若干似ている
つ●
>>228 datファイルに書き足していきたいだけだろ?
ファイル操作のあたりを調べてみなさい。
それとテスト環境を作って自分で色々試しなさい。
どうせサーバーで直接試してるんだろうから。
241 :
nobodyさん :05/03/20 13:14:23 ID:RNFnJUaq
perlでCGIを作成しております。手元のWindowsXP+Appache+Perlで開発& 動作確認後、サーバーにアップロード、という手順で開発してるのですが、 perlスクリプトの一行目のperlスクリプトの指定を、 #!c:/Program Files/perl/bin/perl から、アップロードの時だけいちいちサーバのパス指定に合わせて #! /usr/local/bin/perl と書き換えています。結構面倒だし、変更を忘れてエラーになることも しばしばです。何かスマートな方法があるのではと思ってるのですが、 アドバイスいただければ幸いです。
C:\usr\ に perl インストールすればいいよ。俺はそうしてる。
>>241 Apache 1.3.xなら、.cgiの拡張子をPerlに関連付けすると、
シェバングパスを無視して実行してくれる。
私はそうしてる。
俺漏れも
246 :
nobodyさん :05/03/20 17:22:51 ID:Z0GAs5yv
Perlで設定ファイルを編集する、という処理をしています 編集画面はしっかり編集されるのですが編集を実行すると $params{'body'}の値が数字になってしまいます $params{'body'}の部分にはタグも表示できるようにしてあるのですがそれが関係しているのでしょうか 三日三晩眺めてみてもどうしてもわかりません… ご教授お願いします。
sub top { my $kugiri = "<<>>"; if ($params{'pass'} ne $pass) { &error("パスワードが違います"); } # 編集 if ($params{'c'} eq "topedit") { if (!$params{'body'}) { &error('入力がありません'); } $params{'body'} =~ s/\r\n/\n/g; $params{'body'} =~ s/\r//g; $params{'body'} =~ s/\n/<br>/g; $params{'body'} =~ s/&/&/g; $params{'body'} =~ s/</</g; $params{'body'} =~ s/>/>/g; $params{'body'} = ~s/"/\"/g; open(OUT,">setup.dat") || &error("setup.datを開くことができません"); print OUT "$params{'body'}$kugiri$params{'title'}$kugiri$params{'text'}$kugiri$params{'bgcolor'}$kugiri$params{'link'}$kugiri$params{'vlink'}$kugiri$params{'alink'}$kugiri"; close(OUT); # 完了 &head; print "<b>設定完了</b>\n"; &footer; exit; }
open(IN,"setup.dat") || &error("setup.datを開くことができません"); $file = <IN>; close(IN); ($body,$title,$text,$bgcolor,$link,$vlink,$alink) = split(/$kugiri/, $file); $body=~s/<br>/\n/ig; $body=~s/&/&/g; $body=~s/</</g; $body=~s/>/>/g; $body=~s/\"/"/g; &header; print <<"EOM"; 編集<br> <form action="$cgi" method=post> <input type=hidden name=pass value=$params{'pass'}> <input type=hidden name=mode value=top> <input type=hidden name=c value=topedit> <textarea name="body" rows="10" cols="50" istyle="1">$body</textarea> <br> $title,$text,$bgcolor,$link,$vlink,$alinkのinputフォームは割愛<br> それときったないソースでスマソ <input type=submit value=送信> EOM &foot; exit; } sage忘れスマソ…_| ̄|○
勘で、この行のイコール直後のスペース >$params{'body'} = ~s/"/\"/g;
>>246 せっかくPerlには便利なデバッガが付いてるんだから、使わないと損だよ。
三日三晩眺めてた、って。
CGIならその場で環境変数とか設定したらいいから。
ありがとう、本当にありがとうございました_| ̄|○<ヤットネラレル… こういうポカミスって気付かないものですね >250 Σ(´д`)それがありましたね 今度からはしっかりそれ試してます… ではありがとうございました
>>251 Data::Dumperを使うとかさ。
253 :
nobodyさん :2005/03/21(月) 18:10:57 ID:3f95qFz7
配列の要素の値でソートした結果のインデックスが欲しいのですが、 何かよい方法はありますか? 具体的に言いますと、 $aaa[0]='bb'; $aaa[1]='aa'; $aaa[2]='cc'; を各値で昇順ソートし場合、@result=(1,0,2) という結果が欲しいのです。 下記のコードでは、それらしい結果は得られるのですが、確信が持てないのです。 $aaa[0]='bb'; $aaa[1]='aa'; $aaa[2]='cc'; $xxx[0]=0; $xxx[1]=1; $xxx[2]=2; @result=sort {$aaa[$a] cmp $aaa[$b]} @xxx; よろしくお願いします。
>>253 @result = sort{ $xxx[$a] cmp $xxx[$b] } (0..$#xxx);
@result = sort{ $xxx[$a] <=> $xxx[$b] } (0..$#xxx);
255 :
254 :2005/03/21(月) 19:50:42 ID:???
頭が回ってなかった。 my @result = sort{ $aaa[$a] cmp $aaa[$b] } (0..$#aaa);
256 :
253 :2005/03/21(月) 21:05:55 ID:???
>>255 なるほどねぇ〜。
どうもありがとうございました。
停滞警報!? 板移転してますよ、お前ら様!?
突然、どうしたのこのスレ?
260 :
nobodyさん :2005/03/26(土) 09:17:47 ID:pZwBUwH2
age
春厨大発生のこの時期に荒れてないのは喜ばしいことじゃないか。
262 :
nobodyさん :2005/03/27(日) 02:19:06 ID:eF4YrThJ
aからzまでの文字を、 aaa aab aac aad ........ zzx zzy zzz のように上から舐めていくのってどうすればいいですか?
for $x( 'a'..'Z'){ for $y('a'..'z'){ print "$x$y\n"; } }
my $str = "zz"; while (++$str =~ /\A[a-z]{3}\z/) { print "${str}\n"; }
>>262 for ('aaa'..'zzz') {
print "$_ ";
}
267 :
262 :2005/03/27(日) 10:17:27 ID:???
別に、たいしたことじゃない。 perlだけに時間さくわけにもいかんしな。
↑262 => 263ね。
おいおまいら、正直に言え。 人にラクダ本すすめといて自分で読んでないやついるだろ!
263と264は間違いなの?
>>270 perlだけに限らんけど、
there's more than one way to do it.
'aaa'..'zzz' つー記法はperlってこんなこともできるんだよスゲー、て紹介の仕方で良く引用されてるような。
272 :
264 :2005/03/27(日) 19:02:20 ID:???
>>266 すみません、読んだつもりだったんですが、「TMTOWTDI」しか頭に残ってませんでした。
>>269 読んだんだけどホンダアコードの話しか頭に残っていない
俺はボロボロになるまで読んだ。
俺は読んでボロボロになった。
持ってるけどほとんど読んでないorz
最近はphpばかりでCGIではPerl使わないしなぁ。
'aaa'..'zzz'はちょっと感動。
試しにベンチ取ってみた。
Benchmark: timing 10000 iterations of A, B...
A: 3 wallclock secs ( 3.24 usr + 0.01 sys = 3.25 CPU) @ 3076.92/s (n=10000)
B: 2 wallclock secs ( 2.16 usr + 0.00 sys = 2.16 CPU) @ 4638.22/s (n=10000)
A=
>>263 B='aa'..'zz'
277 :
nobodyさん :2005/03/28(月) 03:16:21 ID:kLN9+ZWU
perlでHTMLのソースを表示するプログラムを作りたいんですが、 いろいろ調べたけどわかりません。 socketとか使うんすかね? ちなみにサーバーは@niftyです。 もしやsocketのせい?
>>277 @niftyのせいです。あそこはな、(ry
データ重複チェックについて質問です。 ID(例えばdiaryとかtalkとか)を自由に登録・ID自体の編集もできるスクリプトになっています 実質カテゴリわけとかそんなかんじでしょうか。 open(IN,"$setup") || &error("開けない"); while (<IN>) { ($id,$disp) = split(/,/); if ($id eq $in{'id'}) { &error('存在するIDです'); } } close(IN); 今は上記のようになっていますがこれですと 今編集しようとしている$setup内の行がマッチしてしまうわけで。 何か良い記述方法はないでしょうか?
意味ふめ。 open(IN,"$setup") || &error("開けない"); これなら読み込みしかできない。$setupのファイルは編集できない。 while (<IN>) { ($id,$disp) = split(/,/); if ($id eq $in{'id'}) { $flag=1; &error('存在するIDです'); } } close(IN); if ($flag == 1) { open(OUT, ">> $setup") or die $!, "\n"; print "$id\t$disp\n"; close OUT; とか。
もち、flock処理なども必要。
スマソ、かなり説明不足だった。
・データファイルは
2,説明,
1,説明,
のようになっていて、複数登録が可能になっている(別サブルーチン)
・ID(変数は$id),説明($disp)をフォームから編集可能にしたい
例えばID2を1にする場合にはエラー,2を2のまま編集する場合はエラーは出さないようにしたい
・現状だと編集中のIDがマッチするためエラーが出てしまう
・編集中のID以外をマッチさせる方法はないか?と考えたが上手い記述が見つからず
・スクリプトの記述方法は某有名所にかなり依存
・排他処理関係の関数は抜かし、他も簡略化しつつソースを晒してみた
ttp://yu.to/perl/up/id.txt 281氏の書き方だとflag==1の時、つまり同IDがある時編集可能になっちゃいますよね
ロックして行数覚えとけば?
>>283 つーか何がしたいのかわからんのだが
IDと説明を入力させるんだろ?で、
・ID が存在しなかったら登録
・ID が存在したら説明を上書き
ってことか?しかしそうなると
>・ID(変数は$id),説明($disp)をフォームから編集可能にしたい
> 例えばID2を1にする場合にはエラー,2を2のまま編集する場合はエラーは出さないようにしたい
>・現状だと編集中のIDがマッチするためエラーが出てしまう
>・編集中のID以外をマッチさせる方法はないか?と考えたが上手い記述が見つからず
ここらへんが意味不明なんだが
・絶望的に説明が下手 ・要求仕様自体がバグってる のどっちかな気がする。
>>279 赤ラクダに相当するのは、青ラクダ+クックブックだ!
つべこべ言わず4冊読破汁!
学習コストの高い言語ですね。
レスありがとう >・絶望的に説明が下手 たぶんこれだなorz こちらのしたいことが明確に伝わらなくて申し訳ないです >・ID が存在しなかったら登録 はまあ合ってるんだけど >・ID が存在したら説明を上書き はちょっと違うかな ID自体も編集できるようにしたいのです(説明はたんなるオプションでしかないから) ※ ユーザーアカウントをWEB上で登録・編集・削除したい…みたいな。 イメージとしてはそんなかんじです。 そういうアカウントとかだと登録はもちろん編集する時もIDについては重複させるわけにはいかないので。 >284氏に助言いただいたこともあるのでもう一回組みなおしたりググったりしてみます
ID自体を編集、て結局新しい ID を登録してるのと変わんないんじゃないの?
>>289 当然といえば当然なんだが、idが変更されたかどうかを知るためには、
以前のid・新規idの2つがスクリプトに渡されなければならない。
ID が編集可能という時点で ID が identifier としての役目を果たさないわけで。 データ構造の設計から見直した方が良いんじゃないですかね?
293 :
nobodyさん :2005/03/28(月) 19:55:25 ID:TfqpURTV
ラクダ本まるまるUPしたらやっぱ捕まるの?
>>293 釣りか?聞かなくても奥付見りゃわかるだろ。
>>292 Larry没後50年まで生きてください。
>>280 やっと分かった。
IDは使われていない番号への変更が可能ということなんだ。
すっきり。
データ構造とファイルの扱いが分からないので、簡単に。
編集=新しいIDの登録+古いIDの削除。
または、IDをただのデータとして扱ってIDを書き換える。
便所の落書き ラクダ本とやらを見に行ったらすんごく面白かった。 学生には高すぎるよorz
図書館で借りろ。俺はそうした。
300 :
280 :2005/03/29(火) 19:10:54 ID:???
うお。こんなにレスが…ありがとうございます本当に。 至らない所が多々ありすみませんでした。 最初からそう説明してればよかったのか。 結局、297氏の案+αで自分のやりたいことができるようになりました。 もちっとスキルアップしてきますorz それでは、スレ汚し失礼しました。
すいません、push(@result{'minus30'}, $name);ということって不可能なのでしょうか?
302 :
301 :2005/03/29(火) 21:44:57 ID:???
言葉足りずでした。push(@result{'minus30'}, $name);とするとエラーが出てしまうのですが、 @result{'minus30'}->[]という無名配列にpush出来る方法ってないでしょうか?
push @{$result->{minus30}}, $name;
304 :
301 :2005/03/29(火) 22:10:40 ID:???
ありがとうございます。なるほどこうやれば良いんですね、出来ました! ここら辺についての理解が怪しいので、もう一回勉強してきます〜。
スカラーのリファレンスのリストを引き数で渡すと 一気にデリファレンスしてくれる関数が欲しいのですが 他にも方法があったら教えてください。 #一括デリファレンス関数の定義 sub list:lvalue{@_?(${$_[0]},list(@_[1..$#_])):@{[]}} #以下使用例 @a = \($a,$b,$c,$d,$e); if($case){ (list(@a)) = qw(aa bb cc dd ee); }else{ (list(@a)) = qw(AA BB CC DD EE); } print "$a,$b,$c,$d,$e";
>スカラーのリファレンスのリスト @a = (\$a,\$b,\$c,\$d,\$e);
>>305 お前の釣り針に長靴引っ掛けるクマ・・・・・
>他にも方法があったら sub list:lvalue{@_?(${+shift},list(@_)):@{[]}}
長靴だけだった...クマめ...orz
>>305 プロトタイプ宣言したほうがいいんかも。
てか、lvalueってPerl5.6以上限定だね。
sub list(@):lvalue{@_?(${+shift},list(@_)):@{[]}}
@a = \($a,$b,$c,$d,$e);
if($case){
(list @a) = qw(aa bb cc dd ee);
}else{
(list @a) = qw(AA BB CC DD EE);
}
print "$a,$b,$c,$d,$e";
313 :
312 :2005/03/31(木) 08:27:17 ID:???
ちなみに動かして表示される内容は次のようなものです。 よろしくお願いします…。 MSN 2.0 (01/21/2005) Rev: 84 - Checksum: 60068-NS18164-SB8878 SERVER ERROR : Authentication Error: No response from Passport server ERROR : Trying to print 'PNG ' on an undefined socket Caller trace: 0: MSN::error (MSN/Notification.pm, line 102) 1: MSN::Notification::error (MSN/Notification.pm, line 189) 2: MSN::Notification::_send (MSN/Notification.pm, line 519) 3: MSN::Notification::ping (MSN.pm, line 669) 4: MSN::do_one_loop (echobot.pl, line 44)
314 :
312 :2005/03/31(木) 08:30:28 ID:???
あ、あと関係ないかも知れませんがMSNmessengerのバージョンは7.0(BETA)を使用しています。 質問がスレ違いならよろしければ該当スレに誘導して頂ければありがたいです。すいません。
ImageMagickを使ったサムネイル作成機能つき画像アップローダを作ってるんですが 軽い画像(5kb程度)なら上手くいくものが重い画像(10kb以上)になると 動作しなくなってしまいます。 ・アップロード&保存 軽い画像→OK、重い画像→OK ・アップロード&保存&ImageMagick処理 軽い画像→OK、重い画像→× ・ImageMagick処理(別スクリプト) 軽い画像→OK、重い画像→OK こんな感じで保存とImageMagick処理を同じスクリプトでやろうとすると 上手くいきません。画像処理の実行に関わらず、スクリプト内で use Image::Magick;しているとダメポです。保存すらできません…。 どういう原因が考えられるでしょうか? アドバイスお願いしますorz
317 :
315 :2005/03/31(木) 13:11:59 ID:???
後出しすみませんorz 長くなりますがよろしくお願いします。 #マルチパートデータ解析 local($div,$id,$value,$filename,$minetype,$size); $div = <STDIN>; $div =~ s/\s+$//; $line = ''; until($line =~ /^$div--/){ $id = ''; $value = ''; $filename = ''; $minetype = ''; $line = <STDIN>; until($line =~ /^\s*$/){ return if eof(STDIN); if($line =~ /\sname="([^"]*)"/i){$id = $1;} if($line =~ /\sfilename="([^"]*)"/i){$filename = &trim($1);} if($line =~ /^Content-Type:\s+(\s+)/i){$minetype = $1;} $line = <STDIN>; } $size = 0; $maxbyte = 1024*500; $line = <STDIN>; until($line =~ /^$div/){ return if eof(STDIN); $size += length($line); $value .= $line if ($size < $maxbyte); $line = <STDIN>; }
318 :
315 :2005/03/31(木) 13:12:59 ID:JNShQA97
if($size < $maxbyte){ $param{$id} = $value; $paramtype{$id} = $minetype if($minetype ne ''); }else{ $param{$id} = ''; $paramtype{$id} = 'big'; } $paramfile{$id} = $filename if ($filename ne ''); } #ファイル保存 $oname = &trim($paramfile{"file"}); &jcode'convert(*oname,'euc'); $oname =~ s/\\/\//g; $oname = substr($oname,rindex($oname,"/")+1); $type = $paramtype{"file"}; $bindat = $param{"file"}; if($type eq 'big'){&err;} if($bindat =~ /^\s*$/){ $chk='ok';} elsif($bindat =~ /^GIF\d\d[a-z]/) { $chk='ok'; } elsif($bindat =~ /^\xFF\xD8\xFF\xE0\x00/) { $chk='ok'; } elsif($bindat =~ /^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A/) { $chk='ok'; } elsif($type =~ /image\/gif/i){ $chk='ok'; } elsif($type =~ /image\/jpeg/i){ $chk='ok'; } elsif($type =~ /image\/x-png/i){ $chk='ok'; } else{ $chk='no'; } if($chk ne 'ok'){ &err;} $fullpath = "$imgdir$oname"; if(-f "$fullpath"){&err;}
319 :
315 :2005/03/31(木) 13:13:24 ID:???
if($bindat ne '' && $oname ne ''){ unless(open(FILE, ">$fullpath")){&err;} binmode(FILE); print FILE $bindat; close(FILE); chmod (0666,$fullpath); use Image::Magick; $osize = Image::Magick->new(); $osize->Read($fullpath); ($w,$h) = $osize ->Get('width','height'); ##以下略 } ageてしまったごめんなさい。
320 :
315 :2005/03/31(木) 13:17:16 ID:???
しかも文字化けてる…… 化け部分はエラー用のサブルーチンに跳ばしてます。
サーバのエラーログは何か言ってないの?
322 :
315 :2005/03/31(木) 14:02:42 ID:???
>321 レスありがとうございます。 サーバ側では特にエラーは出ていないようです。 use Image::Magick;しなければちゃんと動くんですが、 ↑があるとファイル保存以下をスッ飛ばしてスクリプトの 最初の行に戻ってしまうような感じです。 アップロードしたのが軽いファイルなら最後まで正常に動きます。 どこが悪いのか自分ではさっぱり…。
>>315 CGI.pm使った方が楽だと思うのだが...
使おうとしたが何か問題があってどうしても使えないとか、
CGIの解釈を自分でやる練習ならしょうがないけど。
324 :
315 :2005/03/31(木) 21:35:58 ID:???
こだわりがあるわけじゃないんですが CGI.pmを使った時、パラメータ名の指定に for($i=0; $i < $datlist; $i++){ $hoge = $query->param("file_$i"); } という感じに変数で指定ってできるんでしょうか? これやると上手くいかなかったもので…。
325 :
315 :2005/03/31(木) 23:39:26 ID:???
ごめんなさい324は勘違いしてました。 CGI.pmだと好感触みたいなのでこれでもう少し頑張ってみます。 ありがとうございました >323
ttp://www.melma.com/mag/85/m00014785/a00000008.html これ見てファクトリパターンかっこええなぁと思ったので、ちょっとやってみるかと思ったんですが、
> return "Message::".$classname->new(%{$arg_ref});
ってことは "Message::".$classname なクラスを事前に読み込ませておかないといけないんですよね?
まさか文頭に「読み込まれる可能性のあるクラスを全部書いておく」なんてことはないんでしょうが、
直前で use "Message::".$classname; とかやっても平気なんでしょうか?
>>326 >まさか文頭に「読み込まれる可能性のあるクラスを全部書いておく」なんてことはないんでしょうが、
ん? そうじゃないの? そのときどきにrequireする物なのかな? useはNGだお
328 :
nobodyさん :皇紀2665/04/01(金) 13:45:49 ID:JJhcoQhv
$hoge = "あいうえお-かきくけこ-さしすせそ-たちつてと"; $_ = $hoge; if((s/-/-/g) > 10){ print "10以上"; }else{ print "10以下"; }
329 :
328 :皇紀2665/04/01(金) 13:47:15 ID:???
↑$hogeにあるハイフンを数えて判定する綺麗なやり方を教えてくだされ!
>>329 教えてやろうと思ったが、2レスに渡って書いてるのと、語尾がムカついtr。
331 :
nobodyさん :皇紀2665/04/01(金) 14:44:13 ID:XdlrhN9n
perlで一般的なハンガリー記法ってありますか?
>>331 そんな記法のことはきれいさっぱり忘れてくダサい。
333 :
328 :皇紀2665/04/01(金) 15:34:10 ID:???
>>330 途中で書き込んだ為、誤って2スレ分になってしまいました。
語尾によって気分を害されたのであれば申し訳御座いません。
また御機会があれば宜しくお願い致します。
>>328-329 $_ = $hoge; # ←する理由がわからん
(ふつう $_ に意識的に代入するかなぁ…?)
$count ++ while ($hoge =~ m/-/g);
とかも可能
>>336 おそらく if (($hoge =~ s/-/-/g) > 10) と書けるとは知らなかったと思われ。
338 :
326 :皇紀2665/04/01(金) 21:21:39 ID:???
>>327 うお、マジすか。
DBIが似たような仕組みらしいので、ちょいと中をのぞいてみても、
どのへんでこの問題を解決しているのかサッパリです。
ソースのどの辺りで解決しているのかおわかりの方はいませんか?
339 :
nobodyさん :皇紀2665/04/01(金) 22:48:38 ID:ybs/IKbS
>>338 DBIが読み込むドライバのことを言っているのかな。
どうせuseかrequireかdoを使ってるんだろうと
あたりをつけてサーチかませばDBI.pmのサブルーチン
install_driverの中でreqireしてごにょごにょしてる
ところはすぐ見つかると思われる。
ただドライバはDBI::DBDに説明されているような構成
になってることを要求されていて一般的なモジュール
とはちといえないから、参考になるかどうかはびみょー。
340 :
328 :皇紀2665/04/01(金) 22:53:02 ID:???
>>335-337 ありがとです。度忘れしてました。
tr/-//採用させていただきます。
use Benchmark;
$hoge = "あいうえお-かきくけこ-さしすせそ-たちつてと-なにぬねの-はひふへほ";
timethese(100000, {
sample1 => sub { if(($hoge =~ tr/-//) > 10){} },
sample2 => sub { if(($hoge =~ s/-/-/g) > 10){} },
});
Benchmark: timing 100000 iterations of sample1, sample2...
sample1: 0 wallclock secs ( 0.05 usr + 0.00 sys = 0.05 CPU) @ 2127659.57/s (n=100000)
sample2: 0 wallclock secs ( 0.22 usr + 0.00 sys = 0.22 CPU) @ 456621.00/s (n=100000)
341 :
nobodyさん :皇紀2665/04/02(土) 00:17:03 ID:m1Urw5SA
342 :
326 :皇紀2665/04/02(土) 02:28:50 ID:???
>>339 仰せの通り、該当部を覗いてみると、
requireでドライバを読み込んで、
読み込まれたドライバはDynaloaderをuseして、
bootstrapで自分自身をロードしているらしい
……具体的にはワケワカメなのですが。
詰まるところ、これが動的なインポートというやつなのでしょうか?
まんまパクってやれば、いちいち「読み込まれる可能性のある(以下略」を書かなくても良いのかなぁ。
343 :
nobodyさん :2005/04/02(土) 13:44:50 ID:BYWwUZK5
プロキシでのアクセスを制限したいです。 環境変数の取得の仕方は分かります。 プロキシかどうかを判定すにはどうすれば良いのでしょうか?
簡易的な方法でいいの?
345 :
nobodyさん :2005/04/02(土) 14:25:00 ID:BYWwUZK5
レスありがとうございます。 個人的には、できるだけ強力な制限にしたいのですが、 面倒くさいようでしたら、さわりだけでも教えて頂けると助かります。 ぐぐったんですけど、検索の仕方悪いのかサーバがどうのこうのってのばっかりで…。
346 :
328 :2005/04/02(土) 14:33:36 ID:???
>>343 ポートの80と8080番空いてるか調べるとか。
348 :
nobodyさん :2005/04/02(土) 14:40:29 ID:BYWwUZK5
勉強不足ですみません。ポート開いてるかを見る環境変数もあったんですかぁ…。 つまり、プロキシ鯖は80、8080は大抵空いているものなのですか?
349 :
nobodyさん :2005/04/02(土) 14:46:46 ID:BYWwUZK5
ポート番号: 80 結果:接続できますた。(^o^) …ルータで弾いてるはずなのに。やばいっすかね?
use IO::Socket; $host = 'www.2ch.net'; #IPとかホスト名 $port = 80; #ポート番号 $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp'); if($socket){ print 'ポート空いてるお^^'; } else{ print '空いてないお^^'; }
>>347 にあるけど2chのBBQ使って正引きするのがイイと思う
352 :
343 :2005/04/02(土) 17:18:11 ID:jF3LdyJO
御協力感謝です。 でも、初心者の僕には頭が混乱してくる話で…w 皆さんの御厚意を無駄にしないよう、ぐぐりまくって勉強します。 最後に、クレクレで申し訳ないんですが、良い勉強サイトあったら紹介して頂けますでしょうか。 皆さんのように教えられる立場になれるようがんばります。ありがとうございました。
それもググりまくってください。
354 :
343 :2005/04/02(土) 19:10:20 ID:jF3LdyJO
がんばって、ぐぐるとです。 ところで、 sub checkProxyList { my $RADDR = $ENV{'REMOTE_ADDR'}; $RADDR =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/; my $query_addr = "$4.$3.$2.$1.niku.2ch.net"; my $addr = join('.', unpack('C*', gethostbyname($query_addr))); if ($addr eq '127.0.0.2') { DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)"); } return 0; } って、勝手に使って良いんですか?
>>354 私的利用なら問題ないでしょ。多分。俺は詳しくないからわからんけど。
でも俺なら
my $req = join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net";
my $res = join(".", unpack("C*", gethostbyname($req)));
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)") if ($res eq '127.0.0.2');
とか、
if(join(".", unpack("C*", gethostbyname(join(".", reverse(split(/\./, $ADDR))) . ".niku.2ch.net"))) eq '127.0.0.2'){
DispError("ERROR!","公開PROXYからの投稿は受け付けていません!!(1)");
}
みたいに書くよ!
確か特定のIPからしかリクエスト利かなかったような覚えが・・・
サブルーチンのリファレンスを作るのに、引数も一緒に渡そうとしています。 例えばサブルーチンcodeのリファレンスを作るとき sub { &code('a','b') }とすると見栄え的にあまりよくないと思うので、 \&code('a','b') や \{&code('a','b')} としてみたらエラーとなりました。 何かうまい方法は無いのでしょうか。例えば次の単純なプログラムを実行したら Not a CODE referenceと表示されます。 $ref = \&hoho(1,\&huhu('a','b')); &$ref; sub hoho { &{$_[1]}; } sub huhu { print $_[0].$_[1]; }
>>357 そろそろオブジェクト指向にシフトする頃合かも。
あえてクロージャで書いてみる。
$ref = create_hoho(1, create_huhu('a', 'b'));
$ref->();
sub create_hoho {
my ($dummy_arg, $sub_ref) = @_;
return sub { $sub_ref->(); }
}
sub create_huhu {
my @args = @_;
return sub { print $args[0].$args[1]; }
}
>>358 それはうまくいきますね。
オブジェクト指向ですか、勉強してみようと思います。
ありがとうございました。
while(readdir(DIR)){ # 処理 # のようなのは不可能なのですか? # この中でディレクトリの内容を $_ に読み込んで処理したいのですが、 # 直前に処理されていた $_ の値が入ってしまいます。 } よろしくお願いします。
while($_ = readdir(DIR)){ }
for (readdir(DIR)){ }
363 :
343 :2005/04/03(日) 12:13:17 ID:2xmdAJbj
364 :
360 :2005/04/03(日) 17:40:14 ID:???
でもファイルをopenして while(<FH>){ } ならできるのにどうしてですか?
すいません、ウィンドウズのローカル(activeperl)で動いてるperlスクリプトから 掲示板(2chではないです)に書き込みたいんですが、 何か参考になるサイトなどありましたらお教え願えないでしょうか。 該当掲示板のアドレスにパラメーターくっつけて送信したらいいだけってのはわかるんですが、 そこに至るまでの過程がわからなくて…。 何か良いサンプルプログラムとかありましたら何とぞよろしくお願いします。
>>364 while(<FH>) のときだけ特別にそう動くようになってるんだよ。
ちゃんとした本を読むのだ。書いてあるから。
369 :
nobodyさん :2005/04/04(月) 17:27:56 ID:soRFZIJA
過 疎 過 ぎ で す よ!
荒らされて3日で1000逝くよかマシ
371 :
nobodyさん :2005/04/05(火) 13:02:19 ID:ZNntFGGU
Perlのフォームの入力確認の部分で フォーム内容A=フォーム内容B でなければエラー という簡単な方法があれば教えて頂けないでしょうか?
↓ エスパー降臨
Perlで画像アップロードCGIを組んでいるのですが、サムネールを自動育成できればと思っているのですが HTMLで擬似縮小するのではなく本当に画像を指定サイズに縮小する方法はありませんか
画像を切り取れ
376 :
nobodyさん :2005/04/05(火) 14:13:05 ID:CfOSbO/O
373です 出来ました。 ありがとうございました。
>>377 反発するつもりじゃないけどエロゲー未経験
むしろ買う勇気が(ry
381 :
nobodyさん :2005/04/05(火) 16:21:48 ID:ZNntFGGU
ここに誘導されて来たんですけど、 Perlのフォームの入力確認の部分で フォーム内容A=フォーム内容B でなければエラー という簡単な記述があれば教えて頂けないでしょうか?
('A`)
釣られてみる %FORMにクエリーが入ってるとして if($FORM{'formA'} ne $FORM{'formB'}){&error(エラールーチンとか);} 初歩的にも度が過ぎる・・・
384 :
nobodyさん :2005/04/05(火) 18:08:15 ID:ZNntFGGU
>>383 やっぱりうまくいきません。
フォーム1の名前:password1 タイプ:password
フォーム2の名前:password2 タイプ:password
if ($password{'password1'} ne $password{'password2'}) { &error('エラーです。'); }
他に何か加えないといけないでしょうか?
問題点があったら、よろしくお願いします。
%passwordに何も入ってないというオチ
386 :
nobodyさん :2005/04/05(火) 18:17:26 ID:ZNntFGGU
%password にクエリーを入れるという意味がわからないのですが・・・ よろしくお願いします。
388 :
nobodyさん :2005/04/05(火) 18:27:50 ID:ZNntFGGU
わからないです。 どこがわるいんでしょうか?
389 :
nobodyさん :2005/04/05(火) 18:31:59 ID:ZNntFGGU
ヤフー検索。 クエリーを入れる→7件 my $q; #クエリーを入れる my $method; #メソッドを入れる ↑はクエリーですか?
>>388 %passwordに渡した内容が自動的に入ると思ってる?
思ってんならそれ間違いだから。中身は空だから。
391 :
nobodyさん :2005/04/05(火) 18:37:46 ID:ZNntFGGU
直して付け加えたのはここの部分だけです。 フォーム1の名前:password1 タイプ:password フォーム2の名前:password2 タイプ:password if ($password{'password1'} ne $password{'password2'}) { &error('エラーです。'); } でやっても、上の入力は無視されて飛ばされてるみたいで、 一緒でなくてもそのまま送信されてしまいます。上級者の方、よろしくお願いします。
392 :
nobodyさん :2005/04/05(火) 18:39:32 ID:ZNntFGGU
>>390 要するにどこをどのように直せばよろしいのでしょうか?
>ヒントではなく、 >このように直せば動く、このように付け加えれば動く、 >という指摘がうれしいのですが・・・。 >初心者ではなく言語がわからない人です。 こいつWeb制作板でこんなこと書いとる
394 :
nobodyさん :2005/04/05(火) 19:28:53 ID:ZNntFGGU
$a=newpass; $b=newpass2; if (!$namecheck && $name eq '') { &error('名前を入力してね。',''); } if ($a==$b eq '') { &error('パスワードエラーです。',''); } このようにifがいろいろ並んでいるのですが、 それに1行加えてみましたが、見事にエラーになりました。 よろしくお願いします。
エラーログを読みましょう。
396 :
nobodyさん :2005/04/05(火) 19:59:42 ID:ZNntFGGU
$a="passward1"; $b="passward2"; if (!$namecheck && $name eq '') { &error('名前を入力してね。',''); } if ($a ne $b) { &error('パスワードエラーです。',''); } にしたら、「パスワードエラー」が表示されるようになりました。 しかし、A=BでもA=Bでなくても、エラーになってしまいます。 「パスワードエラー」までいくようになったので、あとはAとBの置き換えの問題だと思うのですが、 この記述は上の方に書いたのですが、フォーム上の name="passward1" を $a="passward1" と置き換えていいのでしょうか?
ま、どうでもいいけど、passward は password って書いたほうがいいと思うけどな。 どうでもいいんだけどな。
%form にクエリーを入れて返す関数 sub get_form { my %form; seek(STDIN,0,0); read(STDIN,$_,$ENV{'CONTENT_LENGTH'}); foreach(split(/&/)){ my($name, $value) = split(/=/); $value =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg; $form{$name} = $value; } return %form; }
そろそろ釣りと気づけよ。
⊂二二二( ^ω^)二⊃ ブーン
402 :
nobodyさん :2005/04/05(火) 21:57:40 ID:ZNntFGGU
sub get_form { my %form; seek(STDIN,0,0); read(STDIN,$_,$ENV{'CONTENT_LENGTH'}); foreach(split(/&/)){ my($name, $value) = split(/=/); $value =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/eg; $form{$name} = $value; } return %form; } をデコード処理というところに貼ってみましたが、だめでした。 いろいろありがとうございました。
すいません、perlでテキストファイルを自分のサイトのアップローダ(php)に上げようとして
http://bird.dip.jp/computing/zive.html ここを参考にしてみたんですがうまくアップロード出来ません。一応アクセスは出来てるようですが…。
もしかしてperlでアップロードする時は該当ファイルのパスが変わるのかなと思ったり。
以下に「全ソース」を貼らせてもらいます…。
アップロードしたいファイルはC:\Perl\test.txtの位置、このスクリプトを置いてる位置はC:\(直下)にあります。
どなたかアドバイスよろしくお願いします…。
# アップロード用
use constant URI => '
http://hoge.net ';
use strict;
use LWP::UserAgent;
# POST parameters
my @param = ('hoge=1',
'MAX_FILE_SIZE=500000',
'uploadfile=C:\Perl\test.txt');
my $ua = LWP::UserAgent->new;
my $req =
HTTP::Request- >new(POST => URI);
$req->content_type('application/x-www-form-urlencoded');
$req->content(join('&', @param));
my $res = $ua->request($req);
open(OUT, ">> ./hoge.txt");
binmode(OUT);
print OUT $res->as_string;
close(OUT);
exit 0;
結果はアップロード拒否用のページのソースが出力…。
405 :
403 :2005/04/05(火) 23:20:45 ID:???
>>403 ファイルアップの場合のcontent-typeは普通multipart/formdata
CGI側でチェックしてないことが多いのでフォームパースはやってくれるかもしれないがPOSTの内容はmultipart/formdataの仕様に合わせないとだめ。
multipart/form-dataでした 詳細はrfc2388
409 :
nobodyさん :2005/04/06(水) 18:15:00 ID:cBYix7o3
.htaccessが使えない環境なのですが、 POST以外のデータ受け取りを拒否する方法ってありますか?
$ENV{'REQUEST_METHOD'}
411 :
nobodyさん :2005/04/06(水) 18:54:05 ID:cBYix7o3
ありがとうございます。
412 :
nobodyさん :2005/04/06(水) 18:59:03 ID:0ohpKdgA
こまっています。 postgresql8.0 windowsXP perl5.008 DBD::PgPP の環境にて、perlからpostgresにデータインサートをおこなっているのですが、 DBIのトランザクションがなかなか理解できません。 使いかた、文法間違っていないかご教授お願いします。 $dbh= DBI->connect($DBname, $DBuser, $DBpass); $dbh->{AutoCommit} = 0; $dbh->{RaiseError} = 1; eval { #テーブル1にinsert $SQL= "INSERT 〜"; $sth= $dbh->prepare($SQL); $sth ->execute(); #テーブル2にinsert $SQL= "INSERT 〜"; $sth= $dbh->prepare($SQL); $sth ->execute(); $dbh->commit; }; if ($@) { $dbh->rollback; } $sth->finish(); $dbh->disconnect();
413 :
nobodyさん :2005/04/06(水) 21:11:07 ID:cBYix7o3
質問よろしくお願いします。 掲示板を作っているのですが、reverseを使わずに、 ログファイルの先頭に書き加えるにはどうしたらいいでしょうか? なるべくリソースを使わないようにしたいです。 また、意中のレスを削除するために、 ログファイルから、その行だけを取得する方法はありますでしょうか? よろしくお願いします。
>>407 >>408 色々と探した結果ここのページ参考にして
修正してみたんですが、どうもうまく動きません…。
一応アップロード用のphpファイルと接続出来ているようですが、
やはりフォームデータが正常に送信出来てないようです。
とりあえずアップロード用のモードでサーバーのphpが結果を出力してるので、
全てのフォームデータが送信されてないわけではないと思うんですが。
うーん。
use
HTTP::Request::Common; use strict;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->request(POST '
http://yomogiwakakusa.jog.buttobi.net/index.php ',
Content_Type => 'form-data',
Content => [ upload=> '1',
MAX_FILE_SIZE => '500000',
userfile => "test.txt" #アップロード用ファイル、plスクリプトと同階層
]);
print $res->as_string;
open(OUT, ">> ./result.txt");
binmode(OUT);
print OUT $res->as_string;
close(OUT);
exit 0;
>>414 phpが期待する入力と合ってないだけでしょ。
>>415 >>416 ありがとうございます。
アップロード用のphpの方をいじってファイル名がどういう風に送信されてるか表示させてみました。
で、同じようにこのコードで実行してみると、
my $userfile='C:\test.txt';
my $res = $ua->request(POST '
http://hoge.net/index.php ',
Content_Type => 'form-data',
Content => [ upload_log => '1',
MAX_FILE_SIZE => '500000',
userfile => $userfile
]);
php側じゃ$userfileの値が「C:\\test.txt」と円マーク二つ返してきてます…。
これじゃアップロード出来ないですよね。
一応こちらのperlの方を「C:\\test.txt」と変更して実行すると、
返り値は同じ「C:\\test.txt」、
ヤケクソになって「C:\\\test.txt」と円マーク三つつけて実行すると、
「C:\\\\test.txt」と四つになって返ってきます。
perlってこんな仕様だったかな…。
すいません、そろそろ大詰めっぽいのでどなたか良きアドバイスを…。
418 :
nobodyさん :2005/04/06(水) 23:20:19 ID:jUkFe3D6
共用鯖で全てのPHP RUBYスクリプトが使えなくなるプログラムを作ってください
$userfile='C:/test.txt';
>>417 ファイル名だけ来てファイルの内容が来てないということ??
421 :
414 :2005/04/06(水) 23:45:15 ID:???
>>419 ああ、そんな簡単なことでよかったのか…、
ということでやってみましたが確かにファイル名はそのまま送信できましたけど、
結局アップロードは出来ず。
なぜだ…。
とりあえず
>>416 さんに教えてもらったコードでデバグしてみるとこんな感じでした。
LWP::UserAgent::new: ()
LWP::UserAgent::request: ()
LWP::UserAgent::send_request: POST
http://hoge.net/index.php LWP::UserAgent::_need_proxy: Not proxied
LWP::Protocol::
http::request: ()
LWP::Protocol::collect: read 860 bytes
LWP::Protocol::collect: read 1852 bytes
LWP::UserAgent::request: Simple response: OK
>>420 えと、ご存じかも知れませんがphpじゃアップロードされたファイルはこんな↓感じの形式で
サイズとかいろいろなデータを取得できるんですが、
$_FILES['userfile']['name']
$_FILES['userfile']['tmp_name']
中身がからっぽなのでとりあえず
$userfile= $_REQUEST['userfile'];
とただの変数扱い?にしてperlから送信されてくるファイル名を調べてみたんです。
423 :
414 :2005/04/07(木) 00:14:05 ID:???
>>412 普通、テーブル2へのinsertでエラーが発生したらrollbackさせる。
>>414 |Content-Type: multipart/form-data; boundary="6G+f"
や
| PATH=/local/perl/bin:$PATH
| export PATH
はそのとおりではないだろうという事。
425 :
nobodyさん :2005/04/07(木) 01:32:34 ID:hZmAmpQN
配列を返す関数をダブルクォートの中で展開するにはどうしたら良いのでしょうか? $, = '+'とした後、keys(%expect)をダブルクォートの中で配列として評価し展開したいんです。。 色々と試してみたのですが、結局やり方が分からなかったのでどなたか教えて頂けると嬉しいです。
>>425 意味わかんねえよ。もうちっと具体的に。
427 :
414 :2005/04/07(木) 01:42:28 ID:???
>>424 ああ、そういうことですか、なるほど…。
ひとつ気になった点。
普通にブラウザのフォームから「アップロードファイルの参照は空欄のままにして」submitした場合、
送信しようとしたアップロードファイルのデータをphpの側が
[userfile] => Array
(
[name] =>
[type] =>
[tmp_name] =>
[error] => 4
[size] => 0
)
と出力するんですが、
ローカルのperlからデータ送信した場合なぜか
Array
(
)
と、根本的に何もかも空っぽになってしまいます。
これは何か怪しい…かな。
>>426 すいません。。返信ありがとうございます。
%expectにはいくつかのデータが入っていて、そのキーだけを取り出し+で繋げて$outに代入したいんです。
なので、
$, = '+';
my @tmp = keys(%expect);
$out = "@tmp";
とすれば出来るんですが、わざわざ@tmpを作るのが汚いので@tmpを作らずにこれが出来る方法を質問させて頂いた次第です。
429 :
nobodyさん :2005/04/07(木) 02:12:32 ID:mpm+fGDU
for(keys %expect){ $out .= $_."+";}
430 :
428 :2005/04/07(木) 02:24:45 ID:???
>>429 返信ありがとうございます。それも試したんですが、一番最後に+が付いてしまうので。。
join '+', keys(%expect)
>>425 >>428 >>430 特殊変数 $, と $" を勘違いしている。
my %hash = (foo => 2, bar => 3, baz => 4);
{ local $, = '+'; print 1, sort(values %hash), 5, "\n" }
{ local $" = '+'; print "1+@{[ sort values %hash ]}+5" }
433 :
428 :2005/04/07(木) 02:35:39 ID:???
>>432 思いっきり勘違いしてました。。$"ですね。ご指摘ありがとうございます。
>>429 さんすみません。
>>431 なるほどー。全然思いつきませんでした。。それでいきたいと思います。ありがとうございました。
434 :
nobodyさん :2005/04/07(木) 12:06:08 ID:2qkaRxVD
スカラーコンテストを略してスカコンと言ったら 先輩に怒鳴られました。何が悪かったのでしょう?
435 :
nobodyさん :2005/04/07(木) 12:12:29 ID:dowco4wM
>>434 「スカタン」と聞き間違えたんじゃないかな。
スカコン -> スカトロコンプレックス スカラーコンテスト -> スカラーコンテキスト
437 :
nobodyさん :2005/04/07(木) 12:27:59 ID:2qkaRxVD
>>435 なるほど!って、それはないですよ。うち関西じゃなし
>>436 あ、スカラーコンテキストです。へへ
>>434 共通の認識の無い略語を使われると意味が通じないということでしょう。
スカコンは一般的に使われている略語とは思えない
すいません、質問なんですが、 hoge.pl lib └----hoge.pm hoge └----test.pm という構造で、test.pmのsub{ }の中から hoge.plの中のグローバル変数の値を取得するにはどういうコードを書けばいいんでしょうか。 よろしくお願いします。
>>440 ありがとうございます。
ついでにもう一つ行儀の悪いことかと思うのですが、
同じくtest.pmの中にあるサブメソッドから、
hoge.plの中で定義してあるサブメソッドを呼び出すにはどうしたらよいのでしょうか。
実はお教え頂いたページはgoogle検索で見ていたのですが、
自分ではまだ不勉強な部分が多くほとんど要領を得ませんでした、無念。
よろしければ、簡単なコードを示して頂ければ嬉しいです。
横着を言ってすいません。
ああ、$::hoge、あるいは$main::hogeでmainにある変数hogeにアクセス出来るんですね。 やっとわかりました。 しかし、ネストされたモジュールの中のサブルーティンからメインに置いてある サブルーティンを呼ぶ方法が未だにわかりません。 どなたかよろしくお願いします。
>>439 お前はモジュールというものがわかってない
3つに分けないで1つにしておけ
>>443 自分でつくったなら一つにするんですけどね…。
>>442 スカラー変数のプレフィクスは $
配列のプレフィクスは @
ハッシュのプレフィクスは %
サブルーチンのプレフィクスは &
型グロブのプレフィクスは *
print map "$_ => [$main::{$_}]\n", sort keys %main::;
>445 できました!ありがとうございます
447 :
nobodyさん :2005/04/08(金) 20:51:39 ID:RsQcEeNJ
euc-jpには\や@などが含まれていないというのを 読みましたが、同じくタブ文字(\t)も含まれていないのでしょうか? 日本語のデータをeuc-jpで保存していて、そのフィールドの区切りを タブ文字にしているので、これで絶対に大丈夫なのか、不安に 思いました。
448 :
nobodyさん :2005/04/08(金) 20:55:43 ID:j5c3p0G/
教えてください。 最近のperlではinet_aton()の仕様が変わったのでしょうか? nslookupが複数のIPアドレスを返すホストを引数に与えると inet_aton()が失敗します。最初のIPアドレスを返すのが仕様だと 思ったのですが。バージョンは以下のとおりです。 perl --version This is perl, v5.8.2 built for sun4-solaris
451 :
448 :2005/04/08(金) 22:56:06 ID:???
>>450 ありがとうございます。
OSのライブラリgethostbyname()に依存している可能性が
あるわけですね。
CGIを書いているのですが、CGIに関しては質問を受け付けないと
言っているISPなので困ったなあ。
452 :
nobodyさん :2005/04/08(金) 23:08:49 ID:OhDnlIyM
初歩的な質問なんですが。 opendir(DIR, "./$folder"); @dir = readdir(DIR); closedir(DIR); for($i=0;$dir[$i];$i++){ $ts = ($dir[$i] =~ /^\d+\.html/) ? (stat("./$folder/$dir[$i]"))[9] - 800000000 : ' '; $dir[$i] = "$ts,$dir[$i]"; } @dir = sort {$b cmp $a;} @dir; これってopendir(DIR, "ls-t./$folder"); で済むと言われたのですが UNIXでのOS環境でのことですよね? コーディングでOSのコマンドを利用するようなやり方は あまりよく知らないもので。
(;^ω^)?
454 :
nobodyさん :2005/04/08(金) 23:44:12 ID:OhDnlIyM
今いろいろ検索して調べていたのですが なんか疑問に感じた。 ディレクトリのなかのファイルを新しい日付順に降順で並び換える プログラムなのですが、、、 そもそもlsって表示コマンドだし、-tオプションは昇順表示だし。 OSのコマンドを使うにしても並び換えのコマンドだと 思うのだが。 よくわからんが負荷が高いからこのほうがいい、と言われた。
455 :
nobodyさん :2005/04/08(金) 23:54:12 ID:OhDnlIyM
opendir(DIR, "ls-t./$folder"); じゃなかった。 opendir(DIR, "ls-t./$folder|"); だった。 そもそもこの場合の|の意味がわからんのですが、、、
456 :
nobodyさん :2005/04/09(土) 00:11:56 ID:gYWC+2uy
パイプ?なのかなあ。にしても続くコマンドないし、、、 sort -rだと思うのだが、、、
457 :
nobodyさん :2005/04/09(土) 00:34:17 ID:gYWC+2uy
ああ、ls-tは日付順の降順だわ。 それなら並び換えはいらんのだが しかしlsコマンドでいいのかわからん。
open(DIR, "ls -t ./$folder |") だと思われる ls -t の出力をパイプで自分に流し込む話
459 :
nobodyさん :2005/04/09(土) 00:58:37 ID:gYWC+2uy
なるほどディレクトリ自体の性質を変えずに表示形式出力だけを 加工させるスクリプトに持っていくのかな。 しかし初心者ながらこういうやり方まで頭がいかんかった。 つまりファイル操作ならOSのコマンドで代用すればいいじゃない。 ということが。
460 :
nobodyさん :2005/04/09(土) 01:07:49 ID:gYWC+2uy
opendir(DIR, "./$folder"); @dir = readdir(DIR); closedir(DIR); for($i=0;$dir[$i];$i++){ #$ts = ($dir[$i] =~ /^\d+\.html/) ? (stat("./$folder/$dir[$i]"))[9] - 800000000 : ' '; $dir[$i] = "$ts,$dir[$i]"; } @dir = sort {$b cmp $a;} @dir; for($i=$next - 21;$i < $next+100-21 && $dir[$i];$i++){ ($ts, $file) = split(/,/, $dir[$i]); last if $ts eq ' '; open(R, "./$folder/$file"); $_ = <R>; close(R); /<b>([^\<]*)<\/b>/; $j = $i+1; print W " $j<a href=\"$file\">$1</a>\n"; } こういう構造でのスクリプトは古いのだろうか。 open(DIR, "ls -t ./$folder |") で やればあきらかに負荷軽減になるのだろうか。
環境や条件にも依るだろうよ
462 :
nobodyさん :2005/04/09(土) 01:34:53 ID:gYWC+2uy
windows環境でhttpdソフトでテストする場合 open(DIR, "dir -d ./$folder|"); ということになるのだろうか? そもそもソースにOSコマンド書いたからといって OSがどう連動してくれてるか わからないのだが。
463 :
nobodyさん :2005/04/09(土) 01:53:22 ID:gYWC+2uy
間違ったこの場合ならdir /o:-d だわな、、、
win環境ではcygwin入れてls使えよ OSコマンドって言ってる時点で(ry まずは自分が何を知りたいのか整理しろ。 そして質問は分かりやすく謙虚に書け。
465 :
nobodyさん :2005/04/09(土) 02:45:27 ID:gYWC+2uy
ああ? 謙虚もクソもあるか。 てめえの言い方も横柄だろうが。 わからねえならそれでいいんだよ。 クソが。
(;^ω^)ほんと態度の悪い質問者に回答するのは嫌になってくるな
>>460 パイプを open するとプロセスが別に生成されて
場合によっては shell まで呼び出されたりして
かえって負荷が高くなる場合も多いと思う
まあ結局はケースバイケースだが
どかんと一発、全ファイルリストを取得してからPerlで処理したほうが効率いいっしょ。 ちょこちょこI/O負荷をかけるよりは。
$aが$bの倍数であるかどうかを調べるには どうすればいいんですか?
$a % $b == 0
すべての素数を書きだすスクリプトの書き方を教えてください
>471 感謝!助かりました!
>>474 じゃ無理なことを証明するスクリプトの書き方を教えてください
一生計算終わらないからなぁ
素数は有限個ではないというのはスクリプトで証明するもんじゃないな
数学でもやってろタコっていう
print "無理です\n";
エラーだけどね
きっとサブルーチンの中に書かれてるんだ。
>>482-483 $ cat omaera_aho.pl
print 'すべての素数'
$ perl omaera_aho.pl
すべての素数
STDINを何度か読み直ししたいときってどうしてる? 二回 read したいんだけど、seek(STDIN, 0, 0) しても先頭に戻らなかった・・・。 一回グローバルな変数に置いておくとか、ファイルに書き出すとかしかないんかな? うーむ。
STDINはFIFOなバッファ。こぼれた水は元に戻らない。
マルチコアとか64bitのCPU使ったらperlのスクリプトは 速くなりますか?あるいは速くする書き方はありますか?
$selという文字列をselected="selected"に置換したいのですが ~s/\$se/ selected="selected"/i; だとうまく行きません。どうすればいいでしょうか。
$buf = '$sel'; $buf =~ s/\$sel/selected="selected"/i; print $buf; ふつーに出来たけど
~s/\$se/ selected="selected"/i; ↑
多分 g オプション。
~s/\$se/ selected="selected"/i; ↑ この頭の~は何のためにつけてるのだろうか?
>>493 結果の補数を取る為ですが、おかしいですか…?
双子素数が無限に存在することを証明するスクリプトが書けた
65536ビットの数値を1ミリ秒で素因数分解するスクリプトがかけた夢を見た。
↓ 夢が現実になる瞬間!!
(´・ω・`)
499 :
nobodyさん :2005/04/12(火) 03:03:59 ID:qneeBtxS
文字列の中に含まれる<br>の 個数 を取得する簡単な方法ってないですか? 例えば↓なら結果として 3 が欲しいのです。 $str = 'a<br>bb<br>cccccc<br>dd'; 現在は、配列を経由させてなんとか取得しています。 $str = 'a<br>bb<br>cccccc<br>dd'; $result = @dummy = $str =~ m/<br>/g; print $result;
501 :
499 :2005/04/12(火) 09:03:28 ID:???
いろいろあるんですね。 1行目の方法でいきたいと思います。 ありがとうございました。
502 :
nobodyさん :2005/04/12(火) 22:17:46 ID:jd+szO9r
if( ) ↑の部分に直接サブルーチンを書いて判定させたいのですが、どのようにすればいいですか? if (&{foreach (keys(%{$CONFIG{'add'}})) { return 1 if $data[$_][0] == $_; } return 0;}) こんな風に書いてみたのですが、returnで返したのが不味かったらしく、エラーが出てしまいました。 どのように書けば良いのか知っている方ご教授して頂けると嬉しいです。
504 :
501 :2005/04/13(水) 00:36:56 ID:???
>>503 すみません。evalで出来ました。ありがとうございました。
505 :
nobodyさん :2005/04/13(水) 16:47:52 ID:3dbRXjnX
質問です。 PerlにはJavaのようなboolean型のような変数宣言はできないのでしょうか。 数値以外は文字列として扱う必要があるのでしょうか。 $isErr = false; if ($isError) { print "Error"; } else { print "Not Error"; } こう書くと実行はできるのですが、-cwで文字列をどうにかしろとのエラーが出てしまいます。
変数名が間違えてました、全て$isErrか$isErrorで統一するという条件でです。 修正しても、結果は変わらないのですが・・・
sub true () {!0} sub false () {0} print("True\n") if true; print("False\n") unless false;
508 :
nobodyさん :2005/04/13(水) 21:30:45 ID:mF6hKb8m
No.000001 あいうえお No.000002 かきくけこ No.000003 さしすせそ No.000004 たちつてと これを No.000001 あいうえお No.000002 かきくけこ No.000003 さしすせそ No.000004 たちつてと みたいにやるのってどうやるの? 単純に No.[000000-999999] の前に改行入れたらマ白になたヨ
No. の前にでも入れればぁ?
511 :
nobodyさん :2005/04/14(木) 11:37:45 ID:us4u4fSx
Apache拡張ガイド上33pのPerlHandlerについての部分で、下から3行目あたりに、 「サーバーを再起動せずに新しいモジュールをインストールする方法は後述する」 と書かれているのですが、何処に書かれているか、わかりませんorz どなたかわかりませんでしょうか。 まさかApache::Registryの事じゃないですよね・・・ スレ違いかもしれませんが、お願いします。もしくは誘導先でも。
DSOが実装されていれば可能だろうね。 なんだかメルヘンな話やね
やはりDSOのようにmod_perlは使えませんか。。 Registryの事なんでしょうかね。 DSOみたいな薄いラッパーになるハンドラ書けば動くかなぁ。 他にRegistoryの動作を大幅に簡略化するオプションでもあればいいのですが。 ちょっとズレますが、ModPerl::RegistryBBって使ってる方居られます? これ使う為に、Registory以上に気をつけることとかあるのでしょうか。
>>511 新しいモジュールをインストールってことは、Apache::StatINC では無いよね?
そもそもインストールだけなら再起動なんていらないけど、
再起動せずにハンドラに加えたいってことかな?
Apache->push_handlers するハンドラを Apache::StatINC で見張ってれば
出来そうな気もする。試したこと無いけど。
515 :
nobodyさん :2005/04/14(木) 16:03:05 ID:us4u4fSx
>再起動せずにハンドラに加えたいってことかな? はいそうです、言葉足らずでしたorz >Apache->push_handlers するハンドラを Apache::StatINC で見張 なるほど、その方法で出来そうな気が・・・(汗) けどmod_perlの機能でお手軽に。。ってわけにはいきませんね_| ̄|○
Mewのinboxにあるメールを検索するスクリプトを書こうと思います。 文字コードがjisなので、以下のようにしましたが、"put search word: " の部分が画面に表示されません。 use Encode; use encoding "jis"; print "put search word: "; chomp($word = <STDIN>); $word = decode('jis', $word); while(<>) { $line = decode('jis', $_); if ($line =~ /$word/) { print "$ARGV\n"; } } どうしたらよいでしょうか。また、画面表示の部分に日本語を使うことは できるでしょうか。当方、windows上でcygwinを使用、rxvtの端末文字コードは sjisにしてあります。
517 :
nobodyさん :2005/04/15(金) 06:28:27 ID:ftMFD1Fr
"東京(トウキョウ)" "世田谷(セタガヤ)" "北海道(ホッカイドウ)" "宗谷岬(ソウヤミサキ)" といった文字列それぞれから、「地名」と「よみ」を抽出したいと考えています。 そこで、以下のようにやってみたのですが、 ($chimei,$yomi) = $str =~ /([^(]+)((.+)/; そうすると、 "宗谷岬(ソウヤミサキ)"の場合だけ、 $chimei -> 谷岬 $yomi -> ソウヤミサキ となってしまいます。 文字コードはeuc-jpで処理しており、「宗」の2バイト目と「(」の1バイト目が 同じために、意図しているようにマッチしないということまではわかったのですが、 どのような正規表現を使えばよいかがわかりません。 こういった場合、どのように処理すればよいのでしょうか。 ちなみに、文字コードは以下のとおりです。 宗→\xBD\xA1(->\xA1\xCA よろしくお願いします。
519 :
nobodyさん :2005/04/15(金) 08:21:34 ID:ierbYSVR
518さん、ありがとうございました。 以下のようにして解決いたしました。 #!/usr/local/bin/perl $ascii = '[\x00-\x7F]'; $twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]'; $threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]'; @str = qw(東京(トウキョウ) 世田谷(セタガヤ) 北海道(ホッカイドウ) 宗谷岬(ソウヤミサキ)); foreach $str (@str){ (@m) = $str =~ /^((?:$ascii|$twoBytes|$threeBytes)*?)(((?:$ascii|$twoBytes|$threeBytes)+))/; print "$str ->".join(",",@m)."\n"; }
520 :
516 :2005/04/15(金) 12:42:59 ID:???
>>518 さん、どうもです。
文字コードについてお答えありがとうございました。
夜、家に帰ってからやってみます。
521 :
質問 :2005/04/15(金) 16:33:41 ID:jvrJ4EBi
タグの中にある改行とタブと二つ以上連続の半角空白を取り除きたいと思います。 例えば <BR>市町村 <BR> <SELECT name=pref> <OPTION value="" selected>---お選びください---</OPTION> <OPTION value=川越>川越</OPTION> <OPTION value=さいたま>さいたま</OPTION> <OPTION value=秩父>秩父</OPTION> <OPTION value=熊谷>熊谷</OPTION> </SELECT> 上のようなHTML文書を スクリプトによって <BR>市町村 <BR> <SELECT name=pref> <OPTION value="" selected>---お選びください---</OPTION> <OPTION value=川越>川越</OPTION> <OPTION value=さいたま>さいたま</OPTION> <OPTION value=秩父>秩父</OPTION> <OPTION value=熊谷>熊谷</OPTION> </SELECT> のように並び替えるにはどうしたらよいでしょうか? ちなみに $html = s/((?:\G|>)[^<]*?)\n/$1/g; のように書いたのですがうまくいきませんでした。
正規表現ばっか('A`)
524 :
質問 :2005/04/15(金) 18:52:11 ID:jvrJ4EBi
>>522 ありがとうございました。ちょっと難しすぎて分かりませんでした・・・orz
再び正規表現ですいません。
<市部:さいたま>
<郡部:吉見>
<市部:秩父>
<市部:川越>
↓上のデータを
<市部:さいたま市>
<郡部:吉見>
<市部:秩父市>
<市部:川越市>
のように先頭から「<市部:●●>」とマッチングするものを、
「<市部:●●市>」に置き換えるにはどうしたらよいでしょうか
(ただし、「●●」は流動的なものとする)
$data =~ s/<[市部:]*>/<市部:$_市>/;
上のようにやったところ、$_に何も値が入りません。
526 :
nobodyさん :2005/04/16(土) 01:58:57 ID:zFFmYmjw
528 :
nobodyさん :2005/04/16(土) 02:09:25 ID:zFFmYmjw
>>528 フォーム画面では表示されないのですが、確認画面では表示されてしまいます。
それを隠す方法はあるのでしょうか?
530 :
516 :2005/04/16(土) 18:09:31 ID:???
>>518 さんにいいページを紹介してもらいました。
いろいろやったら、結局、入力および出力はそれぞれ同じに
しておかなければだめだということが分かりました。つまり、
<STDIN>からの入力とwhile(<>)で読み込む入力が異なって
いたのでだめだったようです。そこで、以下のようにしたら
OKでした。
----------
use Encode;
use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis';
$| = 1;
print "input a search word: ";
# print "";
chomp($search = <STDIN>);
print "$search\n";
# $word = encode('jis', $search);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$search/) {
print "$ARGV\n";
}
}
--------
ご報告まで。
誘導されてきました。 質問は下記にあるものなのですが、なにとぞ教えてください。 PerlでCGIなのですが、 例えば十個の$a1,$a2…$a10があり、 ここに10をランダムに格納していきたいのです。 …うまく説明できない… 例えば、 一回目は $a1=2,$a2=3,…$a10=1 でトータルで10 二回目は $a1=4,$a2=1,…$a10=2 でトータルで10 これを十回繰り返す。 という具合です。 判り難くて申し訳ないのですが、 なにとぞご教授下さいませ。
下手すると無限ループになりそうだな
つーか意味不明。やりたいことだけ書けよ。
10個の変数のトータルが10なら全部1しかありえない気がするが
1〜10じゃないの
536 :
nobodyさん :2005/04/16(土) 23:58:37 ID:kx2lH57m
すみません…どうもうまく説明できなくて… for($i=0;$i<=10;$i++){ ????????????????? } ↑ この?部分で$1~$10に限られた数値をランダムで入れていきたいのですが、 その処理の仕方がわからないのです。
配列にすれば?
>>531 http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_shuffle_an_array_random http://boobar.hp.infoseek.co.jp/bench/randlist.txt sub rand_num {
my @num = @_;
for (my $i = @num; --$i;) {
my $j = int rand($i + 1);
$j == $i && next;
@num[$i, $j] = @num[$j, $i];
}
@num;
}
for (1..10) {
print "$_ - ";
my($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10) = rand_num(1..10);
print join '/', $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10;
print "\n";
}
10個の似たような変数を使うなら、配列にするのが常識。 その上で、やりたい事がイマイチよく分からん。 10個の数の満たすべき条件は何? 10個の合計が10になる事? それとも、ひとつひとつの数が0以上10以下の範囲ならいいの?
>>538 前々から気になってたんですが、
その perlfaq に載ってる方法のランダム性ってどうなんですかね?
例えば 1,2,3,4,5,6,7,8,9,10 と綺麗に並んだのができる確率って
splice 使う方法だと 1/10! になりますが
速い方のだと明らかにこれより大きくなりますよね?
1/11!じゃないの?
543 :
T女の竹田 :2005/04/17(日) 16:21:33 ID:???
>>531 こんなのはどうかな?
@hash{1..10} = ();
@array = ();
for (1..10) {
$array[$_] = (keys %hash)[int(rand(11-$_))];
delete $hash{$array[$_]};
}
544 :
T女の竹田 :2005/04/17(日) 16:27:32 ID:???
考えてみたらハッシュ使う必要なかった… spliceの方がいいし。忘れてください。
>>531 シャッフル?
List::Utilが使えるのなら、List::Utilのshuffleで。
use List::Util qw(shuffle);
for(1..10){
my @a = shuffle(1..10);
print "@a";
}
546 :
nobodyさん :2005/04/18(月) 17:36:57 ID:uIr0c1v3
質問させてください。 ActivePerl-5.8.4.810-MSWin32-x86.msi OS:XpSp2 を使っています。 $pack = pack("C*", 0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00); とすれば普通にパックしてくれるのですが $pack = "0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00"; $pack = pack("C*", $pack); とした場合、パックしてくれません。 @pack = (0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00); $pack = pack("C*", @pack); としてみた場合も同じです。 0x7Eみたいなデータを変数にいれてpackするには どうしたらよいのでしょうか? アドバイスいただけるとありがたいです。
え っしと のぉハァ う w ww うぇうぇ w ぇ ハ っ け る ァ w おk w は w w
>>546 あとの方でいけると思うが。一応試してみたが大丈夫だぞ?
% perl -e 'print pack("C*", 0x7e,0x00,0xfe,0x40,0x52,0x00)' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@
% perl -e '@pack=(0x7e,0x00,0xfe,0x40,0x52,0x00); print pack "C*", @pack' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@
perl -M<module_name> の-Mの意味が分かりません。 ググってもわかりませんでした。 よろしくお願いします。
module_nameで指定したモジュールがインストールされていれば、それを読み込んでperlを起動する。 例えば、 perl -MJcode hoge.pl とかすると、hoge.plでJcodeをuse宣言してなくてもJcodeモジュールが使える。 まあ、使いたかったら普通にスクリプト内でuse書いておけばいいわけだし、普通の人間には不要。
552 :
549 :2005/04/18(月) 19:40:25 ID:???
ありがとうございました
>>551 perl -MJcode -e "print $Jcode::VERSION"
のようなワンライナーは普通の人間にも有用だと思うがな。
利用できるモジュールのヴァージョンをコマンドラインで調べるのは
「普通の人間」のする事ではないと言われればそれまでだがな。(w
554 :
546 :2005/04/18(月) 20:16:51 ID:???
getPack(); sub getPack { my @pack; my @hex1,@hex2; my $hex1,$hex2; open READ, '< C:\hex.txt'; foreach (<READ>) { chomp; if (/^#/ || $_ =~ /^\n/ || $_ =~ /^\r/) { next; } push @packet,$_; } close READ; for($i=0;$i < @pack;$i++){ ($hex1,$hex2) = split /,/, $pack[$i]; push @{$packed{'hex1'}},pack "C*", packHex($hex1); push @{$packed{'hex2'}},pack "C*", packHex($hex2); } #↓はとりあえず変換できているか確認するために表示させています。 #pack後はバイナリのため直接表示させて確認することができないので #packされたデータを元のhexデータに変換しています。 #ちゃんと可逆変換ができればきちんと動作しているという確認がとれると考えました。 print"確認 - Hex:".getHex($packed{'hex2'}[0])."\n"; print"確認 - Pack:$packed{'hex2'}[0]\n"; }
555 :
546 :2005/04/18(月) 20:17:27 ID:???
sub packHex { my $hex = shift; my @hex; @hex = split / /, $hex; @hex = map { "0x".$_ } @hex; return @hex; } sub getHex { my $data = shift; my $i; my $return; for ($i = 0; $i < length($data); $i++) { $return .= uc(unpack("H2",substr($data, $i, 1))); if ($i + 1 < length($data)) { $return .= " "; } } return $return; } sleep(999999);
556 :
546 :2005/04/18(月) 20:17:53 ID:???
txtに書いてあるhexデータは一行ずつ書かれていて 00 00 00 00 FF FF 01 00 02 00 00 00,C8 FB 6A 0A こんな感じです。 連書き失礼します。 情報を小出しにするつもりはなかったのですがあまり長々と書いてもいけないと 思って簡略に書いてしまいました。 このようなコードを書いたのですがどうしても push @{$packed{'hex1'}},pack "C*", packHex($hex1); この時点でうまくpackしてくれません。 私もpackできるものだと思っていただけに原因がわかりません。 重ねてアドバイスお願いできますでしょうか。
>>554-556 > my @hex1,@hex2;
my(@hex1), @hex2; と解釈されるが、それは意図通りか?
> push @packet, $_;
@pack ではなく?
#!/usr/local/bin/perl -w
use strict;
sub packHex { map pack('H2', $_), map split(/ /), @_ }
sub getHex { join ' ', map uc unpack('H2', $_), @_ }
my(@hex1, @hex2);
while (<DATA>) {
next if /^[\n\r#]/;
chomp;
my($hex1, $hex2) = split /,/;
push @hex1, packHex($hex1);
push @hex2, packHex($hex2);
}
print getHex(@hex1), "\n";
print getHex(@hex2), "\n";
__DATA__
00 00 00 00 FF FF 01 00 02 00 00 00,C8 FB 6A 0A
558 :
546 :2005/04/18(月) 22:33:33 ID:???
>>557 レスありがとうございます。
ご指摘のとおり2箇所間違っていました。
更にはアドバイスどころかこんなコンパクトなコードまで
書いていただいいてありがとうございます。
あともうひとつだけできないことがありまして
print getHex(@hex1), "\n";
をした場合に"C8 FB 6A 0A"このように表示されるようにしたいのですが
(つまりバイナリデータを配列の1要素として格納したい)
557さんのコードを元に
$i=0;
while (<DATA>) {
next if /^[\n\r#]/;
chomp;
my($hex1, $hex2) = split /,/;
$hex1[$i] = packHex($hex1);
$hex2[$i] = packHex($hex2);
$i++;
}
close DATA;
#ためしに一行目のデータだけを表示
print getHex($hex1[0]), "\n";
print getHex($hex2[0]), "\n";
このようにしてみましたがうまくいきません・・・
>>556 とりあえず文字列"0x10"は数値として解釈されると0x10(=16)では
なくて0になるってことに気をつけるべきだな。
>>558 >>1 > 3: こんなエラーが出て上手く行かなかった。
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_join_EXPR_LIST http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_map_BLOCK_LIST http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_pack_TEMPLATE_LIST http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_push_ARRAY_LIST http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_split__PATTERN__EXPR_LIMIT http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_unpack_TEMPLATE_EXPR http://perldoc.jp/docs/perl/5.8.1/strict.pod sub packHex { join '', map pack('H2', $_), split / /, pop }
sub getHex { join ' ', map uc unpack('H2', $_), split //, pop }
sub packHex { my @chr = split / /, pop; pack 'H2' x @chr, @chr }
sub packHex { local $_ = pop; s/\s+//g; pack 'H*', $_ }
561 :
546 :2005/04/19(火) 11:21:09 ID:???
>>560 たびたびありがとうございます。
すいませんでした。
テンプレの基本がなってませんでした。
各関数の詳細解説までつけていただいてありがとうございます。
perldocというのがあるのですね。
これは凄くありがたいです。
packHexにもいろいろなやり方があっておもしろいです。
これから少しずつ噛み砕いて見ていこうとおもいます。
かなりお世話していただいて本当にありがとうございました。
562 :
質 :2005/04/19(火) 12:56:26 ID:xzzJhUPg
「EUC-JP」で保存したログファイルを持つ掲示板に書き込むと自動的に「SHIFT-JIS」で保存されてしまいます。 「ECU-JP」で保存されるようにするにはどのようにすればよいのでしょうか?
>>562 jcode.plとかで文字コードをEUC-JPに変換して保存する。
564 :
質 :2005/04/19(火) 14:33:26 ID:xzzJhUPg
>>563 お答えありがとうございます。
ところがjcode.plをEUC-JPで保存出来ないんです。
他のファイルは出来るのですけど。。。
>>564 jcode.plを使って保存する文字列のコードをEUC-JPに変換する。
&jcode::convert(\$hoge,"euc-jp","sjis");
貴方の文脈では、jcode.pl自体をEUC-JPで保存しようとしてるぞ。
本当にそうだったりしてw
perlでテキストファイルの特定の部分を拾い出し、それを配列の中にぶち込みたいと思います。 --start_of_aaa-- あああ ← いいい ←この部分を@aaaに ううう ← --end_of_aaa-- --start_of_bbb-- かかか ← ききき ←この部分を@bbbに くくく ← --end_of_bbb-- --start_of_ccc-- さささ ← ししし ←この部分を@cccに すすす ← --end_of_ccc-- open (TMPL,'./tmpl.dat'); @templates = <TMPL>; close TMPL; foreach $line (<@templates>){ if($line =~ m|--start_of_aaa--|){ unless($line =~ m|--end_of_aaa|){ push @aaa,$line; }else{ last; } } if(以後同様の繰り返し) } 当然@aaaには--start_of_aaa--しか入らないのですが、ここで詰まってしまい、先に進めません。。。
>>566 漏れならこうするかなあ。
my %data = ();
my $key = "__GOMI__";
foreach my $line (<@templates>) {
if ($line =~ m/--(start|end)_of_(\w+)--/) {
$key = ($1 eq "start") ? $2 : "__GOMI__";
$data{$key} = [];
} else {
push(@{$data{$key}}, $line);
}
}
my @aaa = @{$data{"aaa"}};
my @bbb = @{$data{"bbb"}};
my @ccc = @{$data{"ccc"}};
568 :
nobodyさん :2005/04/19(火) 16:19:21 ID:n4Wb5OBG
お尋ねしたいのですが、 メールフォームのデータをCSVに保存するCGIの改造です。 吐き出されたデータが"xxxx"という風にダブルコーテーションで囲まれてしまいます。 これを外して登録したいのですが、ご教授お願いします。 $head = "DATE"; $head.= join("\",\"", 'DATE', @KEY); $out_data = join("\",\"", @output); if (-f $f2m_file){ open(OUT, ">> $f2m_file") or &openerr(); flock(OUT, 2); seek(OUT, 0, 2); } else{ open(OUT, "> $f2m_file") or &openerr(); flock(OUT, 2); seek(OUT, 0, 0); print OUT jcode("\"$head\"")->sjis."\r\n"; } print OUT jcode("\"$out_data\"")->sjis."\r\n"; close(OUT); chmod(0644, $f2m_file); }
569 :
質 :2005/04/19(火) 16:37:39 ID:xzzJhUPg
>>565 いやあ、お恥ずかしい、その通りでしたw
ソースを書き換えて出来るようになりました。ありがとうございます。
570 :
566 :2005/04/19(火) 17:19:41 ID:???
571 :
nobodyさん :2005/04/20(水) 00:36:08 ID:PF1TJn1K
わからないので質問させてください。 CGIなどによく「***.cgi?mode=find」みたいな感じでリンクになっていたりしますがmode=findの部分はどういう仕組みになっているのでしょうか?
>>571 はい、Perlに関係ないです。
しかもコーディングスレです。
573 :
nobodyさん :2005/04/20(水) 05:06:40 ID:2zJFmw5b
見込 売上確定 3/31 新井 50000 4/1 伊藤 10000 4/10 新井 -50000 50000 4/10 上田 20000 4/15 新井 30000 4/17 伊藤 -10000 10000 4/17 伊藤 40000 こんな感じのテキストデータがあって、 スタッフごと・月ごとに売上確定分や売上見込の集計を出したいんだが… スタッフは単発もいるので、あくまでこのデータだけから抽出したいけど、 どうすればいいんだろうか。if文使いまくりになりそうで。
>>573 タブ区切りの場合:
while(<>){
if(/^(\d+)/){$tuki=$1;}
if(defined $sengetu and $sengetu != $tuki) {
print "$sengetu月\n";
foreach $key (keys %mikomi) {
print "$key: 見込=$mikomi{$key} 売上確定=$uriage{$key}\n";
}
undef %mikomi; undef %uriage;
}
if (/^\d/) {
split(/\t/,$_);
$mikomi{$_[1]} += $_[2];
$uriage{$_[1]} += $_[3];
$sengetu=$tuki;
}
}
print "$sengetu月\n";
foreach $key (keys %mikomi) {
print "$key: 見込=$mikomi{$key} 売上確定=$uriage{$key}\n";
}
過疎地だから、飛び入りにはやさしいスレです。
577 :
573 :2005/04/20(水) 09:47:22 ID:???
うおお!もうレスが!
>>574 >>575 ありがとう。
昨日一人で考え込んで明け方になっちゃったんだけど、
まさか起きたらもうレスがついてるとは思わなかったよ。
>>576 の言うとおりだね。厚意をありがたく思います。
つか、
>>575 をコピペでいけちゃいそうだぞw 申し訳ないっす。
>>577 >>575 だけどさ、まあいいってことよ。
その代わり、Perlを宣伝しろよな。
Perlに利害関係があるわけじゃないけどさ、このごろrubyが
幅利かせすぎだよね。
>>576 >過疎地だから、飛び入りにはやさしいスレです。
1年前or半年前くらいは、すっごいレスの伸び様だったがな。
何かさ、やっぱrubyに食われてる?それともphpか。
>>579 rubyやpythonに行くぐらいならjavaがいいや。
phpはApacheとの連携が強力なのでいっそJakarta Projectに
加わってApacheの標準Scriptの地位を固めてくれんかな。
>>575 を弄ってみた
while(<DATA>){
split/\t/;
$_[0]=~s/\/\d+$//;
$hash{$_[0]}{$_[1]}{miko} += $_[2];
$hash{$_[0]}{$_[1]}{kaku} += $_[3];
}
foreach my $tuki(sort{$a<=>$b} keys %hash){
print "$tuki月\n";
foreach my $name(sort keys %{$hash{$tuki}}){
print "$name:\t見込=$hash{$tuki}{$name}{miko}\t売上確定=$hash{$tuki}{$name}{kaku}\n";
}
}
おお…
通常CGIに引数を渡して呼び出す場合、 a.cgi?k=1のようにアドレスバーに引数を含むアドレスが表示されますよね CGIゲームなどをやっているとこの引数が表示されない場合があるのですが そういう風に引数を見えなくするにはどうしたらいいのでしょうか
method="post" CGIスレとかWeb制作板で聞いてね
585 :
nobodyさん :2005/04/21(木) 09:48:59 ID:u958lKZ/
perlスクリプト内でPAHT,LD_LIBRALY_PATHを設定することは出来ますか? スクリプトを手動で実行すると動くのですが、cronから実行すると ライブラリが見つからないと怒られてしまい困ってます。
自プロセスの環境変数を設定するだけだったら、問題なく可能
掲示板系のCGIでmy変数などって使ったほうがいいのでしょうか。 全部グローバル変数でやってまして最近my変数を覚えたんですけど、 KENTの掲示板などを落として見てみてもmy変数使って無いですし、 そんなに長い処理でもないと思うので、そこまで気を遣う必要ってないのでしょうか。 自作しているのは、サブルーチンの階層も深くて2つまでです。
KENTを参考にしている時点でぬるぽだな
サブルーチンの階層って何だw myは便利だよ。 もう my のない世界なんて考えられないって程に。
俺が勉強したての時に参照したCGIは、モジュール化に物凄い気を遣ってて見やすかった。 直せるうちに直しておいた方が、後で改造するときに分かりやすいと思う。 変数名なんて三日も空けば忘れるからな。 ちょっと手間をかけておく事で、後の面倒を大きく減らせる。 他のプログラム言語なんかも学ぶなら、my変数のような考え方は必須になる。 グローバル関数を無くし関数の独立性を高めるという考えは、カプセル化、そしてオブジェクト指向に繋がっていく。
my っていうか ruby -w と use strict は使うクセを付けておいた方が良いと思う。
>ruby -w 詳しく。
ごめん perl -w だた。
今はuse warnings;で代用できるよん。便利です。
596 :
nobodyさん :2005/04/22(金) 07:08:46 ID:0S2C2eid
lzh扱えるモジュールないっすか?
thx そこでで聞いてみるっす
¥nと¥の違いがわかりません ググっても出ないorz
ぐああ すんません わかりました
ワロス
$a01+$a02+$a03+$a04+$a05+$a06+$a07+$a08 これをもうちょっとこざっぱりとまとめて書きたいんですが… どうしたらいいでしょうか?
配列を使え
$aa=~s/$hensu1/$hensu2/g; この例で、$hensu1 にどのような文字列が来るか分からない時は、 必ず、 $aa=~s/\Q$hensu1/$hensu2/g; とすべきなのでしょうか? また、例えば、 $aa="ポっポっポ、はとポっポ"; $aa=~s/ポ/ぽ/g; print $aa; これでは、文字が化け化けで、 $aa="ポっポっポ、はとポっポ"; $aa=~s/\Qポ/ぽ/g; print $aa; とすれば正常になりますが、「ポ」と同じように\Qでクォートしなければ いけない文字は、他に何がありますか?というか、どのような理屈で クォートしなければいけないのでしょうか?
変数名を動的に(?)作ることできますか。 perl -e '$a0=1; $a1=2; $a2=3; for(0..9){print "$a$_\n";}' みたいなんで$a0から$anまでの変数を作りたいんですが、これじゃ 変数名としてつながってくれないんです。
% perl -e '$a0=1; $a1=2; $a2=3; for(0..9){print "${'a'.$_}\n";}' 詳しくは「シンボリックリファレンス」をキーワードに調べてくれ。 しかし一応できるこたできるが、よっぽど特殊なことをやろうと 言うんじゃない限りはじめから配列かハッシュ使ったほうがいいと 思われ。
>>607 ありがとうございました。なるほど{}ってシンボリック
リファレンス作るにも使うんですね。メモメモっと。
シンボリックリファレンスの概念をあっさり理解できるのに、配列は使えないのか? それとも、配列を使えない事情があるのか? >607のコードが使える状況で配列が使えない状況ってのが思いつかんのだが…
マシン語→C→Perlと歩んできたに違いない。 リファレンスは意外と馴染みやすい。
なんつーかeval使った方が・・
>>609 ごみんなさい、わては
>>602 じゃないです。
もち
>>602 の場合は、配列でしょうが、
コマンドラインでワイルドカードを引数において、たくさんのファイルを
読んでそのファイル名に応じた変数を作りたかったのです。
便乗質問の積もりですた。
>>612 わるいことはいわないのでファイル名をキーにした
ハッシュにしとけ
すみません、質問させてください。 登録されたデータ(ログファイル)から任意の3つくらいを抽出したいのですが、 このとき重複しないような方法がわかりません。 具体的にいうと、タグを何個か1つのログに登録しておいてそのなかの3つくらいを重複しないようにランダムに出したいのです。 randでやったらどうしても重複してしまいます。
>>615 以前に抽出したもの(index番号等)を覚えておいて、新しいものを選ぶ度に重複していないかチェック。
>>615 んじゃ、
>>616 さんと違う手法で、
ランダムに並べ替えてから、任意の3つを取る。
@tag = ('big','small','strong','table','input','img');
for(@tag){
$hoge = rand(@tag);
($tag[$_],$tag[$hoge]) = ($tag[$hoge],$tag[$_]);
}
for(0..2){
print "$tag[$_]\n";
}
my %aaa = ( 'a' => '0', 'b' => '1', 'c' => '2', ); my @bbb = ( ['ab','ac','ad',], # 0 ['be','bf',], # 1 ['cg',], # 2 ); # このようなデータを用意しておき、 my $data = "abc"; # というデータを与えた時に my @list = ( 'abbecg', 'abbfcg', 'acbecg', 'acbfcg', 'adbecg', 'adbfcg', ); # @listのような配列を作り出したいのですがどなたか教えて下さい。 # (1) %aaaのa,b,cの部分は英数字と記号が入ります。 # %aaaの0,1,2はそれぞれ順番に数字を割り当てています。 # (2) @bbbの一次元目の数値は%aaaの0,1,2と一致します。 # @bbbの二次元目の要素数は固定ではなく変化します。 # (3) $dataは%aaaに該当するものがあった場合にのみ「a→ab」のように変化し、 # %aaaに該当するものが無い場合は「z→z」のように変化しません。 # 現在は以下のようにしてランダムに出力しているのですが、 # 今やりたいことは出力される可能性のある文字列全てを取り出したいのです。 # 分かりにくくてすいませんが宜しくお願い致します。 > my $compdata = ""; > for(split//,$data){ > if ( $#{$bbb[$aaa{$_}]} || $bbb[ $aaa{$_} ][0] ne "" ){ > $compdata .= $bbb[ $aaa{$_} ][ rand $#{$bbb[$aaa{$_}]} ]; > }else{ > $compdata .= $_; > } > }
こういうことかな。もっとかっこいいのが出てくると思います。 my @list; for (split //,$data){ my $comp; if(defined $aaa{$_}){ $comp=$bbb[0]->[$aaa{$_}]; }else{ $comp=$_; } for (@{$bbb[1]}){ my $temp=$comp; $comp.=$_; for(@{$bbb[2]}){ my $temp=$comp; $comp.=$_; push @list, $comp; $comp=$temp; } $comp=$temp; } $comp=""; } for(@list){ print $_,"\n"; }
>>619 #!/usr/local/bin/perl
use strict;
my %order = (a => 0, b => 1, c => 2, d => 3);
my @data = (
[ 'ab', 'ac', 'ad' ],
[ 'be', 'bf' ],
[ 'cg' ],
[ 'dh', 'di' ],
);
my @result;
my_push(\@result, [ @data[@order{ split //, $ARGV[0] }] ]);
print join "\n", @result;
sub my_push {
my($result, $data, $i, $pre) = @_;
if ($i == $#{$data}) {
push @{$result}, map "$pre$_", @{$data->[$i]};
}
else {
my_push($result, $data, $i + 1, "$pre$_") for @{$data->[$i]};
}
}
622 :
619 :2005/04/24(日) 02:01:01 ID:???
>>620 さん
ありがとうございます。
言葉が足りずに申し訳ございません。目的のものとは違ったようです。
$dataの文字数は毎回異なります。
>>621 さん
ありがとうございます。
分かりにくい表現で申し訳ございません。
入力される文字列は設定済みの文字列だけではなく、
> %order = (a => 0, b => 1, c => 2, d => 3);
ではa,b,c,dが設定済みですが、e,f,g...x,y,zのような、
未定義の値が入力されることもあり、その場合は変化しないように出来ると嬉しいです。
とはいえ、後は何とかなりそうなの気がするので頑張ってみます。
お二方、本当にありがとうございました。
書き込みしてからも色々と調べていたのですが、
my %CCC = (
'a' => ['ab','ac','ad',],
'b' => ['be','bf',],
'c' => ['cg',],
);
こんな書き方も出来るのですね。
本当にありがとうございました。
引き続き頑張ってみます。
また、分からないことがあったら宜しくお願い致します。
ずこー
$var =~ m/nantoka/; = $var =~ /nantoka/; $var =~ m/nantoka/igo; = $var =~ /nantoka/igo; mって使う必要ないと思うんだけど、みなさん、いつ使ってます?
>>624 '/' を正規表現に含める時。
/^([^\/]*)\/([^\/]+)\/(.*)\z/;
/^ ([^\/]*) \/ ([^\/]+) \/ (.*) \z/x;
m|^([^/]*)/([^/]+)/(.*)\z|;
m|^ ([^/]*) / ([^/]+) / (.*) \z|x;
>>624 謝りたい気分の時。
$str =~ m(_ _)m;
( ´∀`)ワラタ
>>625-626 レスありがとうございます。
なるほど、/のエスケープを省略したいときですね。
誤りたいとき使うとまた誤らなきゃですね(w
どもども。
JAPUたん降臨希望age
ちょっと上でも出てた話題にかぶるかもしれないんですが・・・ @list($h01,$h02,$h03) $h01〜03に、例えばそれぞれ0,0,1と代入されている時 @listの中のどの変数に1と入っているかを確認するには?indexを使うんでしょうか? if (@list==1) {・・・(以下続く) これは間違ってる書き方ですがorz、 こんな風に『@listの中の変数のどれかが1であれば・・・』と 条件文の中に組込みたいのです。
631 :
nobodyさん :2005/04/26(火) 14:53:56 ID:OvccyAYT
あげさせて下さい
>632 ありがとう!やってみます。
634 :
nobodyさん :2005/04/26(火) 18:10:21 ID:6+zG2+f5
何度もすみません・・・もう1ついいでしょうか。 $aaaが一定以上の値になった時、変動する$aaaをその値以上に固定する というのはどう書けばいいでしょう? if ($aaa >= 10) { $aaa != 10 ;} 何か違う・・・orz
!消せばいいだけでは。
>635 すみません、説明が悪かったです・・・ $aaaは10以下にはならず、10以上の値には変動できる、という書き方です。 !を消すと$aaaは10、になってしまうので。。
>>636 10以下ならもう一度変動させれば?
あと「以下」と「以上」の使い方がおかしい。
10はどっちにも含まれるぞ?
$aaaがどう動く、どういう性質の変数なのか分からんと、どう変えていいものか迷う。 乱数なのか、ユーザの入力値なのか、1ずつ減るカウンタ用の変数なのか、二次関数みたいな関数の値なのか。 $aaaに10を代入するのは何故いけないの? $aaaに10を加算するだけでは駄目?
639 :
nobodyさん :2005/04/26(火) 20:37:06 ID:6+zG2+f5
>637 ほ、ほんとだすみません、10未満にはならず、10以上の値には変動できる、です。 >もう一度変動させれば? 言われて気付いたんですが・・・、ここで出た結果のみで判断させたいんですorz if ($aaa >= 10) { !($aaa <= 10) } これだと10以上ではない、と言うだけですよねアー
640 :
634 :2005/04/26(火) 20:47:57 ID:???
>638 ええと、説明下手なんですが・・・ >ユーザーの入力値 はい、そんな感じです。 $aaaは値が1ずつ加算されて、上限(例えば100)で止まる、といった動きをします。 ゲームなどで得点が1ずつ増えていくような・・・ なので、代入や一気に加算する、といった性質の変数ではないです。
>>640 その処理をするには、3つの値(変数)が必要なんですよ。
1. 変動する値 (1ずつ加算される値)
2. 上限値 (100)
3. 保持する値 (上限値に達するまでは1と一致して、それ以降は2と一致)
文章で書くと$aaaと表現するので分かり辛いかも知れないですけど、
1.を比較等の色々の処理をした結果が3.になるわけで、これを1つの変数$aaaで表す事はできません。
642 :
634 :2005/04/26(火) 22:41:02 ID:Bt64jE3X
>641 詳説、ありがとうございます。目から鱗です。orz 変動する値の$aaaと、上限値$bbb、保持する為の変数が$ccc $bbb=100; #ここで$aaaを1ずつ足していく #で、もし$aaaが10に達したら・・・ if ($aaa >= 10) { ・・・・この先がわかりません・・・
>>642 if($aaa<10){
$aaa++;
}
>>642 $aaaが$bbbに満たっていない間、$cccに$aaaを代入すればいいだけだろ。
646 :
638 :2005/04/27(水) 02:39:01 ID:???
>639 比較と代入の理解が滅茶苦茶だな。 <=とか==とか<は比較をするだけで、値を変化させるわけじゃないぞ。 if($aaa > $bbb) $ccc = $bbb; else $ccc = $aaa; お前が本当にやりたい処理は 「$aaaが上限値($bbb)より大きいときは、$aaaを上限値にする」じゃないか? ちょっと落ち着いて、場合分けして考えてみるといい。 個人的には if($aaa > $bbb) $aaa = $bbb; でじゅうぶんな予感もする。 上限値に切り揃える前の点数のデータが不要ならば、の話だけど。
647 :
638 :2005/04/27(水) 02:40:06 ID:???
>646 >「$aaaが上限値($bbb)より大きいときは、$aaaを上限値にする」 ちょっと誤解を招く表記だな。 「$aaaが上限値($bbb)より大きいときは、$aaaを上限値と等しい値にする」 に訂正。
1づつ足していけばこう変動するしかなかろう。 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20... これをどう変動させたいのだ?
プログラムの一箇所で「この変数の値は絶対を超えません」と宣言すれば 他のところで何やっても10までしか上がらない ということを希望してるのか? それだったら、$aaa 専用のクラスを一つ作って、専用の add() メソッドを実装しろ $aaa 専用に += や ++ 演算子をオーバーロードするのも吉
こんな質問しちゃうやつがクラスやメソッドが理解できると思ってるの?
651 :
634 :2005/04/27(水) 12:41:57 ID:???
何度もすみません・・・ >比較と代入の理解が滅茶苦茶 はい、値を変化させるものではないのはわかっているんですが、表現が思いつかず・・・ >プログラムの一箇所で「この変数の値は絶対を超えません」と宣言すれば >他のところで何やっても10までしか上がらない はい、そんな感じです。 ただ、10までしか上がらないのではなく、10より下には下がらない、というのを希望しています。 add() メソッドは、調べてみたのですがちょっと難しくてわかりませんでした。 折角紹介してくださったのにすみません。
652 :
634 :2005/04/27(水) 12:42:18 ID:???
こちらの知識不足と情報を小出しにしてしまったせいで、 余計何したいのかがわかりにくくなってしまいましたよね・・・・orz 下限0から始まって上限100で止まる 0から始まって、ユーザーの入力にあわせて1ずつ加算・減算されていく (加算と減算は別のところで処理させるつもりでした) 0 1 2 3 4 5 6 7 8 9 10 10まで達したら、 11 12 13 14 15 16 17 18 19 20... 引き続き加算と減算が行われるが、一旦10以上になったら、 それ以降は減算されても値は10未満にはならず、10〜100の間で上下する こんな動作をさせたいと思っていました・・・
>>652 10を越えた時点でフラグを立てればいいんじゃないの
if ($aaa >= 10) $flag = 1;
if ($flag && $aaa < 10) $aaa = 10;
>>646 >>653 一応突っ込んでおくが Perl にぶら下がり if は無い。
Perl のスレなんだから Perl で答えてやれよ。
>>654 「ぶら下がり if」って一般的な用語なの?
「dangling else」なら聞くけど。
日本語ではぶら下がりifと言うんだよ。
657 :
654 :2005/04/27(水) 14:39:18 ID:???
658 :
652 :2005/04/27(水) 15:01:10 ID:FBojevS6
こういうことでしょうか? $flag=0; if ($aaa >= 10) {$flag = 1;} #$aaaが10以上の場合、$flagが立つ if ($flag= 0 && $aaa < 10) { $aaa = 10; } #$flagが立っておらず、$aaaが10より小さい場合・・・$aaaは10 ?????orz 10より下に行かないようにするって処理を どう書いてやればいいのかわかりません・・・
659 :
nobodyさん :2005/04/27(水) 15:06:58 ID:4gECGjaS
質問です。 phpの正規表現で ereg(.*[EGG|EVA].*, $str); とした場合、マッチするのは*****EGG****か*******EVA*******と言う $strで良いのでしょうか?
660 :
nobodyさん :2005/04/27(水) 15:09:21 ID:I4dBvpe7
Perlではif にぶら下がり文({}の省略)は許されないということですね。
でelseをぶら下がり文に使った時に起きる問題がdangling else
>>658 おまえにプログラミングは無理だ
661 :
nobodyさん :2005/04/27(水) 15:11:46 ID:4gECGjaS
ごめんなさい。phpスレと間違えました。orz
ActivePerl 5.8.6で、 binmode(STDOUT,":encoding(charset)"); を使うと、必ず $! に Bad file descriptor と入ってしまうのですが、 どうにかならないのでしょうか。 調べてみても 「binmodeを使えばすでに開いているファイルハンドルにPerlIOレイヤを設定できる」 としか説明されておらず、このことには触れていないようなので、発生するのはActivePerlだけなのでしょうか…。 binmode(STDOUT,":utf8"); binmode(STDOUT,":bytes"); などの":encoding(charset)"が無いの場合は、エラーは起こりません。 shift_jisで出力したいので困ってしまって…。
>>658 基本的に「10より下にいかないようにする」ことはできないと思ってくれ
代わりに「10より下にいくたびに無理矢理10に戻す」処理を行なう
それも、スクリプト中の下にいきそうな可能性のある箇所全てで、ということになる
if ($flag= 0 && $aaa < 10) { $aaa = 10; } というのは
「もしフラグが立っていて、つまり $a が10以上になったことが過去あって、
しかも現在 $a が10を下回っていたら、$aを無理矢理10に戻す」
という意味だ
>663 ああー、わかりました・・・!!!! まずできる事とできない事の切り分けができていなかったんですねorz 今回のやり取り、ホント勉強になりました。皆さんありがとうございます。
>>662 つか $! にそのメッセージがセットされても -w 下で警告が出るわけで無し、
#!/usr/local/bin/perl -w
use strict; use Encode qw(from_to);
from_to(my $str = "いーゆーしーじぇーぴー\n", 'euc-jp' => 'utf8');
utf8::decode($str);
binmode STDOUT, ':encoding(shiftjis)';
print $str;
…でちゃんと Shift_JIS で出力されるし、何か困る?
#!/usr/local/bin/perl -w
use strict; use encoding 'euc-jp', STDOUT => 'shiftjis';
print "いーゆーしーじぇーぴー\n";
だと $! はセットされないね。
何にしても
<q cite="
http://search.cpan.org/~nwclark/perl-5.8.6/pod/perlvar.pod#$! ">
If used numerically, yields the current value of the C errno variable, or in
other words, if a system or library call fails, it sets this variable. This
means that the value of $! is meaningful only immediately after a failure:
</q>
だから、システムコール系の関数でエラーした時にそのエラー内容を
調べる以外の用途で $! の値を見ても意味無いよ。
>665 なるほど、システムコールに失敗したとき以外の $! は何の意味も持たないんですね。 binmode(STDOUT,":shift_jis"); みたいな間違いをしたとき、期待した文字エンコーディングにならないだけで、 -wで警告もでなければ、エラーも起きず、$!を見てみると No such file or directory になっていたので、 これもまた表にでないエラーが起きているのかと思ってしまいました。 use encodingは、グローバルなんでちょっと使えませんでした。 他で何カ所かファイルを読み込むときに、それぞれのファイルの文字エンコーディングが統一されていない為です。 スッキリしました。 お返事、どうもありがとうございます。
> binmode(STDOUT,":shift_jis"); すいません、警告でてました…。 warningsToBrowserでは表示されないみたいですね。 コマンドラインから実行したらきっちり、Unknown PerlIO layerってでてました。
#$bbbに100をセット $bbb = 100; #最初の入力プロンプトを出力 print "> "; while(<STDIN>){ #入力が数値の場合、$aaaから入力分を減算 if(/^\d+$/){$aaa -= $_;$flag = 1} #入力が空の場合、$aaaに1加算 elsif(/^$/){$aaa++;$flag = 0} #入力が数値または空以外の場合、終了 else{last} #入力が減算かつ$cccの値が10以上かつ$aaaが9以下の場合、$aaaに10をセット if(flag && $ccc>=10 && $aaa<=9){$aaa = 10} #$aaaが負の場合、$aaaに0をセット elsif($aaa<0){$aaa = 0} #$cccの値が$bbbより小さい場合、$cccに$aaaをセット if($ccc<$bbb){$ccc = $aaa} #現在の$cccを出力 print "$ccc\n"; #次の入力プロンプトを出力 print "> "; }
>>668 は if(flag && の記述が間違っているし
$flagの処理は無くてもいいから下のように書ける。
$bbb = 100;
print "> ";
while(<STDIN>){
if(/^\d+$/){$aaa -= $_}
elsif(/^$/){$aaa++}
else{last}
if($ccc>=10 && $aaa<=9){$aaa = 10}
elsif($aaa<0){$aaa = 0}
if($ccc<$bbb){$ccc = $aaa}
print "$ccc\n";
print "> ";
}
# '+' で +1 、'-' で -1 、それ以外で終了 my($m,$n,$i)=(10,100,0); # min, max, start do{print$i=$2?$i==$n?$n:$i+1:$i==$m?$m:$i==0?0:$i-1,' > '} while<STDIN>=~/^((\+)|-)$/;
672 :
638 :2005/04/27(水) 21:21:37 ID:???
>654 >Perl にぶら下がり if は無い 最近Perl書いてないから忘れてたorz
673 :
nobodyさん :2005/04/27(水) 22:56:09 ID:D9rBVnk5
質問させてください。 ファイルの内容を print してから、 新しい値をそのファイルに追記したいのですが、 以下のようにやっても +>> のモードなのに ファイルの中身が取れません。 open( DATA, "+>> count" ); print <DATA>; print DATA qq(test\n); close( DATA ); 追記は出来ているんですが、 このモードでは読み込みができないのでしょうか?
674 :
103 :2005/04/27(水) 22:57:19 ID:???
他スレから移動しました(誤爆してしまった。。。恥) つかぬことをお伺いします。 掲示板への投稿内容を利用者に送信するというスクリプトを 作っている途中で思ったのですが、 sendmailを使って5通同報メールを送信する場合、 1)5回、メール送信動作を繰り返す 2)BCCに5通分のアドレスを記述してメールを送信する どちらがサーバー負担軽いのでしょうか。 #メールを5通出すということには変わりはないですが。 それ以前にどうやってBCCに複数アドレスを書くかという 問題にぶつかっていたりしますが(爆死
675 :
nobodyさん :2005/04/27(水) 22:58:40 ID:NwHD2MSR
元のスクリプトはMW-manager ver1.24。 DES方式のパスワード認証をMD5に変えようとしました。 はじめのパスワード設定はしっかりできました。 しかしいざ認証になると”パスワードが違う”となってしまいます。 CGIレスキューチャレンジ/www.rescue.ne.jp/cgi/md5/を読むと、 認証の部分はDESとMD5は同じとあったので、同じにしたのですが 考え方まずいんでしょうか(汗)
676 :
675 :2005/04/27(水) 22:59:05 ID:NwHD2MSR
$salt = "M1"; #マスターパスワードのセット:動作する sub pass_set { if($in{'setpass'} != $in{'setpass2'}){ &error("パスワード不適合"); } open PASS, ">$passfile" or &error("$passfileが開けませんでした。"); #ここを変えた↓ $pass = crypt("$in{'setpass'}", "\$1\$$salt"); print PASS "$pass"; close PASS; } #パスワードのチェック sub password_check { open(PASS, "$passfile") or &error("$passfileが開けませんでした。"); $pass = <PASS>; close PASS; if($in{'mode'} eq "login"){ #↓ここを変えた $in{'pass'} = crypt("$in{'setpass'}", "\$1\$$salt"); if($in{'pass'} eq $pass){ print qq(Set-Cookie: USER=1\n); }else{&error("パスワードが違います。");}#このエラーが出てる (以下略)
>>673 俺も初心者なんで良くわかんないけど
+>>ってあるの?
678 :
673 :2005/04/27(水) 23:11:04 ID:???
>>677 オライリーのラクダ本に書いてあったので使ってみました。
>> との違いは、読み出しがOKなだけみたいです。
そもそも +>> 自体が無い!?
>>673 たぶんファイルポインタがopen直後は末尾をさしてるとか
そんなとこじゃない? 読み出す前にseek DATA, 0, 0;してみ。
なにこのスレ('A`)
681 :
nobodyさん :2005/04/28(木) 01:39:04 ID:A2bYvrGq
>>673 printではなくpushはだめなの。
おまいら最近シリメツレツすぎ(´д`)
>>673 oepn直後に
print "tell:", tell(DATA), "\n";
でも入れてポインタの位置を確認。
# '+<'で読んだ後、seek(DATA, 0, 2)して追記でもいい気がする。
>>674 ルークよ、カンマを使え。
686 :
673 :2005/04/28(木) 09:25:16 ID:???
>>679 ,683,684
回答ありがとうございました。
ご指摘の通り、ファイルポインタの位置が原因で
読み込みができていなかったようです。
seek( DATA, 0, 0 );
を追加したところ、正常に読み込めました!
また、追記のときはファイルポインタの位置に
関係なく必ず末尾に挿入されるようです。
seek( DATA, 0, 0 );
の後だったので
seek( DATA, 0, 2 );
が必要かと思いましたが、
無しでも正常に追記できてました。
687 :
675 :2005/04/28(木) 10:20:23 ID:???
>>683 ぬ、そっちのスレでよかったんですね(汗
>>685 Σ(@@;;;
あぁ・・・そうか(汗
ありがとうございます。
>>686 ">>"でopenするとO_APPENDが指定されるので
writeは必ずファイルの末尾に行われる。
逆にいうと末尾以外のところにseekして書きたい
のに ">>"や"+>>"で開くとあれ?とかいうことに
なるので注意。昔やってしばらく悩んだ(笑)
ファイルを読み書き両方で開きたい & なければ
つくって欲しい & 存在すれば中身はそのまま
という条件で開こうとするとつい '+>>' 使い
たくなるんだよね...
689 :
673 :2005/04/28(木) 11:44:40 ID:???
>>688 >> だと必ず追記なんですね。なるほど。
色々と勉強になります。
今回も +>> 使ったの初めてだったので…
>664です 遅レスですが、>668さん、>670さん、 わざわざ書いて下さって感涙です・・・助かりました。 まだ知識も経験も少ないので、例があると理解しやすいです・・・ お礼もできましたので、これでホントに名無しに戻ります。 ありがとうございました。
691 :
nobodyさん :2005/04/28(木) 17:26:10 ID:tmfF6IZw
#SSL初期化 use Net::SSLeay qw(get_https post_https sslcat make_headers make_form); の部分で Can't locate Net/SSLeay.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.6/i686-linux /usr/local/lib/perl5/5.8.6 /usr/local/lib/perl5/site_perl/5.8.6/i686-linux /usr/local/lib/perl5/site_perl/5.8.6 /usr/local/lib/perl5/site_perl .) at test.cgi line 7. BEGIN failed--compilation aborted at test.cgi line 7. とエラーが出るのですが、なんだかわかりませんでしょうか。
パスが通ったところにライブラリがありません
694 :
nobodyさん :2005/04/28(木) 23:31:11 ID:xLVfIYcW
突然ですが、質問させて下さい。 テキストファイルを複数のCGIで書き込んだり呼び出したりしている のですが、最近急にデータがレコード単位で消えたりし始めました。 100レコードあったとすると、20〜30行だけが消えていたりして、 レイアウトがずれてる場合もあります。 ファイルロックは、書き込みをするCGIのみ記述しているのですが、 呼び出しのみのCGIも記述する必要があるのでしょうか?それとも プログラムミスの可能性の方が大きいでしょうか? 言葉のみの記述でうまく説明できていないかもしれませんが、なにか ヒントでもいいので教えて下さい。
読み込みにもロックしないと、別のプロセスが書き込んでる途中のを読み込んで、 くずれる可能性はあると思う。
惜しい。書き込んでる最中のものはロックされているので読み出せない。 読み込んでいる最中のファイルを書き換えられる、が正解。 同じく読み込み側でロックすることを薦める。
>>696 だうと。
プロセス A がロックしているファイルをプロセス B が読む場合、
・共有ロックか排他ロックか
・mandatory lock か advisory lock か
・advisory lock なら、B でロック状態をチェックするか否か
で話が変わる。
例えば A が advisory lock で排他ロックをかけていても、B が
自発的にロック状態をチェックし、ロックされていれば読み書きを
"控える" という事をしない限り、ロックとして正しく機能しない。
【Perl】ファイルロック(排他処理)について語ろう
http://pc8.2ch.net/test/read.cgi/php/1024795138/
まあ、ロックしてるって具体的には何を使ってるの?とかOSは何よ? とかわからないと議論できんな
699 :
nobodyさん :2005/04/29(金) 21:44:09 ID:s7r+/5xE
amezo2000のsock.cgiで unicodeで書かれたサイトの抜き取りができません どうすればいいですか
作者にメール送れば
多分ここに来てる人のほとんどがパソコンでコードを書いて、それをサーバーにアップして 何らかの日本語処理をしていると思うので、ちょっと質問です。 漢字はEUCを使っていますか? 日本語を扱う場合、当然EUCの方がはるかに問題が少ないので、EUCを使うべきでしょうが パソコンでEUCを使うのって、非常に面倒くさくないですか? ファイルをイチイチEUCで書き出さなければいけないし、簡単なデバッグするのに DOS窓で > Perl aaa.cgi としても、printで出力した漢字は化けるし....。 何か、簡単にEUC環境を作る方法ってあるのですか?
>>701 サーバにアップってのは、開発をローカルでやるわけ?
サーバがあるのなら、サーバで開発すればいいじゃん。
日本語処理を別個にしたりはしないんじゃない?エディタ使うだけだし、敢えて
別文字コード変換とかあってもエディタに変換機能ぐらいあるだろうし。
凄いこという香具師が居るな。
Shift-JISかUTF-8でソース書いてるよ。 文字コードを知った上で使う分には特に問題は起きないよ。 問題が少ないからとりあえずEUC使っとけ。って考えは間違っていると思うのだが。EUCにはあまりメリットを感じないし。
おもしろい釣りスレですね
GW?
>701 perl aaa.cgi > out.txt 俺はCGIとしての形をとっとと整えて、ローカルで鯖立ててテストするけど。 文字コードは何も考えずEUC。間違ってても動けばいいや。
テストはShift_JIS。 EUCやUTF-8などでリリースするときは 文字コードに依存する部分を変更してる。 文字コードの変換、 依存部分の変更はスクリプトで自動化。
>>701 Winではsjisを使う事が多い。
探せばeuc-jpで動くコマンドシェルはあるだろうけど、printの出力だけなら、
open(STDERR,"|nkf -uEs");
open(STDOUT,"|nkf -uEs");
system(join(' ',@ARGV));
とか
use IPC::Open3;
use threads;
use Encode;
$pid=open3(*I,*O,*E,@ARGV) || die "Can't exec @ARGV";
my $o = threads->create(sub {while(<O>) { Encode::from_to($_,'euc-jp','shiftjis');print STDOUT $_}});
my $e = threads->create(sub {while(<E>) { Encode::from_to($_,'euc-jp','shiftjis');print STDERR $_}});
$o->join;$e->join;
程度の手抜きで間に合わせたらどうかな。
TeraPadとかXYZZYや秀丸とかの高機能エディタをインスコして拡張子関連づけを設定
>>704 シフトJIS使ってたら、例えば、マッチングで検索の対象となる文字列、
検索する文字列に何がくるか分からない時などは、文字コードを知った上でも
対処のしようが無いと思うのだが。
712 :
702 :2005/04/30(土) 12:38:41 ID:???
なんか最近しきりにシフトJISだと正しくマッチできないとか言うヤシが多いよな。 某サイトの表現が悪いのか、読み手の読解力がないのか。。
\Q \E でくぉーとすればできる → マッチできる \Q \E でくぉーとしないとできない → マッチできない ってだけだろ。くだんねーこと書き込むな。
ところで
>>701 はコーディングと全然関係ない質問だったと思うのは俺だけか
HTMLタグを削除するのって $html =~ s/<.*?>//g; だけで良いですよね?
番号順にソートしたいのですが、うまくできません。 @a=(1,32,6,14); という配列があります これを 1,6,14,32という風な順番にしたいです。 @result=sort @a; という風にしても 結果は1,14,32,6という文字列の順番になってしまいます。 おねがいしますs
>>716 my @result = sort { $a <=> $b } @a;
719 :
702 :2005/04/30(土) 18:37:50 ID:???
無知は書き込むな
そこでuse encoding 'shiftjis'ですよ。
722 :
716 :2005/04/30(土) 18:59:52 ID:???
>>715 $html =~ s/<.*?>//sg;
じゃないかな。タグが1行で書かれてるとも限らないし。
おまいには
>>717 がHTMLに見えるのか?
まあ<.*?>だけだダメなケースがあるのも確かだが。
input が valid な HTML だと誰か定義したか?
あほすぎ。うざすぎ。
あれは例がイマイチだな。 <a href="〜" title="いれるなら<ここ>だ!"> Shift-JISで検索や置換するときは、タブとかでぶった切ってから処理するという荒業をやってる。もっとマシな手はあるんだろうけど。 $str =~ s/([\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]|[\x20-\x7e\xa0-\xdf])/$1\t/g;
>>728 おいおい、おまえもイマイチだぞ。
HTMLならたとえクオーテーション内でも < とか > は < や > って書かなければいけないことくらい知ってるだろう?
正しいHTMLの例で例外を例示しろよ。
コメントやCDATAなら<や>はそのまま使えるな。 これらの場合だけ別に処理すればいいでしょう。
んじゃこう? s/<!--.*?-->//sg; while (s/<[^<>]*>//g) { }
732 :
715 :2005/05/01(日) 15:56:33 ID:??? BE:20201832-#
なんかそういうのまとめたサイトがあったと思うんですが 忘れました・・
733 :
715 :2005/05/01(日) 15:57:42 ID:??? BE:188547078-#
すまん、*の後ろに?を勝手に脳内補完してたようだ。
マッチング演算子のmオプションで複数行の検索ができるというので やってみているのですが、ぜんぜんできません。何がおかしいんでしょうか。 use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis'; undef $/; open(FILE,"test.txt"); $text=<FILE>; close FILE; if($text =~ /本来/m) {print "OK!\n";} perlのバージョンは、v5.8.5 built for cygwin-thread-multi-64intで、 スクリプトおよび対象テキストの文字コード-改行コードは、すべてsjis-dos です。
738 :
737 :2005/05/02(月) 03:34:27 ID:???
>>737 の訂正です。
×「複数行の検索」→○「複数行にまたがる文字列の検索」
test.txtは、
----
おかしいな。区切り文字($/)未定義にすれば、本
来できるはずだが。
----
です。
mは^$の意味をかえるだけ。 sjisなら本の2バイトめが{になってるようだけど?
740 :
737 :2005/05/02(月) 03:44:31 ID:???
>>739 どんな文字でもだめです。そもそもuse encodingしてるから
そこら辺のエスケープはしなくていいものと思われ。
念のため、 「本\n来」じゃないよね?
>>737 違う、違うよお馬鹿さん。
mオプションってのは、イメージ的に
/^本来/m ≒ /(?:^|\n)本来/
/本来$/m ≒ /本来(?:$|\n)/
ってなるだけであって、そういう使い方じゃない。
open(FILE,"<:encoding(shift-jis)", "test.dat") or die $!; でうまくいった。
744 :
737 :2005/05/02(月) 08:14:55 ID:???
>>741-742 ども、mオプション使えね。
undef $/;
open(FILE,"test.txt");
$text=<FILE>;
close FILE;
if($text =~ /本\r\n来/m) {print "OK!\n";}
でOK!ですた。
>>743 encoding関係なく行けた。
745 :
737 :2005/05/02(月) 08:16:16 ID:???
間違え、 if($text =~ /本\r\n来/) {print "OK!\n";} が正解。mオプションなんて関係なかたてことですた。
モジュールがインストールされて無い場合のエラー処理はどうやれば良いのでしょうか? とりあえず、これだとダメでした。 eval { use Image::Magick; };
>>746 Test::Moreのuse_okを見るとrequireとimportにわけてevalの中でやってますね。
748 :
746 :2005/05/02(月) 15:20:42 ID:???
>>747 thx!
そもそもが間違ってますたorz
>>746 > eval { use Image::Magick; };
eval q{ use Image::Magick; };?
750 :
746 :2005/05/02(月) 22:35:06 ID:???
>>749 ありがとー。すんなり出来ました。
コンパイル時と実行時の違いの勉強になりますた。
疑問になったので質問です。 クラス内の変数をさまざまな表現で表示したい時は 「表示させる関数を用意する」と 「表示させるクラスを用意する」、どちらが一般的なのでしょうか。 もし使い分ける、などならメリットとデメリットも教えて頂きたいです。 PHPもオブジェクト指向も初心者なので的外れな質問だったらごめんなさい。 なお環境はPHP4.3.10 AN http WindowsXPです。 //クラス内に表示させる関数を用意する----------------- $text = new Text; echo $text->i(); class Text{ var $a="AAA"; function i(){ return "<i>{$this->a}</i><br>"; } } //クラス外に表示させるクラスを用意する----------------- $text = new Text; $html = new Html; echo $html->i(); class Text{ var $a="AAA"; } class Html{ function i(){ global $text; return "<i>{$text->a}</i><br>"; } }
↑激しくスレ違いゴメンナサイTT
753 :
nobodyさん :2005/05/05(木) 18:56:12 ID:HQz6o/x3
IDが s/DQN//i にだったら次スレから全レスに回答する
754 :
nobodyさん :2005/05/05(木) 20:41:24 ID:XayIK0rw
test
同じファイルを同時に違うファイルハンドルで開くことは可能でしょうか? (Perl的にやってもいいのでしょうか) 具体的には open(A, 'test.txt'); 〜何らかの処理 open(B, 'test.txt'); 〜何らかの処理 close(B); 〜何らかの処理 close(A); のようなことです。
BRL04-aを使ってます。 カウントされないようにBRL04-aで取得したWANがわのIPアドレスを取得したいのですが、どうすればよいですか? とりあえず、DNSで正引きしてみたけどダメでした。 CGIで使うのでPerlで作りたいのです。
>>755 全部が読み取りなら可能。そういうことをやるべきかどうかは知らんが。
>>756 ルータの取得したWAN側アドレスはルータに聞くしかない。
SNMPでMIBを叩くのが筋だとは思うが、BRL-04はSNMPをサポートしてないよな。
BRL-04の設定画面をLWPで叩いてHTMLの中からWAN側アドレス表示のとこだけを抜き出す、
というのがたぶん現実的だろう。
ファイルハンドルAがマンドクセに見えた ('A`)
ここでいいのか判りませんが、、質問です。 習作でサーバーに保存した一次ファイルを偽セッションとして使い、 perlだけでの認証制の掲示板を作ろうとしています。 とりあえずパッケージsession.plはできたんですが、ここで疑問が… htmlのmetaヘッダで$permission = "<meta name='robots' content='noindex'>\n";の指定は出来るようにしてあるんですが、 これだけでログの外部流出は防げるんでしょうか? もちろん普通に見た場合はsession見てイレギュラーなアクセスは弾くようにするつもりですが、 googleなどのキャッシュに引っかからないかどうかがわからないんです。
防げるわけないだろ 一次ファイル(ってなんだか知らんが)そのものを見られなくしよう
すみません、誤字です。 一時ファイルです。 当然ログファイル等はサーバーの権限設定で見られなくするつもりですが、、 そうではなくてログを暗号化するとか、そういう話でしょうか?
>>760 うぅすみません、いまいち意味がわからないです。
例えば.htaccessで弾いた場合、googleのキャッシュには絶対に引っかからないんでしょうか。
ベタベタにやるとこう? my @tmp; while (<FILE>) { @tmp = split ',', $_; $addr_list{$tmp[0]} = $tmp[1]; }
>>762 そうなるね
httpdから直接アクセスできないところに置くか、.htaccessでガード
>>765 ありがとうございます。
ログではなく、表示するページ(データから動的に生成&偽セッションでアクセス制限)でも
同じ事なのでしょうか。
767 :
763 :2005/05/07(土) 16:41:59 ID:???
768 :
nobodyさん :2005/05/07(土) 17:09:19 ID:4STWB1ko
>>766 未認証だとアクセスできないページはロボットもアクセスできない。
772 :
nobodyさん :2005/05/08(日) 02:25:33 ID:EhQFLRWQ
最近勉強始めたばかりです。 perlには多次元配列ってありますか?ないのなら代わりになるものってありますか?
多次元配列あったのか… 俺いっつも↓みたいな感じでやってた @a = (0,1,2,3,4,5); @b = (0,1,2,3,4,5); @c = (0,1,2,3,4,5); @d = (\@a,\@b,\@c); foreach(@d){ foreach $e (@$_){ print "$e<br>"; } }
それ、@d が既に多次元配列になってんじゃん。
('A`)
777 :
うんこ :2005/05/08(日) 04:23:54 ID:???
my $d; $d->[0] = [ qw/1 2 3 4 5 6/ ]; $d->[1] = [ qw/1 2 3 4 5 6/ ]; $d->[5] = [ qw/1 2 3 4 5 6/ ]; $" = ', '; for my $arr_ref (@$d){ print ref $arr_ref || 'undef'; print " [ @$arr_ref ]\n" }
>>763-764 my @tmpはwhile内に書くべきだな。
あと俺的別解。
while (<FILE>) {
/^(.*?),(.*)$/;
$addr_list{$1} = $2;
}
スマン書き忘れた。
>>764 はchompが抜けてる。
780 :
nobodyさん :2005/05/08(日) 19:50:28 ID:WVJV6mZK
ARGVって小文字で書くとダメなの?
>>780 Perl言語(および糞Ms以外)が大文字と小文字を区別してるってことくらい知らないの。
>>781 糞林檎会社のHFS+もファイルネームの大文字小文字を区別しないな。
783 :
nobodyさん :2005/05/08(日) 20:29:12 ID:uPGwNCs6
784 :
nobodyさん :2005/05/08(日) 20:43:54 ID:tDynd5YA
>>778 そこら辺がいまいちよくわかってないんです。。
例えば関数で
sub hogege {
my @arr_return;
push @arr_return, 'hoge';
return \@arr_return;
}
$ref = &hogege();
print $$ref[0];
ってやって、関数の外でリファレンス参照して使えると思うんですが、
コレってつまり、myで作ったアドレスが裏で確保し続けられてるって事ですよね?
なので
foreach (@a) { my$aa; $a=1; }
↑とかやっちゃうと、回った数だけmyでアドレスを確保されちゃうような気がして
my $aa;
foreach (@a) { $a=1; }
delete $aa;
↑こういう風にしてるんですが。。
ここら辺って、どうなんでしょう?
>>785 本題とは関係ないんですが、 delete って何?
>>781 知りませんでした
ありがとうございます
>>786 delete EXPR
指定されたハッシュの、指定されたキーと対応する値を削除します。
%ENVの要素を削除すると環境変数が削除されます。
です。間違えました。undefでした(汗
>>785 for($i=0;$i<16;++$i) {
my $a;
print \$a,"\n";
}
どうなった?
>>785 ラクダ本とかだとその辺 (変数が消滅するタイミング) がきちんと解説されていたと記憶
そういや昔、循環参照するデータ構造を FastCGI で動かして
メモリが洩れまくって焦ったことがあったよ
perl で DBI で MySQL を使おうと思ってるんだけど、 データの保存先ディレクトリを変えること (たとえば実行スクリプトのあるとこにする) ってできるのかな? やり方知ってる人いたら、説明書いてる URL でもいいから教えて… orz
>>789 全部同じ所を参照しておりました…何故だーw
ありがとうございます。
>>790 ラクダ本…今度立ち読みしてみます。。
一応以下本文及び実行結果です。。
(1) for($i=0;$i<3;++$i) { my $a; print \$a."<br>"; }
→ SCALAR(0xcf7a4), CALAR(0xcf7a4), SCALAR(0xcf7a4)
(2) for($i=0;$i<3;++$i) { print &asd(rand(time))."<br>"; }
→ SCALAR(0xf7178), SCALAR(0xf7340), SCALAR(0xf7178)
(3) for($i=0;$i<3;++$i) { my $a = &asd(rand(time)); print "$a<br>"; }
→ SCALAR(0xf7340), SCALAR(0xf7178), SCALAR(0xc6a98)
sub asd { my ($a) = @_; return \$a; }
>>791 それは Perl のコーディングやら DBI ではどうにもならん話で
たぶん MySQL スレあたりに行って聞いた方が良い
「シンボリックリンクで解決しる」とかいうことになるんじゃないかという気はする
ムリなのか… (´д`) シンボリックリンクだと意味ないなあw ありがd! 早いけど諦めてみる… orz …あ、自分トコにデータファイルを作るデータベースの、とかはあるのかな?
ここはコーディングスレです。
またまた古くさいことを…
>>792 その程度の話はリャマ本でいい。リャマ本は必読。
そんなこと言ってたら、大抵のことは 「本読め」 「ぐぐれ」 「過去スレ読め」 で終わりそうな・・・。
人工知能型検索が完成したら、威張って教える人が絶滅しまつ(^^)
sqliteなんかいい感かと
perlで掲示板を作っています。 タブ無効、改行有効です。 -------- foreach (@$ref) { #デミリタは<>、元々の<>はエスケープ処理 foreach (@$_) { $_ =~ s/¥<¥>/¥¥<¥¥>/g; } my $tmp = (join '<>', @$_); #改行はタブに変換、元々のタブは無効(半角空白)にする $tmp =~ s/\t/ /g; $tmp =~ s/\r\n|\n/\t/g; push @arr, $tmp; } -------- デミリタは<>、改行は\tに置き換えという仕様で、 タブ以外は基本的に入力通りのデータが出力されるようにしました。 ただし一点だけ、元々のデータが\<\>の場合のみ<>に変換されてしまいます。 これをうまく回避する方法ってないでしょうか。。
802 :
801 :2005/05/09(月) 14:30:37 ID:???
すみません自己解決しました。 $_ =~ s/\<\>/<>/g;
803 :
801 :2005/05/09(月) 14:31:22 ID:???
うう。。 $_ =~ s/\<\>/&lt;&gt;/g;
804 :
nobodyさん :2005/05/10(火) 19:42:37 ID:xKdeSYjs
どなたかお願い致します。 AサーバーにあるファイルをBサーバーへFTPを使用して 送りたいのですがこのような事は可能でしょうか?
↑すいません。もちろんperlを使用してです。
Net::FTP
>>806 >>808 おぉ、ありがとう御座います。そのものずばりがあるとは・・・
早速試して見ます。
Shift-jisで文字列を正しくマッチさせるにはどうすればよいですか? /sage表示テスト/ ↑これは正しくないというのは調べて分かりましたが、具体的にどうするのか分かりませんでした。
>>810 なら /\Qsage表示テスト\E/ で充分
~ohzakiでSJISでも応用できるとあるよ。 $pattern = quotemeta($pattern); if ($str =~ /^(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])*?(?:$pattern)/) { print "マッチした\n"; } SJISならquotemetaの一手間入れれば無問題。
てゆーか、Perl 5.8 使えよ...
客が運用中のシステムなんじゃないの?
5.0006 と 5.8 の互換性ってどんな感じですか?
ありがと。5.0 と 5.6 の比較もしないとな。
my @list=grep($_->{name} eq $hash->{name},@DATA); これが書いてある行で Modification of a read-only value attempted のエラーが出てしまいます 定数値の変更をしようとしているように見えないのですがどういうことなんでしょう? @DATAは undef @DATA; open(IN,GetFilePath("file")) or return;#GetFilePathはファイルパスを返す my @data=<IN>; close(IN); @hashnamelist=qw(no date name); foreach my $count(0..$#data){ chop $data[$count]; my @buf=split(/,/,$data[$count]); my $i=0; foreach (@hashnamelist) { $DATA[$count]->{$_}=$buf[$i];$i++;} } というような感じでファイルから読んだデータを入れています
あれ? いきなり $DATA[$count]->{$_} ←こんなことやっていいっけ? $DATA[$count] がちゃんとハッシュリファレンスになる?
grepって @一致した行 = grep(/正規表現/, @検索対象); じゃないの?
grep(評価式, 配列) だよ。
> $DATA[$count]->... そもそもここは何をしたいんだ?
$_は@DATAの各要素のaliasだからread-onlyではないと思うので、 むしろ$hashがあやしいような気がする。
同じ結果になるであろう別の記述を試してみたら? my @list; { local $_; my @temp; foreach $_ (@DATA) { if($_->{name} eq $hash->{name}) { push @temp,$_; } } @list = @temp; } とか。
俺も
>>826 と同じく$hashが怪しい気がするが、値を変化させる式があるわけでもないしread-onlyは関係ない気もする。
>>821 と同じような動作をするだろうものを書いてみたが、普通に動いたぞ。
my $hash = { Name => 'nobodyさん' };
my @list;
{
my @DATA;
my @data = <DATA>;
my @hashnamelist = qw(No Date Name);
foreach my $count (0..$#data){
chomp $data[$count];
my @buf = split /,/, $data[$count];
%{$DATA[$count]} = map { $hashnamelist[$_] => $buf[$_] } 0..$#buf;
}
@list = grep $_->{Name} eq $hash->{Name}, @DATA;
}
foreach (@list) { print $_->{No}, " " }
__DATA__
820,2005-05-12,nobodyさん
123,2005-01-23,名無しさん
821,2005-05-12,nobodyさん
全角スペース入れたつもりだったんだが…どうやら半角だったようだ。 あと10行目の 0..$buf は 0..$#hashnamelist の間違い。
>>828 >値を変化させる式があるわけでもないしread-onlyは関係ない気もする。
$hashの値がハッシュのリファレンスでなければ「$hash->{name}」を
参照しただけで新しい無名ハッシュが作られてそのリファレンスが
$hashに代入されます。
my $hash;
print "1:$hash\n";
my $x = $hash->{name};
print "2:$hash\n";
もともとの質問からズレてしまってスマソなのだけど $hash = 1; $hash->{name} = 10; print "1: " . $hash . "\n"; print "2: " . $hash->{name} . "\n"; $hash++; print "3: " . $hash . "\n"; print "4: " . $hash->{name} . "\n"; を実行した結果が 1: 1 2: 10 3: 2 4: となる原理をいまいちよく理解できてない俺ガイル
>>831 $hashの値がundefなら値の参照による暗黙の生成のときに無名ハッシュが
できてそのハードリファレンスが$hashに入るが、この場合は既にスカラー値が
入っているのでその辺は関係なくて、ただのシンボリックリファレンス。
すなわち、$hash = 1のときに
$hash->{name} = 10;
とするとそれは%{1}というハッシュ変数をいじっていることになる。
矢印演算子が出来る前の書き方
${$hash}{name} = 10;
と同じ。
従って、上の4つのprintが表示しているものは、
1: $hashの値'1'
2: ${1}{name}の値'10'
3: $hashの値'2'
4: ${2}{name}の値(入ってないので空文字列'')
833 :
nobodyさん :2005/05/12(木) 19:54:59 ID:1WfKcKYp
お気に入りのサイトの掲示板のスクリプトがどーしても見たいんですが、そのスクリプトが生成するページではなく、スクリプトそのものをブラウザから覗くにはどうすればいいのでしょうか?
835 :
833 :2005/05/12(木) 21:02:30 ID:???
>>834 助言サンクス。
1: 自分はこういう事がしたい。
→お気に入りのサイトの掲示板のスクリプトがどーしても見たい
2: それでこんな風にやってみたが・・・
→URLの上で右クリックして「対象をファイルに保存」ってやってみた
3: こんなエラーが出て上手く行かなかった。
→そのスクリプトが生成するページがダウンロードされるだけで、肝心のスクリプトは見れなかった
スクリプトもHTMLと同じテキストファイルなので、ブラウザから見る方法があるに違いないと思って質問してみました。
Perlの勉強には、好きなサイトのスクリプトのまねをするのが一番だと思って。
836 :
833 :2005/05/12(木) 21:05:05 ID:???
あ、すれ違いってことか、よそへ逝ってきます・・・orz よそのスレで見かけてもマルチって怒らないでくださいね。
見たいページの画面が切り替わる瞬間に、 PC本体を少し斜めに傾けるとうまくいく事があるよ。
Perlでユーザ名の登録をするのですが、 入力された文字列から、記号や日本語を削除して アルファベットと数字のみに変換する方法を教えてください。 [a-zA-Z0-9]をなんとかすればいいのかなと思うのですが・・・。
>>839 すみません。それでは日本語が化けてしまいます。
[1い2-45ab,D*Eあ]->[1BB245abDEBB]
本当は[1245abde]になってほしいんです
844 :
843 :2005/05/13(金) 01:07:10 ID:???
もしくは #!/usr/local/bin/perl -w use strict; use encoding 'shiftjis'; my $str = '1い2-45ab,D*Eあ'; $str =~ tr/0-9A-Za-z//cd; $str =~ tr/A-Z/a-z/; print $str; __END__
もー。EUCかUTF8にしろ。
Perl5.8からuse encodingでSJISが扱えるようになったらしいですが use encoding 'shiftjis'; これを入れるだけでOKですか?他に何かいりますか?
SJISかいな。あいよ。 $str =~ s/[\x81-\x9F\xE0-\xFC].|[^0-9A-Za-z]//g;
もー。EUCかUTF8にしろ。
関係ないけどUTF8って処理重くない?
>>849 処理は重くないがデータ量は多い。メモリの少ないマシンだと重くなることもあるかもな。
851 :
nobodyさん :2005/05/13(金) 15:35:11 ID:oLTDJ3fd
すいません。質問があります。 ----------------config.pl package config; my $DATA_DIR="hoge"; 1; ---------------- とある時 「test.cgi」で上記ファイルを利用したいのですが ---------------- require 'config.pl'; my $writedir=&config::DATA_DIR; : ---------------- としても Undefined subroutine &config::DATA_DIR called at test.cgi line 9. とエラーが出てしまいます。 どの様に表記するのが良いのでしょうか? 不躾で申し訳ございませんが お教え頂けますとありがたいです。
my $writedir=$config::DATA_DIR;
853 :
851 :2005/05/13(金) 16:00:36 ID:???
>>852 さん
RESありがとうございます。
私何か勘違いしていました、、
>&config::DATA_DIR
って関数呼ぶときに使うやつじゃん、、、
どうも ありがとうございます。
他に見せるつもりの変数をmyにしてるのは誰も突っ込まないのか?(笑)
>>838 >>840 漢字コードはシフトJISということで
my $input_string = '1い2-45ab,D*Eあ';
(my $output_string = join '',
grep{
/^[^\x81-\x9F\xE0-\xFC]/
} $input_string =~ /(
(?:
[\x81-\x9F\xE0-\xFC]
[\x40-\x7E\x80-\xFC]
)+
|
[^\x81-\x9F\xE0-\xFC]+
)/gx
) =~ s/[^\da-zA-Z]//g;
$output_string =~ tr/A-Z/a-z/;
print "$output_string\n";
>>856 をもうちょい短く
my $input_string = '1い2-45ab,D*Eあ';
(my $output_string = lc join '',
grep{
/^[^\x81-\x9F\xE0-\xFC]/
} $input_string =~ /(
(?:
[\x81-\x9F\xE0-\xFC]
[\x40-\x7E\x80-\xFC]
)+
|
[^\x81-\x9F\xE0-\xFC]+
)/gx
) =~ s/[^\da-zA-Z]//g;
print "$output_string\n";
>>856-857 grepはいらないだろ。
my $input_string = '1い2-45ab,D*Eあ';
(my $output_string = lc join '', $input_string =~ /
(?: [\x81-\x9F\xE0-\xFC] [\x40-\x7E\x80-\xFC] )+
| ( [^\x81-\x9F\xE0-\xFC]+ )
/gx) =~ tr/[0-9a-z]//cd;
print "$output_string\n";
859 :
nobodyさん :2005/05/14(土) 12:37:57 ID:??? BE:118591373-###
>>858 tr/[0-9a-z]//cd これはまずいよ。文字に [ や ] があれば入り込んでしまう。
print lc join('', $input_string=~/[\x81-\x9F\xE0-\xFC].|([a-zA-Z\d])/g),"\n"
use Jcode; my $str = '1い2-45ab,D*E'; ($str = new Jcode($str)->euc) =~ tr/1-9A-Za-z//dc; print $str;
プログラムの質問とはちょっとずれてしまうのですが 投票のCGIを作りたいのですが、重複を防ぐにはどうしたらいいんでしょうか? IPをチェックしても固定でなければ接続し直せば変わるし クッキーも消せばまた投票できてしまいますよね? 完全に重複を防ぐというのは無理ですか?
>>861 メールでパスワード発行てのはよくある手だね。
メールでも同じ事やん
そやったねぇ。用途が違ってた罠。スマソ。
大変申し訳ございません。 質問があります。 ---------------- my %TEST_HASH = ( 'test' => 'jya' ); foreach $key (keys %TEST_HASH){ print "$key<br>"; } ---------------- ではちゃんと表示されたのですが ----------------[config.pl] package config; my %TEST_HASH = ( 'test' => 'jya' ); 1; ---------------- と ---------------- require 'config.pl'; foreach $key (keys %config::TEST_HASH){ print "$key<br>"; } ---------------- とすると表示されません。 表記方法が悪いのでしょうか? ご助力いただけますと幸いです。
my のスコープが問題かと。
もはや my は機械的につけるだけかと
869 :
866 :2005/05/17(火) 19:22:40 ID:???
うっ、、、 ありがとうございます。 myを消したらうまく表示できました。 本当にどうもありがとうございます。
870 :
nobodyさん :2005/05/17(火) 23:02:44 ID:hBcfSLHc
エラーを表示するのは、dieでやるか、subルーチンで&error("○○がおかしい")って表示させるかどっちがモテますか?
エラーの種類による。
872 :
nobodyさん :2005/05/18(水) 00:14:10 ID:tzJs81c1
そこで終わっちゃまずいときとか
sub呼び出しに&使う奴は糞。
875 :
nobodyさん :2005/05/18(水) 01:11:07 ID:tzJs81c1
初心者の僕には彼
>>874 の言っていることが全く理解できません
今どきの初心者で sub 呼び出しに & 使おうと発想する香具師ってのは、 一体何を読んで Perl を勉強してるの?
#!/usr/bin/perl $_=$ENV{QUERY_STRING};s/\+/ /g;s/%([\da-fA-F]{2})/chr hex$1/eg;eval; このプログラムはどんなことがでるのでしょう? とりあえず実行してみたら500エラーがでてしまいました。
878 :
nobodyさん :2005/05/18(水) 03:17:20 ID:3k0gZS+p
なんで サブルーチンの呼び出しに & 使っちゃまずいのですか? どっちでもいいならつけた方がわかりやすいと思うのですが・・・
>>881 知らなかった…
メモリの節約ってことになるんでしょうか?
常に戻り値と引数を明示するような書き方をしてりゃ ($a,$b,$c) = &sub($x,$y,$z); より ($a,$b,$c) = sub($x,$y,$z); のほうがいいってこと? でもKENTと「すぐわかるPerl」で学んだからなぁ・・・ なかなかクセが抜けねぇ。
関数のやってることをわかってない人は&をつけないほうがいいだけのこと。 初めから完璧なプログラム組める人はいないし、Perlは比較的安全なつくりに なってるから&つけるつけないにこだわる人は向いてないと思う。
&派の逆襲です。
結局たいして変わらないでFAなの?
&があると質問があって掲示板に書き込むとき注意しなきゃいけないからつけないとかでいいよ。
カッコ無しで引数省略したつもりが @_ のせいで意図しない挙動になったり、 プロトタイプが効かなかったり、と、何度も痛い目に遭ったことがあるので、 & 付けるの止めました。
なるほど。。今まで分かりやすいとか思って付けてたorz これからやめよ。
すいません。質問があります。 文字列 AAA/BBB/CCC を AAA/BBB/ に。 文字列 DD/EEEEEE/FF を DD/EEEEEE/ にするような良い方法はないのでしょうか? indexで'/'の場所を2回計測しないとやはり駄目でしょうか?
>>890 何したいのかわからんけど
$str =~ s/[^\/]+$//;
>>890 んー、前ベンチとったときがあるけど、
my $dir = 'aaa/bbb/ccc';
1: $dir =~ s/[^\/]*$//;
2: $dir = substr ($dir, 0 , rindex ($dir, '/') + 1);
3: substr ($dir, rindex ($dir, '/') + 1) = '';
try 100,000
1: 0.98 [s]
2: 0.47 [s]
3: 0.86 [s]
ってことで 2 が早いかも
893 :
890 :2005/05/18(水) 16:53:44 ID:???
RESありがとうございます。 rindexというのがあったのですね、、、 解決しました。どうもです。
894 :
nobodyさん :2005/05/18(水) 20:12:52 ID:l3LfkbbV
1: 自分はこういう事がしたい。 別々のdatファイルに入ってる変数の$aと$b この2つに同じ数字が代入されているかどうかを確認したい。 2: それでこんな風にやってみたが・・・ if ($a == $b) { print "true\n"; } else { print "false\n"; } 3: こんなエラーが出て上手く行かなかった。 $aと$bに同じ数字が入っていても、スルーされて、すぐelseの方に入ってしまいます。 同じdatファイルにある変数同士ならスルーされないんですが 別々のdatファイルに格納されてる物を確認するにはどうしたら良いでしょうか。
895 :
894 :2005/05/18(水) 20:37:04 ID:???
すみません、自己解決しました! if (!($a == $b)) { としたらできました。 でも、これってどうしてなんでしょうか…??? if ($a != $b) { これだと、できなかったんですが…??
897 :
894 :2005/05/18(水) 21:47:19 ID:???
>896 CR+LFです。 つか、できたと思ったんですが勘違いでした…(;´Д`)やはりスルーされました
if (int($a) == int($b)) { もしくは if ($a eq $b) { じゃだめ?
899 :
nobodyさん :2005/05/18(水) 22:02:44 ID:1rjH09kt
サブルーチンやモジュールへの引数の引渡しで 受け取り側で sub aaa { my $bbb = shift; my @ccc = shift; #以下処理 } 見たいな感じで受け取り側でスカラーとアレイを受け取れますか? なんかうまくいかないのです。 配列を受け取ろうとすると。。
>>899 きみ、shift が何をする関数か知らず、ただ引数を受け取るためのおまじないだと思ってるぢゃろ
my ($bbb,@ccc) = @_ とすれば受け取れるけど、なぜそれで受け取れるのか、
なぜ shift ではダメなのか、自分で調べてみそ
aaa("skipper",\@skipper); sub aaa{ my $who = shift; my $items = shift; 以下略・・・ }
902 :
894 :2005/05/18(水) 22:52:46 ID:???
>898 ネ申 ありがとうございました……マジで
>>897 >>896 が言いたいことは変数に改行コードがくっついたままじゃないかって事だと思う
$a = chomp($a);
$b = chomp($b);
Perlは代入しなくて良かったんだっけ chomp($a); だけでおk
perlで音を出すモジュールなんかある?windowsなんだけど。 予定時間設定しといて、アラーム音出したいんだけど。
\aじゃだめか?
Win32::Sound とかか
あう、、、 cgiとかの引数ってどうやって取得するのでしょうか? (hoge.cgi?day=20050519) ↑ここを取得したい。 基本的なことで申し訳ございませんが 手元の本には載っていないので お教えいただけないでしょうか?
このコードでC/C++言語のコメント /* 〜 */ が消えないのはなぜですか? $data = <<EOF; /*++ comment --*/ int i = 0; EOF $data =~ s{/\*.*?\*/}{}gm; print "$data\n";
間違えた。mじゃなくs
>>908 >手元の本
マジかよ。 KENTですら書いてるぞ? そんな本捨てた方g(ry
913 :
908 :2005/05/19(木) 18:29:29 ID:???
まじです、、、 えーっと use CGI; my $cgi = new CGI; my $day = $cgi->param('day'); で出来ました。ありがとうございます。
自分でやれ自分で!
QUERY_STRINGの運命は…
>>QUERY_STRING >>どんなことがでるのでしょう? なんもでねぇ
こう package hoge; use strict; sub new { my $foo = {}; $foo->{bar}; $foo->{baz}; 〜略〜 } とあったときに、 $foo->{bar} = 'nil'; と入れたら $foo->{baz} の値も、自動で 'nil' になってほしいんだけど、こういうのってどうすればできるのかな? ハッシュじゃなきゃ型グロブとグローバル変数使ってできたけど、 これは自分じゃできなかったので、知ってる人いたらお願いw
tie とか?
919 :
nobodyさん :2005/05/20(金) 13:55:15 ID:SeWWShul
ちょっとしたPerlのスクリプトを、自分のホームページで公開しようと思うのですが、 設定ファイルはともかく、 メインのPerlスクリプトは稚拙すぎるので(汗)、 (まぁ、セキュリティ的な面では一通り対応したつもりですが) あまりソースを見られたくありません。 そこで、Perlスクリプトを(あるいは、スクリプトの一部でもかまいません) CGIの動作はそのままで、 「(暗号化により?)解読不可能にする(※1)」あるいは 「できるだけ解読に時間がかかるor解読する気が失せるように書き換える(※2)」 にはどうすればいいでしょうか? ※2の場合、 ●削っても支障のない改行を消す ●変数名や関数名を、どんな使い方をしてるか推測困難なものにする ●同じ変数を使い場所によって全く異なる使い方をする (例:ある箇所ではfor文の「i」の代わりに使うが、 ある箇所では現在日時を格納して使う、とか) ●スクリプトを膨大なファイルに分割してrequireしまくる ●関数をやたらと小分けにして、関数の数を多くする ●ラベルを使いまくる くらいしか思いつかないのですが・・・ (全体をコピーされれば、どうしようもないですが、それは除外してあきらめます) どうぞよろしくお願いいたします。
そもそも、ソースを公開する意味がわからんというか、 そんなグダグダにしたソースを使いたい香具師いんの?
921 :
919 :2005/05/20(金) 14:15:39 ID:???
922 :
919 :2005/05/20(金) 14:40:55 ID:???
糞野郎はさっさと〜消えろ〜
そんなことする方が大恥晒し Cでもやってろ
自己満足に他人の手を借りるなんて最高のアフォ。
926 :
919 :2005/05/20(金) 18:35:46 ID:???
知的好奇心があるなら、 その 「稚拙すぎるメインのPerlスクリプト」 を、 他の人が見ても見れる綺麗な書きかたを勉強しよう、となぜ思わないんだwww
928 :
919 :2005/05/20(金) 19:22:05 ID:???
>>927 いやいや、一応、キレイな書き方を取得するために、
「はじめてのPerl」的本とかオライリー本とかで勉強してます・・・
まだまだひよっこですけど(汗
Perlでコーディングスタイルを決めるのは難しい
配列の要素数を数える方法ですが、 現在はこうやってカウントしてるのですが、 my $count = @array; もっと簡潔な方法ってないですか? なんかこれ以外にもありそうな気が・・・
print scalar(@array); こーゆー事?
なんか my $count = @array; じゃなくて my $count = scalar @array; とかやっちゃうよなあ。 あとは my $count = $#array + 1; とかか?
print '配列arrayの要素数は、',0+@array,'です。';
my $count = $#array + 1; すみません、この$の横の#の意味教えて下さい
935 :
930 :2005/05/20(金) 20:53:23 ID:8UQXVsgd
931さん、932さん、933さん ありがとうございました!これです! 勉強になりました。
936 :
チャーリーブラウン ◆ZnBI2EKkq. :2005/05/20(金) 22:56:10 ID:cacgi0rq
見てくれ! 俺のIDが「CGI」だ!!
CGIでGETで来たパラメータの%uxxxxって形式(unicode?)をSJISに変換したいんだけど、 どうやったら良いのか教えて下さい。 uri_unescape(...)では%uxxxx形式は駄目みたいで...
>>934 > すみません、この$の横の#の意味教えて下さい
#以降はコメントアウトです。
@hoge = qw/あ か さ た/; print $#hoge; さて何だろう
3 (・∀・)
@hoge = qw/あ か さ た/; undef $hoge[1]; print $#hoge; これはー?
3 (・∀・)
2 ! (^゜(∀)゜^)ノ
5行目 syntax error...
>>946 Unrecognized character \x82 at - line 5.