Perl コーディング初心者質問コーナー Part36
いらっしゃーい、Perlのコーディングで困ってる人のスレです。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは
>>2-10
補足
コーディング 【coding】
プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
自分の質問がPerlに関することなのか、
それともPerlではなくCGIやHTMLについてなのかを切り分けした上で、
質問して下さい。
WebProgと関係ないならム板のPerlスレに統一した方がいいと思う。
9 :
nobodyさん:04/07/14 14:17 ID:q0q7Chkl
CGIでパラメーターを受け取る時は、
use CGI;を使うか、
read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});で自分でデータを分解するか
だと思いますが、それぞれのメリットとデメリットを教えてください。
前者はGET,POSTに関わらず扱える。
後者はPOSTとGETで処理の振り分けが必要。
12 :
nobodyさん:04/07/14 23:00 ID:fRIUupct
携帯電話対応のBBSを作っているのですが、
EZwebの一部の機種で「キャッシュ」が起きてしまいます。
methodはGETにしています。
postだと回避できるのですが、都合によりgetは使えません。
ちなみに
<meta http-equiv="Cache-Control" content="no-cache">
は効きませんでした。
お願いします。
>>12 ホント、わりいな。そうしてくれ。
俺は別にかまわねーじゃん、と思ってるよ
>>15 あのな、スルーしてるんだよ、みんな。
いろいろあるんだよ、それぞれが。
そんくらいわかれよ。
ネット上のページを読み込む方法で、前スレでLWPというものを勧められたのですが、
全くどういうものなのか分かりません。取り敢えず分かりやすく説明しているサイトなど御座いませんでしょうか?
どういうものかが見当付かないため調べる方法も思いつきません。
ググったら「ライブラリー」とか言うのが出てきたんですけど意味がわかんないです。
リファレンスサイトとかありましたらお教えくださいませんでしょうか?
宜しくお願いいたします。
19 :
17:04/07/15 01:30 ID:???
まさしく俺も
>>7読んでないですね。
CGIスレに移動します。本当にゴメンナサイ。
20 :
17:04/07/15 01:31 ID:???
>>18 スレ違いなのに申し訳ありません。
でも英語なので理解するのに2年くらいかかりそうです。
有難う御座いました。
一定の形式に従って記述してもらうテキストエリアがあり、書き方が不正な行があったら、その行数を表示したいのです。
不正のある行数を配列に格納する部分まではできるのですが、それの表示方法で質問です。
@err_lineの中身が("1","3","5")だとした場合、「1,3,5行目の書式が不正です」と表示するエラー画面を出したいのですが、
foreach(@err_line){
print $_ , ",";
}
print "行目の書式が不正です"
とすると、「1,3,5,行目の〜」となり、配列の最後の文字を出力した後にも","(カンマ)が出力されてしまいます。
何か良い書き方はないでしょうか。
>>21 $line_num = join(",",@err_line);
かな?
>>21 print join(',', @err_line), ' 行目の書式が不正です';
>>22 即レス感謝です。期待通りに動きました。サンクスです。
特定のファイルの仮想パスを絶対パスに変換する関数なんてあるんでしょうか?aspのServer.Mappathみたいな。
perl の組み込み関数には無い。
なぜなら絶対パスへの変換はWWWサーバの設定によって違い、
perl はサーバの設定がどうなっているかを知らないから。
ASPはIISと一体となっているから変換できる。
mod_perl なら Apache::* モジュールでなんかそういうのがあるかも。
perl の組み込み関数には無い。
なぜなら絶対パスへの変換はWWWサーバの設定によって違い、
perl はサーバの設定がどうなっているかを知らないから。
ASPはIISと一体となっているから変換できる。
KENT なら CGIでなんかそういうのがあるかも。
>>27 まじめに考えてみると難しいな
単純に頭に DocumentRoot をつけるだけなら楽だが
mod_rewrite とか使われた日には目も当てられない
mod_perl の環境に限定だが、サブリクエストを使って
$filename = Apache->request->lookup_uri($uri)->filename;
とかやれば、ほとんどの場合は変換できるんじゃないかと思う
Reverse Proxy だったりした場合には何が起きるか保証できないが
>>25 PerlってASPやJavaみたいにアプリケーションサーバ込みで考える開発環境じゃないんだよね。
だから関数で実現するんじゃなくって、別のソリューションを見つけるべきだね。
31 :
25:04/07/15 18:54 ID:???
あまりにありがたいレスにただただ感謝です。
コピペして保存させていただきます!
$a,$b,$cの中でカンマに区切られている要素の数でポイントを出したくて
以下のようなコードを書きました。
$total = (split(/,/,$a) * 3)+(split(/,/,$b) * 2)+(split(/,/,$c) * 1);
で、perl -cw すると以下のような警告が出てしまいます。
Use of implicit split to @_ is deprecated at test.pl line xx
どうすればこの警告が出ないようになるのでしょうか?
scalar(split(/,/,$x))
>>32 @a = split(/,/, $a);
@b = split(/,/, $b);
@c = split(/,/, $c);
$total = (@a * 3) + (@b * 2) + (@c * 1);
# クドいな(汗)。
明示的に配列に突っ込んだりすると出なくなる仕組み。
ありがとうございます!!
>>33 > scalar(split(/,/,$x))
これをやってみましたが、同じエラーが出ました...
やっぱり地道に
>>32 のようにするしかないのですかね。
本当に「line xx」って出てるのかね?んー?
splitの結果何が返って来るのかね?んー?
38 :
34:04/07/16 00:05 ID:???
ずっと /usr/local/bin/perl しか使ってなかったけど、
最近、perl.exeを入れてみたところ。
C:\Documents and Settings\hoge>perl -cw %home%\test2.pl
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
Use of implicit split to @_ is deprecated at C:\home\hoge\test2.pl line 5.
C:\home\hoge\test2.pl syntax OK
# 元コードの、split() が @_ に implicit に代入されてるとこが line 5。
こんな感じです。
>>37
39 :
≠37:04/07/16 03:30 ID:???
>>34 > splitの結果何が返って来るのかね?んー?
は試してみた?
>要素の「数」でポイントを出したくて
ということなら、
my $a = ("fred","wilma","barney");
my $b = ("hoge","hogehoge");
my $c = ("2","6","8","9");
print split/,/,$a;
print split/,/,$b;
print split/,/,$c;
my @a = ("fred","wilma","barney");
my @b = ("hoge","hogehoge");
my @c = ("2","6","8","9");
print split/,/,@a;
print split/,/,@b;
print split/,/,@c;
上の二つ比べてみ。
>>39 問題を読み違えているぞ。
$a = 'fred,wilma,barney';
$aa = split(/,/, $a);
print $aa;
splitをスカラで受けた場合に
「Use of implicit split to @_ is deprecated」警告が出るという話。
>>37 >splitの結果何が返って来るのかね?んー?
もしかしてsplitをスカラで受けた結果何が返ってくるか知らないのかね?んー?
>>39 質問者さんの「$a,$b,$cの中でカンマに区切られている要素の数」を、
my $a = "fred,wilma,barney"; # これを「カンマに区切られている要素」と呼んでるのかな、と。
my $b = "hoge,hogehoge";
my $c = "2,6,8,9";
print scalar(split(/,/,$a));
print scalar(split(/,/,$b));
print scalar(split(/,/,$c));
こういうのを想定して
>>34を書きました。
>>22を書いたのも自分なので、その記憶もあり。
>>39は、
ex1. 'barneyhogehoge9' # 最終の要素。手前のsplitがなくても、同じ結果に。
ex2. '324' # 要素の「数」。
という出力になりました。
あっ、
>>37さんの「splitの結果何が返って来るのかね?」は、
>>32だと $total = 1 * 3 + 1 * 2 + 1 * 1 で固定やぞ、ということなんでしょうか?
>>39さん
質問者じゃないのに、何を混乱してるんだろう(泣)。
43 :
34:04/07/16 04:40 ID:???
リロードしておけばよかったーっ_| ̄|○
元質を見て想定してたのは
>>40さんと同じ。
>>37さん、
>>39さんのお話の意図がつかめなくて
マゴマゴしてしまいました(汗)。
>>42 >>32でも答えは得られる。
-wオプションによる警告をどうしたらいいかと言うこと。
45 :
34:04/07/16 05:07 ID:???
>>44 ありがとうございます。元々、
>>40さん、
>>44さんと同じように考えてたはずが、
>>39を見て「俺、何かとんでもない勘違いしてたんだろうか?」と不安になってました。
# 慌てて書いたので
>>42のコードだと…同じ警告を吐くような。
とりあえず、頭冷やします。
>>32 警告メッセージは、@_ への暗黙な代入を警告しているだけだから
警告が特に問題ないとわかっている場合は、
オプションを切ってもいいんじゃない?
{ no warnings;
$count = split(/,/,$a) * 3 + split(/,/,$b) * 2 + split(/,/,$c);
}
no warningを使う場合は、必ずブロックで局所化する事と、
警告オプションを切ったブロックないで
組み込み関数以外の他のサブルーチンの使用に注意する。
明示的に配列に代入する でも回避できるみたい。
3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
my $a = 'foo,bar,baz'; # 3 * 3
my $b = 'hoge,fuga'; # 2 * 2
my $c = '1,2,3,4,5,6,7'; # 1 * 7
my $total = (1 + $a =~ tr/,//) * 3
+ (1 + $b =~ tr/,//) * 2
+ (1 + $c =~ tr/,//)
; # 20
>>47 空要素の扱いに注意。--> 1 +
例外的なケースかもしれないけど仕様を確認した方が良いよ、念の為。
>>50 こういう事を言いたいのかな?
#--- test1.p ---
my @str = ('1,,,,', ',,,,1', ',,1,,', '');
print 0 + @{[split /,/]} for @str; # 1530
print "\n";
print 1 + tr/,// for @str; # 5551
print "\n";
print 0 + (length && 1 + tr/,//) for @str; # 5550
#--- test2.p ---
use Benchmark;
our @str = ('foo,bar,baz', 'hoge,fuga,' x 5, ',,,,1', ',,1,,', '1,,,,', '');
timethese(-5, {
split => sub { my $n = @{[split /,/]} for @str },
tr => sub { my $n = 1 + tr/,// for @str },
length => sub { my $n = length && 1 + tr/,// for @str },
});
52 :
32:04/07/16 15:17 ID:???
元質問者です。予想外にレスがついていてびっくりです。
みなさんありがとうございます。勉強になりました。
>>46 さんの
> 3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
>>47 さんの
my $total = (1 + $a =~ tr/,//) * 3
+ (1 + $b =~ tr/,//) * 2
+ (1 + $c =~ tr/,//)
; # 20
あたりが良さそうですね。ちょっと今から試してみます。
>>47 は、コード読んでもなんでそうなるのかよくわからない...
55 :
32:04/07/16 17:04 ID:???
>>46 > 3 * (@_=split/,/,$a) + 2 * (@_=split/,/,$b) * (@_=split/,/,$c);
これやってみましたが、同じエラーがでました。???
これからtrの方を試してみます。
56 :
32:04/07/16 17:14 ID:???
>>47 のtrだとエラーも出ませんでした。当たり前ですね。
あれもこれも「エラー」、か・・・
58 :
nobodyさん:04/07/16 19:56 ID:wqtiPvAW
>>51 フォローthx you, なるほど @{[split/,/,$a]} でもいいのか。
詳細を書くと、
'' を要素数0とカウントするか空文字1要素とカウントするか、という事ですが
他にも 'a,b,c' と 'a,b,c,' の様な場合、数え方で結果がかわってきます。
shiftでは末尾の空要素はなくなるが、tr, lengthの方法だとカウントされる。
一見同じ様に見えても、細部で微妙に仕様が変わってくるので注意しようってとです。
use strict;
use warnings;
my $a = '';
my $b = 'a,b,c';
my $c = '1,2,3,4,5,6,';
sub count_item_1($) { return int @{[split/,/,$_[0]]} }
sub count_item_2($) { return int 1 + $_[0] =~ tr/,// }
sub count_item_3($) { return int length $_[0] && 1 + $_[0] =~ tr/,// }
sub count(&) {
my($func) = @_;
printf("%d %d %d\n", $func->($a), $func->($b), $func->($c));
}
count(\&count_item_1); # 0 3 6
count(\&count_item_2); # 1 3 7
count(\&count_item_3); # 0 3 7
>>56 自分の環境(perl 5.6.1, perl 5.8.2 build for linux)ではこの方法で警告消えたのだけど、どうしてだろ。
スレ違いかもしれないけど jcode.pl の半角カタカナが強化されたバージョンが
あったはずなんだけどご存知ないでしょうか??
61 :
名無しさん:04/07/17 14:06 ID:BYFAIbz8
JAVAでServlet書くときは1インスタンスをいろんなセッションで使うから、
他のセッションに影響しないように注意するけど、Perlはそういう心配しなくていいの?
63 :
名無しさん:04/07/17 14:44 ID:BYFAIbz8
Servlet書いたことないくせに
>>61 利用するフレームワーク (CGI、mod_perl、FastCGI、
SpeedyCGI、PerlScript etc. etc.) に依る。
65 :
名無しさん:04/07/17 15:43 ID:BYFAIbz8
どういう風に依るですか?
Javaでも標準のセッションクラス以外にも、いろんなセッションクラスがあるでしょ。(俺は標準のしか使ったことないけど。)
セッションサービスの仕様はそのクラスによる。
つーか、Perlには標準でセッション関数はない。だから、自分で書くなり、そういうモジュールを探してくる。
67 :
nobodyさん:04/07/17 20:54 ID:ihUsGdG4
aaa/bbb
と入力されたデータを受け取って
$a="aaa";
$b="bbb";
という二つのデータに分けたいんだけど
$id(入力されたデータ)=~s/$1\/$2/$1$2/i;
$a="$1";
$b="$2";
とやってもうまく行かない
悪い点があったら教えて下さい
>>68 そこですか。
どうもありがとうございます。
>>67 用途としてはsplit()のほうが。
($a,$b) = split(/\//,$id);
>>70 そっちの方が楽でしたね
全然知恵が回りませんでした
ありがとうございました
プログラミングで詰まってます。助けてください・・・
1〜1000の各数字が、5・6・7・8・9の5種のうちのどれかを所持しております。
所持するものの違いにより
1〜1000の数字をそれぞれ5つの配列に、分けるにはどうすればいいのでしょうか?
ずーーーーっと考えてるんですが、限界なので質問させてください。
お前の日本語がわからないのだが…
> 1〜1000の各数字が、5・6・7・8・9の5種のうちのどれかを所持しております。
ここがよくわからん
まあ、放置しとけばいいさ。
>>75 data[1〜1000] にそれぞれ5〜9の値が入っていて、
その値に応じて新しい配列(5個)を生成したい、
ってことだと思う。
>>74のいうようにpushとifでできるやぁね
何で回答者が日本語の解析までやらにゃならんのだ
77 氏の通りだと仮定してやってみた。
効率なんて考えていないので添削キボンヌm(_ _)m
# 5,6,7,8,9 の数字が 1000 個入っている配列(リスト)
# 仮に rand を使って生成。
my @Source_array = map { ((5..9)[int rand 5]) } 1 .. 1000;
# を、それぞれ値 (5 〜 9) によって選別したい。
# でも 5 つも配列を作るのは、のちのちややこしくなるので、ここは 1 つの配列に格納して、
# それぞれを呼び出しやすくする。(リストリファレンスが 5 つ入っているハシュにする)
my %Dist_hash;
push @{$Dist_hash{$Source_array[$_]}}, $_ foreach 0 .. $#Source_array;
# 呼び出し方。
# 値が 7 の @Source_array の添え字を表示する。
my $value = 7; # 範囲は 5 から 9 の間で指定しる。
printf qq|\$Source_array[%s]\n|, join(', ', @{$Dist_hash{$value}});
# 実際に @Source_array の値を表示してみる。
printf qq|\$Source_array[%d] = %d\n|, $_, $Source_array[$_] foreach (@{$Dist_hash{$value}});
80 :
72:04/07/18 14:14 ID:???
文章わかりにくかったみたいですいません。
意図してたのはまさに77氏の言うとおりです。
79さんどうも!思ってたことができました。こんなの自分で考え付けるようになりたい。
ありがとうございました。
81 :
nobodyさん:04/07/18 22:22 ID:LXS4mDIw
$aa = "aa";
@bb = qw[1 2 3];
$cc = "cc";
&hoge($aa,@bb,$cc);
sub hoge($,@,$){
my $aa = shift;
my @bb = shift;
my $cc = shift;
print "$aa \n";
print "$_\n" foreach(@bb);
print "$cc\n";
}
関数に変数と配列を渡し、関数側でそれぞれ上記のように
スカラ変数と配列を区別させて認識させたいのですが
どのようにすれば良いのでしょうか?
よろしくお願いします。
お約束として。
リファレンス使え。
84 :
81:04/07/18 22:30 ID:???
やっぱり参照使わないと実現できないのでしょうか?
もし使わずに実現できる方法があれば教えてほしいです。
ルートユーザしか使えないアプリをCGIから
動かしたいと考えています。perlを使ったCGIで
ルートユーザかしか使えないコマンドを
入力する方法はないでしょうか?
今、自分が作っているCGIの前に人が作った
認証を通す必要があり、ユーザは自分が指定した
一般ユーザでログインしているという形になります。
通常のコマンドであればシングルコーティションで
囲えばよいことがわかっているのですが、当たり前
ながら一般ユーザではroot専用のコマンドは
入力できません。
方法がありましたら、教えてください
ユーザに権限与えて sudo
>84
配列が一番後ろなら出来る。
が、リファレンスを使った方が問題が起こりにくい。
リファレンスを使わずにやるなら、複雑な方法になるか、問題の起こりやすい方法になるかどっちかだ。
>>81 Perl5.8以上なら
sub hogging($\[@]$) {
my $top = shift;
my @middle = @{+shift};
my $bottom = shift;
print("top = [$top]");
print("middle = [@{[join(',',@middle)]}]");
print("bottom = [$bottom]");
}
my @unko = (A..Z);
test("Test Start", @unko, "Test End");
これで出来ますよ
訂正
s/test/hogging/;
>>88 プロトタイプ宣言は 5.002 から利用可能だが。
sub test($\@$) {
my $top = shift;
my @middle = @{+shift};
my $bottom = shift;
...
それってひょっとして
hoge($aa,@bb,$cc,@dd) みたく配列が二つ以上ある場合でもできたりします?
93 :
84:04/07/19 04:16 ID:???
>>87-90 やはり参照を使うのが無難のようですね。
しかし、勉強になりました。
どうもありがとうございました。
>>90 そうなんですか
自分が情報を得ているところでは、[Perl5.8の新機能]となっていた為、誤解をしてしまった様です
ご指摘有難うございます
ふむ。
96 :
nobodyさん:04/07/19 21:58 ID:54seOava
log.csv ってファイルに、改行したデータを書き込みたいんですが、
上手く書き込めません。
同じ行に表示されるようにしたいんですが、次の行に改行されてしまいます。
上手く、一つのセルに改行したデータを入れたいんですが、どうすればよいでしょうか?
コードは、下のようなのを使っているのですが・・・・
根本的に間違ってたりするんでしょうか?
$aaa = '123';
$bbb = '456';
@ccc = '789',
'0123';
open(LOGFILE,">>log.csv");
$LOG = "$aaa,$bbb,@ccc";
print LOGFILE $LOG;
close LOGFILE;
>>96 Excelで表示する時の話?セルっつーのが何のことやら。
特定のアプリでの表示の話なら、
逆にそのアプリで改行して保存したものを覗いてみれば分かると思われ。
98 :
nobodyさん:04/07/19 22:27 ID:54seOava
>>97 Excelで開いた場合です。説明不足ですみません。
メモ帳で開くと、改行のコードの問題みたいです。
改行コードの変換は
$ccc =~ s/\n/\r/g;
で良いんでしょうか?
99 :
nobodyさん:04/07/19 22:32 ID:OSilZxWF
>>96 perlコーディングには関係ないが
CSV形式では普通セル内に改行やカンマがあるときは「"」で囲うよ。
で「"」内では「"」を「""」で表現する
それからエクセルではセル内の改行は\r\nではなくて\n
100 :
nobodyさん:04/07/19 23:24 ID:54seOava
>>99 エクセル内の改行は\nなんでしょうか?
とすると、
$ccc =~ s/?/\n/g;
「?」の部分には何を入れればよいのでしょう?
上記のように、s/\n/\r/g; として書き込んだファイルを
メモ帳で開くと、見た目はUNIX改行コードっぽくなっているのですが、
エクセルで開くと、セル内改行が出来ていないようです・・・
>>100 1 │3 │4
2 │ │
─┼─┼─
5 │6 │7
│ │8
↓
"1\n2",3,4\r\n5,6,"7\n8"\r\n
あとメモ帳じゃなくてバイナリエディタ使ってみな。
質問させてください。
ロケットマウスというソフトの設定ファイルをperlで生成して出力させようと
思ったのですが
ロケットマウスでは記号(){},+^~%`と半角スペースは特殊文字として
認識されてしまうのでメタキャラとして設定ファイルとして書き込む場合には
「+あかさたな+」という文字列では
「{+}あかさたな{+}」と置換してからファイルに書き込むようにしなければならないので
my $Name_T = '+あかさたな+';
my $Name_T = ~s/+/{+}/g;
のように置換できたのですが
「+-あかさたな-+」のようなものを上に書いたような形で一発で置換する
ことはできないのでしょうか?
最悪一つ一つ置換していけばOKなのですができればスマートに
できたら幸せになれます。
どうぞよろしくお願いします。
105 :
103:04/07/20 14:24 ID:???
解答、説明リンク、誘導ありがとうございます。
勉強になります。
次からはム板でさせていただきます。
open(DATA, "index.html");
@data=<DATA>;
close(DATA);
foreach $data( @data ) {
とやって、同じディレクトリのindex.htmlを読み出して、携帯電話対応に書き換えるスクリプトを作ってたんですが、
ヘッダーをつける
<body>という文字列が見つかるまで、$data = '';に書き換える
次の$dataから書き出す
</body>が見つかったらそれ以降を$data = '';に書き換える
フッターをつける
とやってたんですが、なんか回りくどい気もします。
ヘッダ、body要素の中身、フッタを簡単に分ける方法ってないですかね。
107 :
106:04/07/22 07:43 ID:???
よく考えたら回りくどくはないですね。
@dataから一行ずつ引っ張り出した、<body>〜</body>の$dataを@bodyに格納したいんですが、
$dataを書き直して、@bodyに入れていく、の方法がわかりません。
$dataを書き直して吐き出す、までは出来てるんですけど。
#@bodyをバイト数で割って、「次のページ」というのをやりたいんです。
108 :
106:04/07/22 08:06 ID:???
push(@body,$data);
で出来ました……。板汚しごめんなさい。
109 :
nobodyさん:04/07/22 09:18 ID:0RDyhyxo
open(DATA, "index.html");
$data .= $_ while read(DATA,$_,1024);
close(DATA);
if ($data =~ m{<\s*body.*?/body\s*>}i) {
$head = $`;
$body = $&;
$foot = $';
}
>>106-108 #!/usr/local/bin/perl
use strict;
my @body;
m|<body>| .. m|</body>| and push @body, $_ while <DATA>;
shift @body; # <body> を捨てる
pop @body; # </body> を捨てる
print @body;
__DATA__
<html>
<head><title>test</title></head>
<body>
<h1>test</h1>
<p>foo</p>
<p>bar</p>
</body>
</html>
111 :
nobodyさん:04/07/23 00:29 ID:TCCtsz0d
質問です。
指定したURLのファイルの更新時間を取得したいのですが
どうやって取得すればいいのでしょうか?
>>111 Last-Modified HTTP/1.1 RFC2616
っていう答えでいいのかしら?
113 :
111:04/07/23 00:59 ID:TCCtsz0d
>>112 ぐぐってHTTPの仕様と言う事はわかったのですがそれ以上の事は解りませんでした。
それをどうすれば取得できるのでしょうか?
HEADリクエスト
115 :
111:04/07/23 01:31 ID:TCCtsz0d
ファイルの内容は取得出来ましたがヘッダの内容が取得出来ませぬ・・・。
require LWP::UserAgent;
$ua = LWP::UserAgent->new;
$request =
HTTP::Request->new('GET', '
http://google.co.jp/');
$response = $ua->request($request); # or
$response = $ua->request($request, '/tmp/sss'); # or
$response = $ua->request($request, \&callback, 4096);
sub callback { my($data, $response, $protocol) = @_;
print "$data";
}
>>115 GETじゃなくてHEAD
HTTPの仕組みくらい調べましょう
117 :
111:04/07/23 01:39 ID:TCCtsz0d
>>116 HEADだと何も帰って来ないんです。
からっぽです。
119 :
111:04/07/23 01:43 ID:TCCtsz0d
120 :
111:04/07/23 02:04 ID:TCCtsz0d
なんと出来ました。
require LWP::UserAgent;
$ua = LWP::UserAgent->new;
$request =
HTTP::Request->new('HEAD', '
http://akky.cjb.net');
$response = $ua->request($request);
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($response->headers->last_modified);
$year += 1900;
++$mon;
print "更新時:$year年$mon月$mday日 $hour時$min分$sec秒\n";
121 :
111:04/07/23 02:06 ID:???
訂正:なんと"か"出来ました。
>>122 猫は GIF アニメーションを使って擬似的に連結しているからねぇ。
gifcatやstrcatの cat をマジでネコだと思ってるヤツって、どれくらいいるんだろなw
catコマンドはもともと猫であってるよ。
でもそれじゃあ格好がつかない というわけで
連結(conCATenate)だと由来を後付した。
125立つ瀬ねえなw
. ィ
>>125 .._ .......、._ _ /:/l! そんなエサでぬこさまが(ry
:~""''.>゙' "~ ,、、''‐'、| _
゙、'、::::::ノ:::::::_,.-=. _〜:、 /_.}'':,
``、/:::::::::__....,._ `゙'Y' _.ェ-、....._ /_゙''i゙ノ、ノ
,.--l‐''"~..-_'.x-='"゙ー 、`'-、 ,:' ノ゙ノブ
" .!-'",/ `'-‐'') /\ `/ でノ-〈
.-''~ >'゙:: ‐'"゙./ ヽ.,' ~ /
//::::: ', / ,:'゙
質問いいでしょうか。BBSにワード検索機能を付けたのですが、
foreach $temp (@line) { # @lineはログ
$temp =~ s/\s*$//;
@data = split (/\t/, $temp); # タブ区切りなのでタブで分割
if (index ($data[0] . $data[1] . $data[2], $words) > -1) { # 名前,メール,本文 $wordはフォームから受け取った検索ワード
push (@new, $temp);
}
}
このようにして、@newの中身をforeachで書き出せば、指定語句を含むものだけは書き出せました。
これを、検索ワードをスペース区切りで複数指定可能にしてAND検索をできるようにしたいと思っています。
$word =~ s/\x81\x40/\t/g; # スペースで区切って入力されたフォームの検索ワードをタブ区切りにする
@words = split (/\t/, $word); # 検索ワードをタブで区切って配列に入れる
この2行を追加して検索ワードを複数取得したのはいいのですが、indexの第二引数の部分で@wordsの中身を全て含む場合の記述方法が思い浮かびません。
どのような記述方法があるのでしょうか。
134 :
133:04/07/23 17:43 ID:???
$word =~ s/\x81\x40/\t/g;
@words = split (/\t/, $word);
foreach $temp (@line) {
$temp =~ s/\s*$//;
@data = split (/\t/, $temp);
foreach (0 .. $#words) {
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
push (@new, $temp);
}
}
}
このように記述してしまうと、検索ワードを複数指定した場合、
「検索ワードを含む記事の数 * 検索ワード数」分の記事が出てしまうのです。
Ex1.
「オレオレ!ばぁちゃん、車ぶつけて50万必要なんだ」という記事がある場合、
検索ワードを「オレオレ ばぁちゃん 車ぶつけて 50万必要」などとすると、同じ記事が4つ@newの中に入ってしまいます。
Ex2.
「オレオレ!ばぁちゃん、車ぶつけて50万必要なんだ」という記事と、
「オレオレ!ばぁちゃん、車ぶつけて50万必要なんです」という記事がある場合、
検索ワードを「オレオレ ばぁちゃん 車ぶつけて 50万必要」などとすると、
「〜必要なんだ」という記事が4つ、「〜必要なんです」という記事が4つの計8つが@newの中に入ってしまいます。
じゃあ、どうしたらいいと思う?
136 :
133:04/07/23 18:00 ID:???
>>134の
> if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
この部分は
if (index ($data[0] . $data[1] . $data[2], $words[$_]) > -1) {
の間違いです。失礼しました。
>>133 そこまで書けるんならそんな難しい事じゃないと思うぞ。
foreachの中でマッチするたんびにpushしてるからそうなるんであって、
flag設定してflagたった時だけpushするとか、
grepで一個でもtrue返したらpushするとか。
方法はいろいろあると思うけど、もうちょっと自分で考えてみれば?
>>138 無駄フラグ作ったり、grepで全検査するよか
LINE: foreach $temp (@line) {
・・・
foreach (0 .. $#words) {
next LINE if index($data[0] . $data[1] . $data[2], $words[$_]) == -1;
}
push (@new, $temp);
}
のがいいのでは?
>>137はそういうことではないかと。
まあ、だからそういうふうに、
いろいろ方法はある訳で、
ちょっとは自分で考えたら?
と言いたいわけですわ
>>140 漏れは元質問者じゃねーが、壷に嵌ったときはさらさらコードを書けるが、ドツボに嵌った時は何をやっても書けない。。。
そんな時つい2ちゃんに書きたくなるんだよ。
しかし、一歩も踏み出さずに投げられても、
それこそ幾通りも方法はあるし、それじゃ
丸投げと同じじゃんよ。
少しは自分で考えてやってみろって、
それでうまく行かないってんならアドバイスのしようもあるけど、
145 :
126:04/07/23 20:14 ID:???
呼んだ?
呼んでないよ
あははは!
おーい、そろそろ次の質問をどうぞー。
みんな暇してるゾ。
printf("%s",substr(<<EOT,0,-1).substr(<<EOU,0,-1).substr(<<EOV,0,-1));
\x8e\x9f\x82\xcc
EOT
\x8e\xbf\x96\xe2
EOU
\x82\xc7\x82\xa4\x82\xbc
EOV
150 :
133:04/07/24 17:26 ID:???
色々なレスありがとうございました。
もう少し色々実験してみます。
@fooに\nで区切られた文字列があって、
5000文字に一番近い\nごとに区切りたい(4951文字目のあとに\nが来れば、4951文字目まで、とそれから5000文字に一番近い\nまで、という感じです)のですが、
substrを使ったら\nの個数がでてきたり、と全くわけがわからなくなってしまいました。
ご教授願えませんでしょうか。
152 :
nobodyさん:04/07/25 06:27 ID:RBsrNYZO
>>151 わけがわからないのはお前の質問だ。落ち着いてわかるように書け。
とりあえず突っ込みどころとしては
配列@fooに文字列が入ってるってどういうことよ?
5000文字に一番近い\nっていうが、4999文字目と5001文字目に\nが
あったらどっちが一番近いのか?
一番近いの\nごとというが、一番近いのは1つじゃないのか?
\nがなかったらどうするよ?
|← 5000文字 →|
@@@@@@@\n
@@@\n@@@@\n
@@@@@@\n
@@@@@@@@@\n
こんな感じに幅を合わせたいんじゃない?
5000文字目から後ろに\nを探して最初に見つかったところで──って感じかなあ。
正規表現は{,5000}みたいに大きな数字は扱えなかったような気がするので、
ループが入るとは思う。
>152-153
>153さんのいうような感じで、5000以下のパケットのようなものを作りたいんです。
具体的に言うと、
ページを携帯電話対応に書き換えるスクリプトを作ってるんですが、
ヘッダをとって、body部分を6KB以下に分けたいんです。
ただ、改行で切らないと、タグの途中で切れたりしちゃうので、それを避けるために一番近い(以前に、です)\nを探す、というのも必要だったんです。
>>151 じゃあヒント。
ループでひとつ毎にサイズ計測。
欲しいサイズまで確認できたらループ脱出。
(´-`).。oO(一定サイズで切るとは変わったアプローチだな・・・)
タグが<a
href="hoge">
とか二行に分かれてたらどうすんだよ。
>>158 あ、大丈夫です。自分のサイト用ですので。
>>159 じゃあ、携帯用改ページタグでも埋め込んどけば?
前の話題も終わってないのに申し訳ないですが、質問させてください。
二つのCGIがあり、片方はフォームからPOSTで。
もう片方は<a href= でリンクで飛ばしています。
これらを別のCGIで吐き出されるページで使いたいのですが、
片方ずつならちゃんと動作するのに、両方を同時に設置するとどちらもエラーになります。
GETとPOSTは共存できないのですか?
ンなアホな
>>161 んだ。イメージが全然浮かばない。
クライアントからの1リクエストにGETとPOSTを同時に含めることはできない。
URLにGETもどきのパラメータを仕込んでPOSTすることは可能。
・・・って、くらいしか答えられん。
>>151 substr($x, 0, 1+rindex($x, "\n", 4999))
よくわからんが結局こういうことがやりたいのだろうか?
5000文字以内に改行がないときは空文字列になるけど、
いやなら適当に直してね。
Perlで画像貼り付け掲示板を製作中なんですが、
引っ張ってくる画像が閲覧可能であるか、不可であるのかは判別可能でしょうか?
思考錯誤してますがどうにも苦戦中です。
何卒ご指導お願いします
167 :
nobodyさん:04/07/25 22:33 ID:8FggQcGj
チャット参加者一覧を作りたいのですが
http://〜/member.dat のようなファイルをHTMLで読見込むにはどうしたらよいでしょう?
勿論Perlでも構いません
教えてください
ActivePerlとApacheをインストールしてApacheを起動させました。
それで、CGIを実行出来るかアドレスを打ったのですが、
ファイルのダウンロード
ファイルによっては、コンピューターに問題を起こす可能性があります。
以下のファイル情報に関して疑わしい点がある場合や、発信元が完全に信用で
きない場合は、このファイルを開いたり保存したりしないでください。
ファイルを開くか、ファイルをコンピューターに保存するか選択してください。
と、でてしまい開くを押しても何も起こりません。
どうすればCGIを実行出来るんでしょうか?
>>169 すません、わかりました。
ありがとうございました。
>165
それです。完璧です。有難う御座いました。
openでエクセルのファイルを開いて@dataに入れたんですが、
呼び出すと、文字化けしてます。content-typeが問題な気もするんですが、どうしたらいいんでしょうか。
173 :
172:04/07/26 01:20 ID:???
txtでタブ区切りで作って、拡張子を変えたら使えました。謎です。
アホか・・・
175 :
133:04/07/26 14:29 ID:???
>>133です。
突っ込もうとしているログのデータが配列内に無かった場合のみ、という判定方法で正常に動作しました。
ありがとうございました。
$word =~ s/\x81\x40/\t/g;
@words = split (/\t/, $word);
foreach $temp (@line) {
$temp =~ s/\s*$//;
@data = split (/\t/, $temp);
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) {
if (!grep $temp eq $_, @new) {
push (@new, $temp);
}
}
}
176 :
133:04/07/26 14:35 ID:???
正常に動作してなかった・・・。
ちとタンマ。
178 :
133:04/07/26 15:23 ID:???
>>177 grepはNGですか、foreachに書き換えることにします。
ちなみに
>>175のコードって、これはOR検索になってますね orz
179 :
133:04/07/26 18:16 ID:???
ようやく動きました。アドバイスありがとうございました。
$word =~ s/ | /\t/g; # スペースで区切って入力されたフォームの検索ワードをタブ区切りにする
@words = split (/\t/, $word); # 検索ワードをタブで区切って配列に入れる
if ($search eq "and") { # 検索方法がAND形式である場合
foreach $temp (@line) { # 配列の数だけ繰り返す
$temp =~ s/\s*$//; # 行末の改行コードや空白を取り去る
@data = split (/\t/, $temp); # 一行取り込んだ部分を分割して配列に格納する
@check = (); # チェック用配列を初期化
foreach (0 .. $#words) { # 検索ワードの数だけ繰り返す
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) { # 配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在した場合
push (@check, 1); # チェック用の配列に1を入れる
} else { # 配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在しない場合
push (@check, 0); # チェック用の配列に0を入れる
}
}
$output_flg = 1; # データ出力用フラグを用意する
foreach (@check) { # 配列の数だけ繰り返す
if (!$_) { # チェック用の配列に0がある場合
$output_flg = 0; # データ出力用フラグを0にする
last; # ループを抜ける
}
}
if ($output_flg) { # データ出力用フラグが立っている場合
push (@new, $temp); # 検索ワードが存在するログの行を新しい配列に格納する
}
}
180 :
133:04/07/26 18:17 ID:???
} else { # 検索方法がOR形式である場合
foreach $temp (@line) { # 配列の数だけ繰り返す
$temp =~ s/\s*$//; # 行末の改行コードや空白を取り去る
@data = split (/\t/, $temp); # 一行取り込んだ部分を分割して配列に格納する
foreach (0 .. $#words) { # 検索ワードの数だけ繰り返す
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1) { # 配列から取得した名前、メールアドレス、本文を結合したテキスト内を検索して、検索ワードが存在した場合
$exist_flg = 0; # データ存在フラグを用意する
foreach $_ (@new) { # 配列の数だけ繰り返す
if ($_ eq $temp) { # ログから取り込んだ一行が新しい配列内にあるデータと一致する場合
$exist_flg = 1; # データ存在フラグを立てる
last; # ループを抜ける
}
}
if (!$exist_flg) { # データ存在フラグが立っていない場合
push (@new, $temp); # 検索ワードが存在するログの行を新しい配列に格納する
}
}
}
}
}
grepの部分も
>>177が提案してくれた方法で書いてみました。
181 :
nobodyさん:04/07/26 18:21 ID:QB5gv79+
携帯用のサイトを作っているのですが、質問させてください。ある変数の中に
「DoCoMo 2.0 N900i(c100;TB;W24H12;ser***;icc***) 」 (***はランダムな英数字)
という文字列が入ってるとして、「(」以降を切り捨てて
「DoCoMo 2.0 N900i」だけにするにはどうすればよいのでしょうか?
substrで桁数を指定するしかない?
>>181 そこで正規表現ですよ。
というか、いろんな方法があるから好きなのを選べばいいと思う。
s/\(.+\)//
184 :
nobodyさん:04/07/26 19:24 ID:84cm3KM0
>>133 どうでもいいけど無駄多いな
@words = /([^ | ]+)/g;
foreach (@line) {
s/\s+$//;
@data = split(/\t/);
$hit = 0;
foreach $sword (@words) {
$hit++ if index("$data[1]$data[2]$data[6]", $sword) > -1;
}
next if !$hit;
push(@new,$_) if $search ne 'and' or $hit == $#words + 1;
}
じゃだめか?
@words = ($word =~ /([^ | ]+)/g);
こうか
186 :
181:04/07/26 20:14 ID:QB5gv79+
>>182 携帯からでしか確認できないのと今手元に実機がないので
また失礼します。何度もすいません。
$data = s/.+(.+)//;
でいけますかね?これで「(」と「)」にはさまれた部分を削除できる・・・かな?
>>186 $data =~ s/(.+)\(.+\)/$1/;
188 :
181:04/07/26 20:47 ID:QB5gv79+
>>187 レスありがとうです。
私はアホなので意味がさっぱりわからないんですが
これそのままコピペしてもいいのかな・・・。
ちょっと拝借して明日動作確認してみますね。
というか
>>183さんも今見たらアドバイスくれてたっぽいですね。
こっちも私には難解だけどありがとうです。
>>133 どうでもいいが、and検索時にログに検索対象の文字列の有無を判定する時に、
配列に0やら1やらを突っ込んで後からチェックするってやり方が俺と同じだ。
わからないときはフリーのソースでも拾って参考にしなさい。
どうでもいいが、本7か?
191 :
133:04/07/27 00:11 ID:???
>>133です。
>>184-185氏、そのような書き方もあるのですね。
自分はまだ色々と省略されると見直す際にワケわからなくなるので、
まどろっこしくても極力ああいったソースの書き方をするようにしています。
それらのソースも参考にして、もう少し改善してみようと思います。
とりあえずは動くので失礼します。
ありがとうございました。
>>191 184-185 は無視しておきましょう。
あと、検索部。
if (index ($data[1] . $data[2] . $data[6], $words[$_]) > -1)
検索語が跨ぐ場合も考えられますのでご注意の程を。
ex.
$data[1] = '2004/07/27';
$data[2] = 'sage';
$data[6] = 'test test test';
@word = qw|27sa agete|;
>>181 ($foo,$bar) = split(/(/,$aruhensuu);
で、$fooじゃダメか?
194 :
nobodyさん:04/07/27 02:53 ID:tzLxOAtQ
入出力ファイルフォーマットが変更になった場合、
関係部分のコーディングを全て修正するのは大変なのですが、
c言語のように、ファイルフォーマットのマクロ定義みたいなことは、perlでは
できないのでしょうか?
196 :
nobodyさん:04/07/27 10:11 ID:lcTiWytf
フォームCGIを、unicode 対応しようとしているのですが、うまくいきません。
Perl のバージョンは、Ver 5.8.0 なので、
フリーのCGIを利用して
@ CGIにに、 use utf-8; 行を追加
A CGI中の、 jcode.pl を利用している部分を削除
B 送信用HTMLをutf-8 に変更
し、送信テストを試みるのですが、受信したメールが文字化けしてしまいます。
レス頂ければ幸いです。
>>196 正直な話、スクリプト改造丸投げスレの方が君に合っていると思う
199 :
181:04/07/27 11:40 ID:5fKcxtBP
遅くなりましたけど、
>>187の方法でうまくいきました。
ありがとうでした。あと
>>193さんもありがとう。まだ試してないけど
今後のために保存しておきます。皆様感謝感謝〜 m(_ _)m
200 :
nobodyさん:04/07/27 12:14 ID:q+Q9Gs/i
次のようなリストに行を追加するのに、通し番号を付けたいんだが
1111,データ1
1112,データ2
1115,データ5
最大値をとってそれに1を足そうとしたんだけれど
$noに1だけ入ってしまいます。どうも最大値が文字列
扱いされているようです。
どんな感じになおしたらいいだろうか。
while(<IN>){
chomp;
$record{(split(/,/,$_))[0]} = $_;
}
$no = ((((sort keys %record))[-1]));
$no++;
close (IN);
オレの手元でそのプログラムにそのデータを食わせると
1116になるので、その意味では直す必要はないよ。
ここに書いてない部分がおかしいか入力ファイルがおかしいか
というあたりだろう。もう一度良く見ろ。
特にwhileループ抜けたあとで%recordがどうなってるか、sortのあと
$no++する前の$noの値はどうなってるか、といったあたりを確認
することをオススメする。
ついでにもう1つ。番号の部分が4ケタ固定ならそれでもいいが、
そうでないならsortは文字列比較がデフォルトなので、<=>を
使った比較を明示しないとおかしくなるよ。
203 :
nobodyさん:04/07/27 12:48 ID:5NNnTCFI
从リ ゚д゚ノリ ハァ?
最大値取るだけで、意味不明なことやりすぎ。
↓で十分だろ
while(<IN>){
if (m/^(\d+),/) {
$max = $1 if $max < $1;
}
close (IN);
204 :
nobodyさん:04/07/27 13:20 ID:YbDKdELb
再利用するんだろうよ
>>200 外の括弧が余計なのでは?
リストとしてスカラーに代入すると、そのリストの長さが入っちゃいます
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
foreach(0..@hoge1 -1){
if($hoge1[$_] ne $hoge1[1+$_] ){
push(@hoge3,$hoge1[$_]);
}
}
foreach(0..@hoge2 -1){
foreach$wk(0..@hoge3 -1){
if($hoge3[$wk] eq $_){
push(@hoge4,$_);
}
}
}
結果
@hoge4の中身
"1"
"4"
"5"
質問させて頂きます。
@hoge1、@hoge2の要素を比較して同一だった要素を
@hoge4のように1つだけ取り出す為に上記のようにしてみましたが
効率が悪いような気がします。
もっとスマートに出来る方法はないでしょうか?
207 :
206:04/07/27 14:21 ID:???
@hoge3はあとで使いますので別ループにしてあります。
hash使え。
foreach (@hoge1) { $h{$_} = 1; }
@hoge4 = grep {$h{$_}} @hoge2;
一例としてはこんなとこか?
@hoge2、@hoge3 は常にソートされていて、重複した値を含まないのなら
my $m = 0;
my $n = 0;
while($m <= $#hoge2 and $n <= $#hoge3) {
if($hoge2[$m] < $hoge3[$n]) {
push(@hoge4, $hoge2[$m++]);
} else {
$hoge2[$m] == $hoge3[$n] and $m++;
push(@hoge4, $hoge3[$n++]);
}
}
テストしてないので動作に保証出来ません(単にマージしただけだけど)
Perlだと、組み込みのハッシュ使った方が早いかも
>>206 後はこんなんとか、
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print sort keys %{{map{($_ => 1)}@hoge1,@hoge2}};
>>210 それ動かしてみたけど12345になるぞ。
期待している結果は1,4,5だったはず。
212 :
206:04/07/27 17:35 ID:???
>>208 grepを使って何とか出来ないかと思っていたのですが
hashを利用しての真偽判定でしたか。
大変参考になりました。どうもありがとうございました。
>>207 @hoge3みたいに重複した要素を取り除いた結果が欲しかったら
@hoge1 = grep(!$h{$_}++, @hoge1);
↑とperlメモのコピペを貼るやつ
perl でリモートデバッグやっている人います?
いるとしたらどんなツールを使っていますか
>>211 あ、そか、勘違い。
すません、じゃこれ
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
>>213 重複した要素を取り除くなら、これ
@hoge1=( "1", "1", "1", "3", "4", "5", "5" );
@hoge2=( "1", "2", "4", "5" );
print grep{!exists ${{map{($_ => 1)}@hoge1}}{$_}}@hoge2;
>>217 重複した要素を取り除くんじゃなくて、
@hoge1にない@hoge2のみの抽出、だな
219 :
nobodyさん:04/07/27 19:35 ID:OzHvZIRF
ちょと質問です。
http://tech.millto.net/~pngnews/kndh/PngSpec1.2/PNG-CRCAppendix.html リンク先のアルゴリズムを単純にPerlに書き換えてみたんですが
全然CRC32にならなくお手上げになってしまいました。
原因はどこにあるのでしょうか?
ご教授の程宜しくです。
一応ソース貼っておきます。
テストなんでいきなり文字列渡してsplitして、最後は整形して返してますが。
print &getCRC('string');
sub getCRC {
my ($c, $n) = 0xffffffff;
unless (defined @crcTable) {
for (0..256) {
$crcTable[$_] = $n = $_;
$crcTable[$n] = $crcTable[$n] & 1 ? 0xedb88320 ^ ( $crcTable[$n] >> 1 ): $crcTable[$n] >> 1 for 0..7;
}
}
$c = $crcTable[ ($c ^ $_) & 0xff ] ^ ($c >> 8) for split //, shift;
return sprintf "%08x", $c ^ 0xffffffff;
}
220 :
219:04/07/27 19:39 ID:???
s/ for (0..256) / for (0..255) /;
>>219-220 # やはり Pure Perl 実装に需要があるのかな…。
以前同じものを作ってたヤツ。動くかどうかは知らん。:p
my @crc = (0..255);
for my $c (@crc) {
$c = $c & 1 ? 0xedb88320 ^ ($c >> 1) : $c >> 1 for 0..7;
}
sub crc {
my $str = pop;
my $len = length $str;
my $pos = 0;
my $crc = 0xffffffff;
# CPU を食うが恐らく省メモリ
$crc = $crc[ ($crc ^ ord(substr $str, $pos++, 1)) & 0xff ] ^ ($crc >> 8)
while $len--;
# メモリを食うが恐らく高速
# $crc = $crc[ ($crc ^ $_) & 0xff ] ^ ($crc >> 8)
# for unpack 'C*', $str;
pack 'N', ~$crc;
}
222 :
nobodyさん:04/07/27 21:00 ID:cIaHUHzz
>>203 すみません、最大値を取る参考にしようとしていますが、
コードがシンプルすぎて、私のような初心者には
どういう動作をしているのか、わからないので
少し解説していただけないでしょうか?
m/^(\d+),/ この部分がどういう動作をしているのかがまず、わからないのですが。
それからどういう仕組みで$1が出てきて、中に
何が入ってくるのでしょうか?
それから$maxに$1という変数の値を入れた後に
if で$max < $1という条件比較をしてますが、真
だったときの実行内容が省略されていてわかりません。何が省略されているのでしょうか?
223 :
nobodyさん:04/07/27 21:10 ID:AqRc0k7e
*.csv形式のファイルに書き込んで、Excelで開いた時について、質問です。
以前、ここのスレッドで教えて頂いた内容を参考に
open(LOGFILE,">>log.csv");
print LOGFILE "\"あああ\nいいい\"";
close LOGFILE;
と記述し、Excelで開いた場合にもセル内で
改行が行われるようになりました。
ですが、改行して保存されるようにはなったのですが、
-----------
あああ・
いいい
-----------
のように、改行の部分に「・」と言った
不要な文字が表示されてしまいます。
これを、表示させないようにするにはどのようにすれば良いのでしょうか?
225 :
200:04/07/27 21:35 ID:???
>>201 すみません、書いてない部分の問題みたいです。
$no++する前の中身は空でした。orz
226 :
200:04/07/27 21:48 ID:cIaHUHzz
他のところも、書きますので変な部分があれば、ご指摘願えませんでしょうか?
$genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';# 会場データファイル名
$act = "edit";
###### 会場データの読み込み ######
&lock;
open KAIBA,"$kaibadata" or die &error("会場ファイルが開けません");
@kaiba = <KAIBA>;
my $n;
$n = 0;
foreach $kaiba(@kaiba) {
chomp $kaiba;
($kai_id,$kai_name,$kai_tan,$kai_syoku,$kai_busyo,$kai_tel,$kai_fax) = split(/<>/,$kaiba);
if ($kai_name eq $kaibamei){$act = ""; print "同一の会場名が存在します。<br>";
print "既存会場名・・・$kai_name<br>\n";
print "入力した会場名・・・$kaibamei<br>\n";
print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
&unlock;
}
$kai_tel =~ tr/0-9//cd;
if ($kai_tel eq $kaibatelno){$act = ""; print "同一電話番号の会場がすでに存在します。<br>\n";
print "既存会場電話番号・・・$kai_tel<br>\n";
print "入力電話番号・・・$kaibatel<br>\n";
print "<center><button onclick=\"history.back()\">戻る</button><br>\n";
&unlock;
}
}
}
長いのでいったん切ります。
227 :
200:04/07/27 21:50 ID:cIaHUHzz
次にこれがきます。
### 追加会場ID生成
while(<KAIBA>){
chomp;
$record{(split(/<>/,$_))[0]} = $_;
}
$new_kai_id = (((sort keys %record))[-1]);
$new_kai_id++;
close (KAIBA);
ここで、$new_kai_idの中身が1になってます。
228 :
200:04/07/27 21:51 ID:cIaHUHzz
後、これがサブルーチンです。
###### ロックファイル処理 ######
sub lock {
local($flag) = 0;
foreach (1 .. 5) {
# ロックファイルが存在すれば1秒待つ
if (-e $lockfile){ sleep(1);}
# ロックファイルが存在しなければ生成する
else {
open (LOCK,">$lockfile");
close (LOCK);
# ロックに成功したらフラグを立てループを抜ける
$flag = 1;
last;
}
}
}
### --- ロックファイル処理 END --- ###
###### ロックの解除 ######
sub unlock {
if (-e $lockfile) {unlink($lockfile);}
}
### --- ロックの解除 END --- ###
>>219 Perlのビット演算はちょっと特殊な様です
vec 関数とか使ってみると幸せになれるかも
230 :
200:04/07/27 21:52 ID:cIaHUHzz
それから、サンプルデータの中は
100001<>○○ホール <>鈴木<>青 <>777<>0552-99-0000 <>0552-99-0000
100002<>○○公園 <>佐藤 <>黄 <>777<>044-999-0000 <>044-999-9999
100003<>○○○第2別館 <>田中 <>白 <>777<>03-9999-0000 <>03-9999-9999
1<>○○駅前広場<>テスト<>テスト<>777<><>
1<>test<>test<>test<>default_bumon<>111<>111
1<>テスト<>テスト<>テスト<>596<>1<>2
このような感じです。
232 :
219:04/07/27 21:55 ID:???
>>221 どーもです。
返り値を
unpack 'H*', $crc;
でバッチリでした;-)
ありがとです。
>>229 どーもです。
幸せを探してきます。
233 :
200:04/07/27 22:03 ID:???
ちなみに、KAIBAとなっているのはKAIJOUだとちょっと長いのと、カイバの方が2ちゃんちっくな
読み方でおもろそうだったので。
別に日本語が不自由なわけじゃないですよ。
>>230 %recordの中身みたか? 多分からっぽだと思うのだが。
KAIBAファイルハンドルはopen直後の
@kaiba = <KAIBA>;
で全部読み出されてしまっているハズ。
あとこの問題とは関係ないがそのロックは全くなってない
ので勉強して書き直すこと。
ロックどころか全部なってないと思うのは漏れだけか?
236 :
200:04/07/27 22:20 ID:cIaHUHzz
>>234 ありがとうございます。
@kaiba = <KAIBA> で
<KAIBA>の中身が@kaibaにコピーされると思って
おりました。取りだされていたのですね。
ロックの方はなんとか勉強しなおそうと思います。
237 :
nobodyさん:04/07/27 22:32 ID:AYL0W0ev
238 :
200:04/07/27 23:01 ID:cIaHUHzz
while(@kaiba) だと
応答が返ってこなくなるんですね。
もう一度開きなおすしかないのでしょうか。
もっと基本的なところから勉強しなおせ。
実際に組むのはそれからだ。
無限ループ起こすような奴は一から出直せ。
>>238 お前全部なってない。本買って勉強してから来い。
241 :
nobodyさん:04/07/27 23:48 ID:5NNnTCFI
>>238 $genbadata = 'C:/Program Files/Apache Group/Apache2/cgi-bin/test.dat';
とりあえず、cgiとdataは違うディレクトリに置いとけよ
ロックはお前みたいな初心者は素直にflock使っとけ。
XPならflock使えるし
242 :
nobodyさん:04/07/28 06:05 ID:GXYYbYLC
昨年の学校の夏休み中 親の店のHPを作りました。
CGIだけ詳しい友達に作ってもらったのだけど
この度HPリニューアルしたら、CGIだけがうまくいきません。
(アクセス権等は変更しました)
何かいじったわけではないし、その部分はそのままにしておいてはずなのに
(そこだけはそのままおいておいて新しいページとリンクしただけですが)
nobody@××.ne.jpという中身のない注文書がきます。
今ではHP注文もきて、傾いている店も繁盛してきたのに
どうしたらいいか・・・親の視線がいたいです
助けてください
その友人に聞け。
ここで聞くのは筋違い。
じゃなければ金出してプロに頼め。
>>245 むしろ普通だと思うが
友達が作ってくれたんだからその友達に聞くというのが、普通の人間の行動だと思うが
247 :
nobodyさん:04/07/28 18:30 ID:+xurfTPE
perlでCGIを組んでいます。
そのCGIにアクセスがあったときに、
そのフォルダ内のHTMLファイルを返すにはどうしたらいいのでしょうか?
ググろうにも・・・どうキーワードを打ち込んでいいのか分からないのでここへ来ました。
# 今はprintでJavaScriptを含むHTMLを出力して、
# そのJavaScriptで目的のHTMLファイルを読み込ませているのですが、
# どうも・・・
>>247 3回ゆっくり読みましたが、
何言ってるかわかりませんでした。
>>247 ここ書込んだときに「しばらくおまちください」みたいなページ出たよな?
それが答えの1つだ。
あとは。。。ロケーションヘッダでぐぐれ
253 :
nobodyさん:04/07/28 19:23 ID:H19oR7EL
perlで作成したCGIを10分事に自動実行させたいと考えています。
そこでcronを使って実現しようとしているのですがうまくいきません。
■動かしたいファイル:xxx.cgi
(4行目で require 'abcd.pl'; を記述してます)
■実行した手順
telnetでログイン
↓
crontab -e
↓
0-59/10 * * * * /home/www/●●●/public_html/xxx.cgi
↓
:x で終了
すると、line 4. (実行しているファイルの4行目)がエラーだと
いう記述のメールは届いてしまいます。
メールの原文は下記の通りです。
Can't locate ./abcd.pl
in @INC (@INC contains: /usr/local/lib/perl5/site_perl/5.005/i386-freebsd
/usr/local/lib/perl5/site_perl/5.005 . /usr/libdata/perl/5.00503/mach
/usr/libdata/perl/5.00503)
at /home/www/●●●/public_html/xxx.cgi line 4.
上記の通りなのですが、
うまく実行させるにあたりご教授願えればと思います。
254 :
247:04/07/28 20:05 ID:???
ありがとうございます。
>>248 ごめんなさい。
>>249-250 それでググってみます。
>>251 しばらくお待ちくださいから飛ぶのはmetaタグのやつですよね。
JavaScriptでもmetaタグでも、どっちにしてもページを介さなければならないのが
ちょっと・・・
「ロケーションヘッダ」でもググってみます。
>>253 エラーの意味は分かるよな?
cronの実行ユーザーにパスがないんだよ
絶対パスで書くか、use libでパス通せ
つーかcronで動かしてる時点で、CGIじゃねーんだけどな
>>253 それのどこがperlのコーディングの質問なんだよ。
>>257 スレタイ読めない半島の人間なんだよ。許してやれよ。
259 :
nobodyさん:04/07/29 07:52 ID:Y1hnbGEZ
>>234 Whileの前でもう一度ファイルを開いたら
なんとか動きました。これでお客さんになんとか見せれそうです。
ありがとうございました
PERLのオブジェクト指向について
通販サイトの注文CGIをPERLで作っていて疑問。オブジェクト指向で書き上げたいんだけど、
とりあえずEcomという名前のモジュールを作って、それのコンストラクタで単価、商品名等の基本部分を
設定。Ecomのコンストラクタが返すオブジェクトの初期プロパティに商品名とかのハッシュリファレンスを持たせる。
で、疑問なのはこのオブジェクトは当然モジュールEcomのメソッドを全て使用できるわけだけど
一体この場合のメソッドって一体何?
クラスにおけるメソッドの役割みたいなものがはっきりしない(理解できない)
っていうかどういう意味合いで使えばいいのかというか;ちょっと例を出してみる。
1.コンストラクタが返すオブジェクトの強化、改造のため
2.コンストラクタが返すオブジェクトのプロパティを参照して何らかの処理をして、呼び出し元に値を返す。
3.?思いつかない
未完成であるオブジェクトを完成させるのがクラスのメソッドなのか?みたいにも思うけど、
イマイチ。どう捉えれば一番すんなりいくのかな?
コーディング 【coding】
プログラミング言語を使ってソフトウェアの設計図にあたるソースコードを作成すること。
「プログラミング」とほぼ同義だが、仕様書やフローチャートなど抽象的な設計文書の内容を、
プログラミング言語を使って具体的なコードに変換していく、という意味合いが強い。
(e-Wordsより)
264 :
260:04/07/29 17:04 ID:???
>>264 Perl の配布パッケージに含まれている公式な説明書。> perldoc
和訳は駱駝本がそうであるとも言えるし、perldoc.jp のように有志の
手による部分訳もある。
266 :
522:04/07/29 19:47 ID:???
駱駝本って高いの?
267 名前: nobodyさん [sage] 投稿日:04/07/29 19:50 ID:???
>>266 >>6を1行ずつ声に出して三唱。
_| ̄|○
>>269 デモで見せるだけならまだいいが、ロックあのまま
で予約になんか使った日には...
このDBはロックだ。そしてこのデモを目にした客たちもロックだ。
272 :
nobodyさん:04/07/30 12:42 ID:As0li0gB
Perlで配列に入っている要素の数を知りたい場合ってどうやるんです?
[0]から順に数字が入っている事が前提でかまいませんので。
>>272 $n = $#array + 1;
か
$n = @array;
配列はスカラコンテキストだと要素数を返す。
>273
Thx.ありがとう。
275 :
nobodyさん:04/07/31 00:34 ID:k0R22EX1
配列の要素がいろいろな数字だとして、
2個以上配列の中に要素としてある数字を、
配列として読み込ませるにはどうすればいいですか?
具体的に言うと、
@array = (0,2,3,2,0,4,1);
こういう配列から
@req = (0,2);
こんな配列が作りたいんですけど・・・
for (@array){
$hash{$_}++;
}
for (keys %hash){
$hash{$_} > 1 and push(@req, $_);
}
277 :
275:04/07/31 01:08 ID:k0R22EX1
( ゚д゚)・・・
どうせなら
push(@req,$_) if $hash{$_} > 1;
の方がいいと思った。
オレなら
foreach (@array) {
push @req, $_ if ++$hash{$_} == 2;
}
とループひとつで済ませるかな。
if ++$hash{$_} >= 2;
==2だと「要素が二個だったら」になるぞ。
>>281 @arrayに2回以上出現する要素を@reqにひとつずつ
入れるのだから、==でいいはず。>=2だと
@array=(2,2,2)のときに@req=(2,2)になっちゃう。
283 :
nobodyさん:04/07/31 11:26 ID:JonE4G7J
初めて書き込みします。
perlを勉強しようと思いますが、
主にcpanを使ったwebプログラミングを作っていきたいと思いますが、
何をどこからやれればよいか途方に暮れています。_| ̄|○
参考になるサイトや本を探しても全然勉強にならない。
※ある程度知っている人向けが多い・・・_| ̄|○
猿でもわかるcpanやcpanを使ってのperlやcgiについて
参考になるサイトや書籍をご紹介いただければ幸いです。
お礼はアフィリエイトリンクを踏んで本を買います。
そしたら、利益供与(?)いたします。
284 :
nobodyさん:04/07/31 14:49 ID:RsJc0bwQ
Perlをはじめたくて、ActivePerlをインストールしたのですが、
Perlやppm等のコマンドを打つと、
'perl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
と表示されます。
何度か再インストールしても、Perlフォルダを消してみても同じでした。
どなたか解決策教えていただけませんか?
pathをちゃんと通した?
>>284 pathって打ってみて、表示されたリスト内にperl.exeのフォルダがなければパスが通ってない。
設定はシステム→詳細設定→環境変数から。pathを選んで好きな位置にフォルダを追加する。
(他のフォルダとは ; で区切る)
>>283 cpan、cpan言ってないでまずはperl自体を勉強汁。そうすれば、cpanのことも自ずと分かってくる。
ちなみに、webにあるperl講座とかは殆どが始めてやる香具師用だ。
それがちゃんと探してから言った言葉なら、冗談抜きで理解力無いんだと思うぞ。
perlの事がそこそこ分かってきて、cpanのライブラリも利用しようということになったら下のサイトが大いに役に立つだろう。
http://www.cpan.jp/
288 :
nobodyさん:04/07/31 15:28 ID:RsJc0bwQ
ありがとうございます。
pathと打つと、
PATH=C:\WINDOWS\system32;"%path%;C:\Perl\bin;C:\Perl\bin\;C:\WINDOWS;C:\WINDOWS\
system32\WBEM;
と表示されます。
perl.exeはC:\Perl\binに入っていたので、大丈夫だと思うのですが…。
再起動してみれ
"%path%
おもいっきりおかしいとこあるじゃん!
( ゚ д゚) …
何をどうやったらそんなものが紛れ込むんだろう
292 :
nobodyさん:04/07/31 22:49 ID:JonE4G7J
>>293 乙!
これから一覧が長くなると探すのが大変だから
検索機能あるといいね。
チャットのログファイルを読み込んでHTMLをはき出すCGIを作っています。
画像のURLがあった場合、その画像を拾ってきてサーバに保存する機能を付けたのですが、
画像のあるサーバが落ちている場合などは
connectがエラーを返すまでに時間がかかってしまいます。
connectがタイムアウトする時間を設定することはできないのでしょうか?
Windows上のサーバでCGIを動かすのでalarmが使えずに困っています。
その画像の著作権の方は大丈夫なのか?
297 :
295:04/08/01 08:47 ID:???
著作権ですか
どういう画像が貼られるかわからないのでなんとも・・・
アプロダも似たようなものだと思うんですがどうなんでしょうね
チャットにIMGタグで張られた画像がそのままだとF5アタックと変わらんしな。
299 :
295:04/08/01 09:43 ID:???
OpenNapのチャットログなのでタグの心配はないんです
>>295 普通は timeout 設定できるやろ
君がどういうライブラリ/クラス/関数使ってるかわからんのでやりかたはなんとも言えんが
wget なら窓でもあったっけ?
普通にあるし
>297
アプロダも「自分で描いた絵」なら全く無問題。
他人の絵を無断でアプしたら著作権侵害。
他人がやっているから自分もいいと考えるのはただの自己厨。
そういうシステムを作ろうってなら、まずは著作権を勉強しろ。
foreach (@array) {
push @req, $_ if ++$hash{$_} == 2;
}
++$hash{$_} == 2 ここの部分の意味教えてください・・・
>>306 $hash{$_} の値をインクリメントして「から」、2 と数値比較。
require 'lib.pl';
$lib = new LIB;
とやってlib.plにpackage LIB;
とやって、
print "Content-type: text/html\n\n";
とやってもエラーがでます。
「require 'lib.pl';」
「$lib = new LIB;」
この2つの行を消したらエラーは出ずに表示されるんですが、
なんでエラーがでるのでしょうか?
lib.pl の中に
new サブルーチンあるの?
「エラーがでます」だからどうした?言いたいことはそれだけか?
313 :
nobodyさん:04/08/03 08:57 ID:bp7Se8/y
スレッド天国
http://specters.net/cgipon/ のスレッド式掲示板の
スクリプトを改造してる形になるんですが、リンクをクリックしたら
ある変数に値を代入(ここでは$#aaaに1を入れたい)するというのは
どうすればいいんでしょうか?そのあとにIFを設置して条件分岐の材料に
したいのですが、下の通りにやっても処理されてくれません。元の文はこれです。
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D">);
で、これを
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D" $#aaa=1>); とか、
$body .= qq(<A $href="$thisfile?$reload&sch=%5B$tnm%5D&$#aaa=1">); とかにしても
うまく動作しないんです。こういう処理って無理なんでしょうか?
PerlでLinuxサーバにコマンドを打ってそれを実行させる?ような
記述方法をお聞きしたいと思います。
例えば、Perlで作ったフォームに「Shutdown」というボタンがあったとして
このボタンを押すと「shutdown -h now」というコマンドがサーバに
反映されてサーバ機が止まるような。
こういうことって出来るのでしょうか?
>>315 例のshutdownの実行には、root権限が必要そうだが、コマンドを実行するだけなら、exec(), system(), open(), ``などの方法がある
>>315 sudoでapacheに権限与えて実行
>>316 openで指定のファイルを開いてprintですか?
これなら方法はわかるし、できるかも。。
(゚Д゚ )ハァ?
うーん。
>>316-317を見て「そうあっさり答えるのが普通なの?」と
思ったんだけど、俺が神経質すぎるだけなのかなあ。
フォームのボタンで/sbin/以下をごにょごにょするって話にしては
なんだか呆気なく感じたんだけど、気にしすぎ?
# スレ違いでごめんなさい。
popenじゃなくてopenなの?、perlって
>>322 そうなんだよ
だから、書き捨てスクリプト作るときには
涙出るほど便利
324 :
320:04/08/04 00:17 ID:???
>>321 うまく言えないんだけど、
入門書にある「print `pwd`; してみよう」レベルのことを尋ねてる人が、
「ブラウザから鯖を halt させたい」ってところに引っかかったのかな。
最近、セキュリティがアマアマの自宅鯖を見すぎてるだけかも。
>>324 共有鯖ならばシャットダウンに必要な権限を得られないから問題無い。
シャットダウンに必要な権限が得られる個人鯖ならどうなろうと知ったこっちゃないので、やっぱり問題無い。
326 :
320:04/08/04 00:50 ID:???
>>325 わかりやすい意見をありがとうございます。
2行めを読んで激しくスッキリしました。
コーディングと関係ない話で引っ張って失礼しました。
アパティをオペレータ権限で動かせ!!
328 :
309:04/08/04 17:21 ID:???
>>310 !!
すいません、ありませんでした。
ご返答はりがとうございます
329 :
nobodyさん:04/08/05 06:51 ID:A93W0UIN
Perlのオブジェクト指向の解説サイトを色々読んでるけど、アクセスメソッドを作るか迷ってるんだけど
みんなはちゃんと、アクセスメソッド作ってやってる?
今作ってるやつはオブジェクトのメンバ変数(プロパティ)が結構な数あるからいちいち個々に対するアクセスメソッドを
作るのは冗長な気がするんだよね。中にはハッシュとかもあるし;
シンボリックリファレンスありにすれば1個で済むような気がするけど、知恵を貸してください。
330 :
329:04/08/05 07:03 ID:A93W0UIN
とりあえずコンストラクタの一例
sub new{
my $self = shift;
my %form;
foreach ( split /&/,shift ) {
( my $a , my $b ) = split /=/;
$b =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$form{$a} = $b;
}
bless {
form => %form
},$self;
}
ちょっとプロパティを減らしたけど、とりあえずこんな感じ。
それでmainの方で
my $obj = Testclass->new($ENV{'QUERY_STRING'})
としてから随時HTML出力途中に
$obj->{form}{hoge}
として参照したいけど、これをアクセスメソッドを介してのものに変えたい。
332 :
nobodyさん:04/08/05 08:54 ID:o7gPPImy
>>332 @new{ map lc, keys %old } = values %old;
334 :
329:04/08/05 09:01 ID:A93W0UIN
英語読めねよ
@a=qw/1 2 3 4/;
@_[0]=\@a;
この@_[0]をデリファレンスするにはどうsればいいですか?
@@_[0]
@$_[0]
とかではできませんでした。
それと
@$#_[0]
みたいなことをして、配列の最後の番号を知りたいんですが、どうすればいいですか?
>>335 @_[0]=\@a;は正しくない。正しくは$_[0]=\@a;
デリファする時は@{$_[0]}のように{ }で囲む。
要素見るときは$_[0][N]、最大添字は$#{$_[0]}。
RFCとか、大事なものはほとんど英語だよ。
日本語のマニュアルしか受け付けないって人は止めた方がいいと思うよ
339 :
329:04/08/05 10:54 ID:A93W0UIN
>>337 ありがと。でもアクセスメソッドとのつながりがイマイチわからん。
下のはアクセスメソッドのこと書いてるけど、冗長だよね。
ひとつのアクセスメソッドでどんなコンストラクタにでも使える、どれだけオブジェクトデータが複数でも
使えるやつにしたいんだけど、ゆっくり自分で考えるよ。ありがとう。
>>338 ほんと日本人には不利だよね。というか英語圏の人間はそれだけでずいぶん楽なんだろうな。
340 :
335:04/08/05 11:02 ID:???
>>336
ありがとうございました!できました^^
>>338 >ひとつのアクセスメソッドでどんなコンストラクタにでも使える、どれだけオブジェクトデータが複数でも
>使えるやつにしたい
無理だろ。どんなクラスでもこのアクセスメソッドで完全にokなんてのがあったら、有名になってるって。
できたら金やるよ
342 :
nobodyさん:04/08/05 11:47 ID:IwD+3Zuu
やり方はけっこうですので、質問させて下さい。
jcode.plで受け取ったデータを「EUC」に変換した後、
EUC特有の「全角英数→半角英数」の処理を施し、
その後再び、「SJIS」に変換する、といった処理は可能でしょうか?
>>342 できる。
半角英数を全角SJISにしたい場合は個別に対応して完了。
EUC特有の半角英数って???
やり方はけっこうですので、質問させて下さい。
orz =3
345 :
329:04/08/05 12:41 ID:A93W0UIN
>>341 どんなコンストラクタでも使える、どんなオブジェクトにも使えるアクセスメソッドってのは
さすがにまだだけど、とりあえずできたよ。
呼び出しを
$obj->access([path1,path2,.....],代入したいならここに);
こんな感じにして。第一引数に例えば$obj->{form}{hoge1}の場合は
[form,hoge1]
みたいな無名配列のリファレンス渡しで一応カタグロブ以外は対応できた。
347 :
332:04/08/05 13:38 ID:o7gPPImy
>>333 早!そしてありがとうございます!
こりゃ自分では答えが出ませんでした。
>>346 俺はエロクないから答えるべきでないかもしれんが、
とりあえずそのファイル名をhogeと仮定して。
open ( FH , "hoge.txt" );
$a = join ",",<FH>;
ってのはどうだ。
>>348 改行コードを取り除く必要があるなり
chomp(my @i = <FH>);
$mail = join(',', @i);
$/ = ',';
とかはどうだろう?
353 :
329:04/08/05 15:49 ID:A93W0UIN
アクセスメソッド。呼び出しは
my $value = $obj->access(path1=>hoge,path2=>hogeがハッシュ、配列のリファレンスならその続きをここに,value=>代入したい値);
突っ込んでくれるとどこを改良すればいいかのめぼしがつくからうれしい。
sub access{
my $self = shift;
my %atr = (path1 => undef,path2 => undef,value=>undef,@_);
if ( !($atr{path2}) ) {
if ( ref $self->{$atr{path1}} eq "SCALAR" ){
if ( $atr{value} ){${$self->{$atr{path1}}} = $atr{value};}
return ${$self->{$atr{path1}}};
} elsif ( ref $self->{$atr{path1}} eq "ARRAY" ){
if ( $atr{value} ){@{$self->{$atr{path1}}} = $atr{value};}
return @{$self->{$atr{path1}}};
} elsif ( ref $self->{$atr{path1}} eq "HASH" ){
if ( $atr{value} ){%{$self->{$atr{path1}}} = $atr{value};}
return %{$self->{$atr{path1}}};
} else {
if ( $atr{value} ){$self->{$atr{path1}} = $atr{value};}
return $self->{$atr{path1}};
}
} elsif ( !($atr{path3}) ) {
if ( $atr{value} ){$self->{$atr{path1}}{$atr{path2}} = $atr{value};}
return $self->{total}{prtotal};
}}
サブルーチンの呼び出しについてなんですが、print <<EOF;〜EOFのヒアドキュメントの途中で
サブルーチンを呼び出す時は、一度ヒアドキュメントを終了して、
&subrootin();
等として呼び出すしかないんでしょうか?少し面倒な感じなのでもし、もっといい方法がありましたら教えて下さい。
>>353 AUTOLOAD使ったほうが早くない?
>>354 ヒアドキュメントにサブルーチンが返す文字列を埋め込みたいと
いう話なら
${\(&subrootin();)}
または
@{[&subrootin();]}
printf <<EOF,$value, subroutine($value);
test
%s = subroutine(%s)
EOF
でもいいと思うし。
>>357 > printf <<EOF,$value, subroutine($value);
逆だ鬱。
printf <<EOF, subroutine($value),$value;
>>356-358 早速ありがとうございます!
>>356 ばっちりできました!
>>357-8 printfについて勉強が浅かったので、今解説サイトのprintfとsprintfのページみて少しは
わかってきましたが、
>>357-8さんのコーディングがまだ理解できませんorz
難しいですね
360 :
354:04/08/05 20:06 ID:???
359です。名前入れ忘れてPCフリーズしてました;
>>356さんの教えてくれた方法は、サブルーチンが返す値を出力するときのみなんですよね?
サブルーチンでprintしてる場合は何故か変なところに出力されてしまいました;
printが2重になってしまうのでやっぱり無理ですよね。
>>361 速いじゃなくて、早いで楽って意味だったんだ
駱駝本にも載ってるしね
>>361 たかだがアクセスメソッドのために、モジュールを一個useするのって重くないか?
極力削りつつ、汎用的でいけてるプログラムを目指さなきゃ。
>354
別の方法もあるが、一度ヒアドキュメントを終了して書く方が後々面倒じゃないので、
ヒアドキュメント閉じる方がいい方法だと思う。
365 :
361:04/08/05 22:41 ID:???
>>362 ごめん。実行速度の事だと勘違いしてました。
>>363 でも、頻繁に使われるものだから、何度も書き直すものではないよ。
似たようなコードが複数のファイルに散らばると保守が面倒になるし、
僕ならモジュール使う方を選ぶけど。
主張の違いは置いておいて、AUTOLOAD使うとしたらこんな感じかな。
sub AUTOLOAD {
# getter/setterを呼出時に自動定義
my ($self, $value) = @_;
return if $AUTOLOAD =~ /::DESTROY$/;
if ($AUTOLOAD =~ /::((get|set)_?(\w+))$/) {
if ($2 eq 'get') {
eval "sub $1 { my (\$self) = \@_; return \$self->{lc($3)} }";
return $self->{lc($3)};
}
if ($2 eq 'set' and defined $value) {
eval "sub $1 { my (\$self,\$val) = \@_; \$self->{lc($3)} = \$val }";
$self->{lc($3)} = $value;
}
}
}
書いてて思ったんだけど、
>>353 のコード
配列とかハッシュはリファレンスを返せば充分じゃない?
>>365 キー名に__PACKAGE__を付けて継承されたときとかに安全になるようにしろ、と駱駝本にある
ひあどきゅめんとはすたっくできる。
print <<EOF,&subhoge('hoge'),<<EOF;
hogehoge
EOF
hogehogehoge
EOF
368 :
nobodyさん:04/08/06 01:16 ID:Qwf6u7BB
ちょと質問です。
perldoc -f pack
を読むと template の S, I, L のバイトオーダは機種依存とありますが
N, V の方はどうなんでしょうか?
N は big-endian, V は little-endian と機種に依存しないような体で書かれているんですが。
hogehage.png hagehoge.png honehone.png ...という配列の中身をそのままにして
一つずつの配列を出力する時にhogehage.gif hagehoge.gif honehone.gif...と出力
させたいのですが、楽な方法はありますかね?
bashの
for $i in *.png
do;echo ${i%.png}.gif;done;
と同じように考えていただければ良いのですが…。
371 :
369:04/08/06 01:41 ID:???
splitして.gif付けるだけで良い事が分かりますた。
>>370 ちと違うな…。加工部分がわからなかったんで。
372 :
368:04/08/06 01:58 ID:???
自己解決です。
間抜け晒してお恥ずかしい
373 :
329:04/08/06 05:44 ID:???
>>365 >書いてて思ったんだけど、
>>353 のコード
>配列とかハッシュはリファレンスを返せば充分じゃない?
漏れ的にはオブジェクトをとても親切な人として想定してるので、
リファレンスのまま返すのはちょっと無愛想かなって;
$_ の中に x=数字 という文字列が何度かあって、その数字を全て足し合せたくて、
foreach (/x=(\d+)/g) { $sum = $sum + $_; }
としたのですが、もっと綺麗とか高速とかな書き方はないでしょうか?
変数名やサブルーチン名にはアンダスコア(_)が使える(他も使えるけど)けど、
前にどこかでサブルーチン名にアンダースコアを含ませる時は何かの注意をするように
って書いてるサイトを読んだ。
うろ覚えでどこのサイトかもどんな注意かも忘れちゃってて、今ググテみたけどそんな注意らしきことは
どこにも見当たらない。サブルーチン名にアンダースコアを含んで、含まないときと異なる注意点ってあったっけ?
>>376 <q cite="
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
単語を区切るためにアンダースコア (_)を使いましょう。これは、
一般的に言って $VarNamesLikeThis よりも $var_names_like_this の
ほうが、特に英語のネイティブスピーカーでない人にとっては、読む
のが簡単です。 これは VAR_NAMES_LIKE_THIS のような場合でも
有効である単純な 規則です。
<snip />
名前の先頭にアンダースコアを使うことで、その変数や関数がそれが
定義されているパッケージの外では使うべきでないということを表わす
ために使うことができます。
</q>
__LINE__ や __FILE__ といったリテラルトークンと同名のサブルーチン
は作るのも呼び出すのも難しい。
*__LINE__ = sub { 1 };
print &__LINE__;
>>377 あぁ、作るのは別に普通に作れるな。
呼ぶ時はプレフィクスが必ず要るけど。
379 :
376:04/08/06 09:04 ID:???
>>377 ありがとう!多分先頭がアンダスコアの変数、サブルチンはパッケージ外では使わない
っていうのを中途半端に覚えていたせいで、変に怖かったんだ;
380 :
nobodyさん:04/08/06 10:49 ID:DHgT8QqI
すんません。「/aa」という文字をマッチさせたいんですが、書き方って
文字列 =~ //aa/
でいいの? それとも/の前になんか必要?
$hoge ~= {/aa};
エスケープをエスケープして↑じゃ駄目か?
質問です。
bmpファイルから画像情報を抜き出そうとしています。
$hexdata = unpack("H*",$bindata)として
424d36e80300000000003604000028000000fe0200004c010000 (0x1A以降略
ここまで取得することができました。 ↑
矢印の「fe02」の部分がWidthで「766」に変換したいのですが、
どのように変換するのがスマートでしょうか?
hex(substr($hexdata,36,2))+hex(substr($hexdata,38,2))*256
で一応取得はできるのですが文字列として扱ってる時点から冗長過ぎる気がします。
>>384 unpackでv使え。
% perl -e '$s="\xfe\x02"; ($w)=unpack("v", $s); printf "%d\n", $w;'
766
bmpのファイルフォーマットは知らんので前後をどうべきかは
わからん。
>>384 my @TagsBITMAPFILEHEADER = qw/
bfType
bfSize
bfReserved1
bfReserved2
bfOffBits
/;
my @TagsBITMAPINFOHEADER = qw/
biSize
biWidth
biHeight
biPlanes
biBitCount
biCompression
biSizeImage
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
/;
my $bmp = {};
@{$bmp}{@TagsBITMAPFILEHEADER} = unpack('a2VvvV', substr($bindata, 0, 14));
@{$bmp}{@TagsBITMAPINFOHEADER} = unpack('VVVvvVVVVVV', substr($bindata, 14, 40));
print $bmp->{biWidth};
388 :
384:04/08/06 21:58 ID:???
>>385 >>386 >>387 回答ありがとうございます。
>>386 unpackに配列を返させてまとめてハッシュに格納してるのはなんとなく分かるのですが、
以下の読み取り方法では何も表示されませんでした。
他の方法をとらなければならないのでしょうか?
$file = './tmp.bmp';
open FH, $file;
binmode FH;
read FH, $bindata, -s $file;
close FH;
>>388 ビットマップのパスがあってねーんじゃねーの?
俺はできたぜ?
つーかこの方法便利。サンクス>386
あー、ほんと
>>388は便利だ。
自分で書いた各フォーマット用を全部この方法にしよーっと。
388じゃなく386ね
392 :
384:04/08/07 00:52 ID:???
ああああああ、全角スペース元に戻すの忘れてました
LANケーブルで首吊って死につつ蘇って精進します。
$a1 が $aa に当てはまっていれば、その行の $b を $b1 に代入
$a2 が $aa に当てはまっていれば、その行の $b を $b2 に代入
という風にを、 $a1 〜 $a13 までやって、それに応じて $b1 も $b13 まで用意する、とやるのに、
13個ルーチンを書くのは無駄が多いような気がするんですが、簡素に書く方法ありませんか?
>>393 >>6 の各サイトを読んで配列やハッシュの使い方を覚えれば
簡素に書けるんじゃないかな。
>>394 foreachを使うことにしました。どうもです。
ルーチンとサブルーチンってどう違うのでしょうか。
パッケージ=ルーチン
メソッド=サブルーチン
と言う感じですか..?
メインルーチン=ルーチン?
jcode.plの使い方なんですが、
http://www.mikeneko.ne.jp/~lab/kcode/jcode.html#h2-2 を読みましたが知りたいことが書いてないみたいなので質問させて下さい。
$a = \"あいうえお";
リファレンスを格納している変数の中身を文字コード変換するにはどうすればいいでしょうか?
jcode::convert(\$a,"sjis");
jcode::convert($a,"sjis");
jcode::convert(\($$a),"sjis");
できないのでしょうか?
399 :
nobodyさん:04/08/07 07:42 ID:WwZLffmc
>>398 それは文字列リテラルへのリファレンス代入だから、実体である文字列は
リードオンリーなのらぁ。。。
>>400 それを抜きにしても、型グロブ受け取るサブルーチンに
スカラーのリファレンス渡すのはどうすりゃいいか
わからんな。
やりたいことが文字コード変換ならJcode.pm使え。
402 :
nobodyさん:04/08/07 10:06 ID:M9c7I24I
下のような関数をつかって機種依存文字を判定しようと
してたのですが、鰍ネどは判定してくれるのですが、
のような文字は判定してくれません。
92区(0xEE9F~0xEEFC)にあたるのでこの正規表現に
含まれると思うのですが、どうしてでしょうか。
教えてください。お願いします。
# 機種依存文字の有無確認
# 有→1、無→0 を返す
sub depend_kisyu{
my $name = shift;
if($name){
# 機種依存文字発見のためにsjisに変換
&Jcode::convert(\$name, "sjis","auto");
my $ascii = '[\x00-\x7F]';
my $sjis_twoBytes = '[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]';
my $sjis_pattern='[\x87\xED\xEE\xFA-\xFC][\x40-\x7E\x80-\xFC]';
if($name =~ m/\G(?:$ascii|$sjis_twoBytes)*?((?:$sjis_pattern)+)/og){
return 1;
} else {
return 0;
}
}
}
403 :
398:04/08/07 11:15 ID:???
>>402 なぜ正規表現が正しいかという話なのに、ifだの
Jcode::convertだのがついた関数にして質問するかな?
前後に余計なものがついてると問題がぼやけるので、
$nameにいきなりその""をSJISで入れて、その関数の
正規表現の部分でマッチするかどうか、というところ
を調べてから出直して来い。
405 :
nobodyさん:04/08/07 11:56 ID:20zkJ4Vm
ファイルの中身をテキストエリアに表示したいのですが、
改行の場所にスペースも入ってしまって困っています。
改行などもそのままで表示したいのですが…。お願いします。
(ファイルはアスキーモードで転送しています)
open(PAGE_FILE, "test.txt");
@page = <PAGE_FILE>;
close(PAGE_FILE);
print <<"";
<form action="$program_name" method="GET">
<input type="hidden" name="title" value="$title">
<input type="hidden" name="mode" value="write">
<textarea cols="80" rows="20" wrap="off" name="text">@page</textarea><br>
<input type="submit" value="送信">
</form>
>>405 (解決法1)
ファイルを読むときに配列じゃなくてスカラーに読んで
そっちを使う
{local $/; $page=<PAGE_FILE>;}
(解決法2)
配列を文字列に埋め込んだときに要素間に挟む文字を
空文字列にする。
{ local $" = '';
print ...
}
407 :
405:04/08/07 12:27 ID:???
>>406 1の方法で意図通り表示することが出来ました。
どうもありがとうございました。
sprintf,printfの使い道について質問です。
my( $sec,$min,$hour,$mday,$mon,$year,$wday,$isdat,$yday ) = gmtime (time);
my $a = sprintf "%02d:%02d:%02d GMT",($hour,$min,$sec);
他にどんな使いかたがあるでしょうか?この二つの関数についての理解を深めたいので
いろんな使い方を知りたいです。
どうぞおながいします。
>>408 16進変換に使ってたり。
printf("%x",100);
他は普通の使い方しか知らん。
コマンドラインで使う時に出力文字数そろえたり。
>>408 my( $sec,$min,$hour,$mday,$mon,$year,$wday,$isdat,$yday ) = gmtime (time);
my $a = sprintf "%4d/%02d/%02d GMT",($year,$mon+1,$mday);
>>412 my $a = sprintf "%4d/%02d/%02d GMT",($year+1900,$mon+1,$mday);
>>410 print \x100 || hex 100;
>>409 のサイトの
printf '%2$d %1$d', 12, 34; # prints "34 12"
はどういうことだろう?テストコピペして動作確認したが期待通りにはならなかったぞい。
英語が嫁ねと駄目だなorz
>>418 いやネタじゃなくて5.8から入った新機能だよ。
@a = qw/yd83x iei5498x 0498fu 9589 00 utifdo 83udtyx/;
最後の文字がxなら @xに
最後の文字がx以外なら @yに
こういう正規表現を絡めたコーディングがしたいです。
@x = grep { /x\z/ } @a;
@y = grep { /[^x]\z/ } @a;
で一応できるんですが、一度目でfalseだったものはそのまま@yにいれていくような感じにしたいんですが
どうすればいいでしょう?
foreach ( @a ) {
if (/x\z/) {push @x,$_}else{push @y,$_};
}
できました^^ところで{push @x,$_}の部分、{push @x}では$_の値を自動で追加してくれないんですが
ifの実行文内では、デフォルトで$_に作用する法則?が崩れるんですか?
>>421 そんな法則は存在しない。
foreach ループの変数名を省略した場合は $_ に代入され、
マッチ演算子に対してマッチ結合演算子で文字列が指定
されていない場合は $_ が対象となるだけ。
for等の制御構文の途中で、ifをやって真ならばその回の残りの処理をせずに次回に移行させるようなことはできますか?
for($i=0 ; $i<6 ; $i++ ){
print "$i回目開始<br>";
if ( $i == 3 ){
print "$i回目終了できず<br>";
真であればこの後の処理をループして4回目に移行
}
print "$i回目終了<br>";
}
って残りの処理をelseに書けばいいんですよね;
でももっとなんか強制的に次回に移行するようなのってないですかね?
>>422 push関数も、第2引数を省略すると$_の値が使われると思ってましたが勘違いでしたowz
どこでやっても無理でした
/x$/ ? push(@x, $_) : push(@y, $_) for @a;
>>424 splitと勘違いしたんじゃない?漏れも昔にやっちった
>>425 for @a;
そんなのあるんだ。どこのサイトで勉強したの?日本語サイトなら紹介おながいします。
428 :
425:04/08/07 18:32 ID:???
>>427 わたしはPerl4時代のふるーいラクダ本で
もしかしてperlってinとかも使えるの?
jsの
for( i in obj.array ) 〜
みたいな
432 :
423:04/08/07 19:19 ID:???
>>430 for($i=0 ; $i<6 ; $i++ ){
print "$i回目開始<br>";
/3/ && print "$i回目終了できず<br>" && next;
print "$i回目終了<br>";
}
できました!ありがとうございました。
433 :
nobodyさん:04/08/07 20:37 ID:pd//1imi
tu-ka付属ドキュメント嫁よおまいら。おおかたの答えはそこに出ている。
tu-ka付属ドキュメント英語だよ。英語勉強したり和訳探したり本買ったりするよりここで聞いたほうが早いよ。
っていうか付属ドキュメント読めたらCGIレベルでのコーディングスレなんかいらねよ。
Linuxのコマンドでコマンドラインから入力した場合、Ctrl_cやqを
入力しないと終わらないもの(例えば"tail -f")をPerlで取り込んで
webで表示したいのですが、方法はありませんか?
open(AA,"コマンド|")で取り込んだ場合、コマンドが終了しないために
うまく取り込めないようで困っております。
>>438 終了させる条件を明確にしやがれ。
それが曖昧じゃ答えられるわけ無いだろ。このバカチン。
>>438 なんで tail -f にする必要があるの?
tail 結果を取り込むのがだめな理由は?
アクセスした瞬間の最終ログさえ表示できりゃいい -> tail
ログが増える度に画面更新して欲しい
・定期的にクライアント側で更新 -> javascript + tail
・サーバから垂れ流したい
-> ログチェック用のデーモン作成。Java Flash等コネクションを貼れるものを使う。
>>438はtail -fは例えで言ってるだけでホントは違うコマンドとかスクリプトなんじゃないかな。
コマンドはなんでもいいとして、キーボードからの入力で終わるコマンドを取り込む場合はどうすりゃいいんだろね。
open(AA,"|コマンド|")
>>444 ここは日本人が見るスレなんだから他国語じゃ通じないよ。
正直おまいみたいに頭のいいやつはこのスレで質問しない。でもおまいみたいに頭のいいやつがいないと
このスレは成立しない。だからやさしくしてね^^
>>445 444じゃないけど、検索エンジンって知ってる?自分の好きな言語の解説読めばいいじゃん。あほ?
コピペしかできない奴の方がアホだと思う。
>>435 だよなぁ。。。
英語が読めないとほざくバカチョン様へ
まずは、コード例をみてみましょう。
そして気になるところがあったら、その部分の解説英文をコピーして、
http://www.excite.co.jp/world/english/ に貼り付けてみましょう。
バカチョンな訳しかできないけれども、それなりに真意は読めてきます。
気をつけるところは大文字の MUST や MAY などの大文字を小文字に変換してみましょう。
あとは脳内で「日本語置換」するのではなく、「英文を感じ取る」のです。
と、ここまで書いてみたところで、バカチョン様には無理でしょうねぇ。
$a = 1 unless $a;
$aが未定義であれば代入するっていうunlessを使った処理だけど、
たいていのリファレンスサイトではこの処理を↓で説明してるよね。
unless ( $a ){ $a = 1 }
簡単な処理の場合は一行目の書き方のほうがいいと思うんだけど、何故か一行目の書き方も
できると説明してるサイトは見たことない(perl.doc等ならあるだろうけど日本人の作ったサイトでは見てない)。
perlのバージョンによって通用するか異なる書き方だからかな?それともなんかやめておいたほうがいい理由があるのかな?
$a ||= 1;
未定義と0って見分ける方法ある?
453 :
445:04/08/08 18:57 ID:???
>>all
俺は何も質問してないよ;
>>446 で、試しに
>>444と同じ事を日本語で説明してるサイト探してみなよ。
面倒くさくないか?
>>447 せっかくの回答者に暴言吐くな
>>448 今度疑問があったときにやってみるね。
defined
>454
thx
456 :
450:04/08/08 19:00 ID:???
>>452 ごめん
$a = 1 unless defined $a;
回答者にわざわざ日本語ページを探させるのが当たり前だと思ってんのか?何様だてめえら?
甘ったれ過ぎだろ。赤ん坊か?カスどもめ。
禿同
459 :
nobodyさん:04/08/08 20:00 ID:alTDDsx/
スレ違いかもしれませんが,Perlやphpのコードの位置をinetdなどで指定しておいて,
特定のポートに接続があったら,スクリプトを起動すると言うことは可能でしょうか?
461 :
459:04/08/08 20:08 ID:alTDDsx/
>>460 ということは,例えば,メールを受信したらスクリプトが起動するという処理も
可能と言うことですよね?
463 :
462:04/08/08 20:13 ID:???
>>461の発言からinetdの役割を理解していないようなので、
>>462は無かったことにしてくれ。
そんなやつには無理。
調子に乗るな
>>461 inetd でどうやって「メールを受信した」が判別出来るのかを考えてみましょう。
smtp は、あくまでも「中継」だからねぇ。
個人的には .qmail に | を入れているけれども。
♪ウイルスチェックと、新着ウイルス DAT 情報から dat ファイルを取りに行くスクリプトなどなど。
最近は回答者側が暴れるのが流行ってるのか?
>>467 答えてやった上に罵倒されて平気なのか?
奴隷扱いされることに慣れてるとそう思うのかもしれないな。
適当に無視するか、うざかったら今後回答しないとかね。
真面目に相手をしてあげすぎなんじゃない?
いいやつなゆえだろうけど、気楽にいこうよ。
Perlで常駐ソフトを作るのは危険?
それとも、ちゃんと作れば大丈夫?
>>470 バッファあふれが起こらないだけでもCに比べてだいぶ安全だと思うけど。
>>471 バッファあふれはともかくとして、心配してるのは
メモリをちょっとづつでも使い込んでいくことです
ただメモリ消費量はCとは比較にならないくらい大きいからねぇ。
>>472 それはPerl云々よりもOSの問題もあると思うが。
Perl自体は妙な使い方をしないかぎり平気。メモリはちゃんと管理してくれる。
@a = \@b;
>>474 内部構造は良く知らないんだけどperlのGCってメモリが
断片化したときにコンパクティングとかしてくれるんだろうか?
いちいちしてたら重くなるからしないんじゃない?
>>470-
Perlはメモリの管理はしっかりしてるが、一度確保したメモリは終了まで保持される模様。
巨大なメモリが必要なところは、forkして子プロでやるのが吉。
>>478 つまり、変数をポッポコ作るとよくないというわけですな
480 :
sage:04/08/09 17:15 ID:17VOmc59
あるアクセスログファイルがあります。
======
/folder1/
/folder2/
/folder3/
/file1/test.txt
/file1/test00.txt
/folder2/aa.txt
/folder2/
======
と、フォルダ名、ファイル名がガガっと書いてあります。
カウントしたいものは、
/folder1/
/folder2/
/file1/test.txt
へのアクセス回数です。ということで、
%count =("/folder1/"=>0,"/folder2/"=>0,"/file1/test.txt"=>0);という連想配列を作成しました。
ファイルオープン→それぞれの行を@log_gyouに入れて
while (($key,$value) = each %count){
if ($log_gyou[$cc] =~ /^$key/){
$count{$key}=$value+1;
last;
}
}
$ccを行数分繰り返してます。
結果は、カウント数がおかしいです。自分で目でカウントしたものより、少なく出ています。
連想配列のキーに、「/」とか「.」は使えない??と思いましたが、それならエラーになりますよね??
でも、やっぱ使わない方が良いんですか?
どこか、おかしなところがあったら、教えてください。
なるほどねぇ。
>>479 変数の数は関係ない。
百M超級のファイルをいくつか丸呑みして処理してたら、
どえらい使用量のまま動いててかなり焦った。
それはディスクキャッ(ry
>>480 eachを使ったループを途中でlastで抜けて最後まで
使ってないので、次の回でeachがリセットされてない
ためと思われる。
この構造でいきたいなら、keysかvaluesでリセットすれ。
>>480です。
>>484さん。解決できました!!
すううげええぇえええぇえ!!
一瞬でわかっちゃう人が居るんですね!
ありがとうございました!ぺこり。
>>485 そこまで言われるとちょっと気分がいいな
これからもなんかあったら来いよ
487 :
480:04/08/09 18:41 ID:???
488 :
486:04/08/09 19:33 ID:???
まあ俺はなんも答えてねけどなw
Perlのレキシカル変数はかってにメモリが開放されないの? undefしたら開放される?
勝手に開放されたら困るじゃねーか
>>490 必要なくなったらってことだよ
{ my $var = 1111111; }
$varはブロックを出るときに、開放されるのかってことが聞きたい
Perlが一度確保した物理的なメモリ自体はPerlが終了するまで何やっても全く開放されない。
undefしたりスコープから抜けるとPerlが空きブロックだと認識して、別の変数でそこのメモリ空間を再利用するだけ。
茶々入れたいのだろうよ
perlの中で見れば再利用されるから解放されたともいえるが
外から見れば取りっぱなしなので解放されないともいえるという
玉虫色の解釈でいいと思われ。
497 :
nobodyさん:04/08/10 16:56 ID:Rp3Iu5NL
>#!/usr/bin/perl
print<<HTML_DOCUMENT;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_COCUMENT
をコンパイルすると必ず
>C:\httpd\cgi-bin>perl 52.pl
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3.
というエラーが出てきます。解決方法知っている方教えてください。
>>497 メッセージの意味は
「ターミネータの "HTML_DOCUMENT" が EOF まで行っても
見つからないよ、うわーん」なので、
最後の
> HTML_COCUMENT
こきゅめんと を どきゅめんと に変える、とか。
あと、
> content-type: text/html
この辺、調べなおしたほうがよいです。
500 :
nobodyさん:04/08/10 17:13 ID:Rp3Iu5NL
nobodyさん。
レス有難うございます。
こきゅめんとをどきゅめんとにしましたが
それでも上手くいきません・・・。
#!/usr/bin/perl
print<<HTML_DOCUMENT;
content-type: text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_DOCUMENT
> content-type: text/html
をどうしたらよいのでしょうか?
501 :
498:04/08/10 17:24 ID:???
>>499 どことかぶってるの?(丸投げスレでヘンなことになったしさ)
>>500 > 上手くいきません
の内容を書かないと伝わらないですよ。
手元の環境では、 perl -wc test.pl しても OK 出るし、
perl test.pl で標準出力に表示してくれます。
>>497のエラーは出なくなってると思うんですけど…。
502 :
498:04/08/10 17:33 ID:???
訂正。寝ぼけすぎ。
> content-type: text/html
\n\nがついてるのを見慣れすぎてただけです。すいません_| ̄|○
504 :
nobodyさん:04/08/10 17:57 ID:Rp3Iu5NL
#!/usr/bin/perl
print <<HTML_DOCUMENT;
content-type:text/html
<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_DOCUMENT
をC:\httpd\cgi-bin>perl 52.pl でコンパイルしていますが
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3
. となり上手く行きませんほかにコンパイル方法あるのでしょうか?
>>503 ヒアドキュメントの終端識別子の後には空白行が必要。正確には空白でなくてもいいが、
ファイルの最後の行数=終端識別子のある行数ではエラーになる。
で、コピーして動作確認したが何のエラーもなく表示されたぞ?おまいは何だ?
readdirの戻り値?に「.」と「..」が含まれますが
これを含まないで一発で取得する方法ってありますか?
あとで拡張子等を評価するってのは思い付くのですが
何か無駄なような気がするので質問させてもらいました。
>>508 ちゃんと最後まで読んでよ。
>ファイルの最後の行数=終端識別子のある行数ではエラーになる
って言ってるじゃないのよ。まあ初めが語弊のある言い方だったけどさ。
>>504 終端識別子の「HTML_DOCUMENT」のケツに、改行が入ってねぇんじゃねぇの?
>509はそういうことが言いたいのか?俺にも今ひとつ分からんかったのだが・・・
>>508 「.」と「..」を含まないでって言ってんのに、それじゃあ「.」と「..」しか得られん。
my @file = grep !/^\.\.?$/, readdir DIR;
では?
>>509 print <<EOF;
here-document.
EOF
この三行で普通に動くが?
ヒアドキュメントの終端は「終端文字列だけから成る*行*」でなければ
ならないので、終端文字列の後ろに改行は必要だが、それ以下には
何ら必要でない。
>>510 訂正ありがとう。
>>509 人にちゃんと読めとかいう前に日本語勉強してこい。
何言ってんのかさっぱり分からん。
>>509 行数 ( ´,_ゝ`)プッ
何言ってんのかさっぱり分からん。
my %a;
$a{aa} = 1;
------------------
my $a;
$a{aa} = 1;
------------------
my $a;
$a->{aa} = 1;
の違いがイマイチ分かりません。
解説してる所とか無いですか?
>>514 1番上はハッシュ
1番下はリファレンス
まん中はハッシュがmyにならないので文法ミスかも
リファレンスとか参照でぐぐって
二番目はありえない気ガス
上は普通の書き方なんで問題ないだろ。
真ん中はスカラー変数$aをmyにしてるが、2行めは%aへの操作で
別にエラーになるような間違いじゃないがその2行はなんの関連
もない。
下はスカラー変数$aがmyになっていて、最初はundefが入っているが、
$a->{aa}=1;したときに自動的に無名ハッシュが生成されてその
リファレンスが$aに入る。で、その無名ハッシュのキーaaに対応
する値が1になる。
519 :
509:04/08/11 09:33 ID:???
なんか叩かれてるが、実際にエラーになるんだから仕方ないだろ。
>>510-511 >終端識別子の「HTML_DOCUMENT」のケツに、改行が入ってねぇんじゃねぇの?
だから
>ファイルの最後の行数=終端識別子のある行数ではエラーになる
と同じ意味だろ。改行いれずにどうやって
ファイルの最後の行数!=終端識別子のある行数
にするの?
>>513 行数がわからないと、文法チェックもできないからちゃんと勉強しれ。
>>519 >>506 での "空白行" が
>>508 では "空白文字" と捉えられてる。
空行とか改行文字って表現にしたほうが良かったんじゃない? > 語弊の原因
# 空白行ってあまり聴かないし
>>520 確かにふつーは空行だな。
でも空行ってのは行頭に\nがあるわけで、この場合必要ない。
必要なのは終端識別子の末尾の改行。
そこでファイルエンドなら問題ない。
>>519 >>ファイルの最後の行数=終端識別子のある行数ではエラーになる
>と同じ意味だろ。
とか言われても、お前にしか通じん言葉では同意は得られんと思うが?
行数じゃなくて行番号ならまだしも。
ただ、
HTML_DOCUMENT[\n]
[EOF]
となっている場合、終端識別子の行がファイルの最終行なわけだが、
これなら改行が入っているから問題ない。
一部のエディタじゃ[EOF]にも行番号が表示されるから、そこが最終行だと
勘違いしてんじゃねえのか?
523 :
509:04/08/11 12:32 ID:???
>>520 改行入れなくちゃいけないって言うのが一番良かったよね。ごめんね。
>>521 ありがとう。
フォームに入力された全角数字を半角数字に置換したいんですが、
$value =~ s/1/1/g;
みたいなのを1〜9まで繰り返すしか思いつかないのですが、一発でやるようなコーディングはありませんか?
一体、何コードの全角さんなのか。。。
527 :
524:04/08/11 14:42 ID:???
$value = '0123487740562392210';
$ref_exchange = ['0','1','2','3','4','5','6','7','8','9'];
$value =~ s/$ref_exchange->[$_]/$_/g for 0..9;
printf "%s\n", $value;
かなりお間抜けかも、、、
packの型のc(符号付き)とC(符号なし)の符号って何のことですか?
プラス、マイナスとかのこと?
print pack "c*" 0xa4,0xa2;
print pack "C*" 0xa4,0xa2;
EUCだと両方「あ」って表示されて差がわかりません。おながいします。
>>524 use Jcode;
$value = '1234567890';
$value = Jcode->new($value)->tr('0-9', '0-9')->euc;
print $value, "\n";
または
use utf8;
use encoding 'euc-jp', Filter=>1;
$value = '1234567890';
$value =~ tr/0-9/0-9/;
print $value, "\n";
>>529 packするときは違いがでない。unpackすると違いが出る。
print unpack "c*", "\xff";
print unpack "C*", "\xff";
>>529 use warningsすればわかるよ。
533 :
529:04/08/11 16:09 ID:???
>>531 print unpack "c*", "\xaf";
print unpack "C*", "\xaf";
だと
-81
175
で
print unpack "c*", "\x7f";
print unpack "C*", "\x7f";
だと
127
127
で同じ。一体どういう仕組みですか?
534 :
529:04/08/11 16:13 ID:???
それと
print unpack "C*", "0xff";
print qq\<br>\;
print unpack "C*", 0xff;
print qq\<br>\;
print unpack "C*", "\xff";
print qq\<br>\;
print unpack "C*", \xff;
は
48120102102
505353
255
83676576658240481204957555350489941
になるんですが、どうしてクォートありなし、\xと0xで違うものになるんでしょうか?
\xは0xと同じ意味だと思ってたのですが。
536 :
524:04/08/11 16:16 ID:???
>>530 Jcodeは使ったことないので多分自宅のテスト環境用のactiveperl5.6.613には入ってないと思いますが
ppmを使ってインストールができるモジュールなのでしょうか?鯖(joe's)でも使えるか確認してみます。
538 :
529:04/08/11 16:58 ID:???
>>535 符号あり-128〜127
符号なしは0〜255
16進数二桁だとこんなかんじなんですね^^mysqlのtinyintと同じ感じ。
わかりやすいサイトでした。534については載ってませんでした。
>>534 perlのリテラルについてよく勉強しろ。
"0xff"
'0', 'x', 'f', 'f'の4文字からなる文字列
48120102102
'0'の文字コード48, 'x'の文字コード120,
'f'の文字コード102, 'f'の文字コード102
がくっついて出力された
0xff
16進数のff=10進数の255
505353
255がまず文字列に変換され、各桁の文字コード
'2'が50と'5'が53がくっついて出力された
"\xff"はいいだろう。
\xff
裸の文字列リテラルxffの前に\演算子がついて
それのリファレンスをとったことになる。
83676576658240481204957555350489941
スカラーのリファレンスは文字列に変換すると
SCALAR(0xほげほげ)と変換される。(0xほげほげ
はポインタかなんかを16進表示したもの)
'S'は83,'C'は67,...(以下略)
一つの変数にバイナリとして丸ごと格納されているImageMagickでいう
RGBフォーマット(ベタイメージ)の画像があるのですが、
(サイズや色数情報などば別の変数に持っています)
これをPNGとして書き出すのにいい方法はありませんか。
テンポラリファイル等はできるだけ作りたくないのですが。
とりあえず新しくImage::Magickオブジェクトを作ったあと、
SizeとDepthをセットしunpackでforで1ピクセルずつ16進表記に直してSetした後、
Writeする方法でやってみたのですが、
1ピクセルずつSetを行うととんでもなく遅いので…
×unpackでforで1ピクセルずつ16進表記に直して
○forで1ピクセルずつunpackで16進表記に直してから
>>540 それだけではいまいちわからんが、blobToImageあたり使えない?
543 :
529:04/08/11 18:31 ID:???
>>539 非常にわかりやすい説明ありがとうございます。
ところで"\xff"はどういう感じなのでしょうか?
print "\xff"とするとEUCでは「・」だけ表示されます。
0xff → 先に255に変換されてから関数に渡される。
"\xff" → 255に変換せずに16進数のffという値を関数に渡している。
であってますよね?
>>543 "\xff"は16進数のff(=10進の255)1バイトからなる
文字列。
これはEUCとしては使ってない部分なので、なにか
表示されるとしても苦し紛れになんか出してるだけ
だと思うよ。
@arrayに格納されている全部の要素の文字列を置換したい時はどうやればいいんですか?
foreach my $foo (@array){
$foo=~s/aaa/bbb/;
}
とすると@arrayに書き戻せないですよね?
for (my $i=0; $i >= @#array; ++$i){
$array[i]=~s/aaa/bbb/
}
これでいけると思うんですけど、ほかにシンプルな方法はありますか?
>>545 いや、最初のでOKだと思うが。試してみたか?
近頃はmap使えないバカが多いのか
>>545 思い込みで試してなかったんですが
やってみたらうまくいきました
ポケットリファレンスを見て書き戻せないのかなぁと勘違いしてて
今オライリーで見直したらこの書き方でいけるってのがわかりました
549 :
529:04/08/11 19:48 ID:???
>>544 ありがとうございます。いろんなサイトのpack,unpackの解説をみてますがやっと少しだけ理解できました。
print unpack"C*","\x41";
これは10進の65に当てられている文字列Aを10進の65に変換して返してるんですね。なので
print unpack"C*","A";
と同じ。でその逆がprint pack "C*",65;ってわけですね。
でもchar値int値long値short値というのは具体的にどういうものかがわかりません。
char値とは16進2桁、2進で言うと8桁=8ビット???自分で言っててよくわかりませんorz
pack TEMPLATE,LIST;
LISTをTEMPLATEのフォーマットでパックするみたいに解説されてますが、例えばH型(16進文字列)なら
"\x41" eq pack "H",41 で、内部的な流れも理解できる気がします。
C型はLISTを10進数での文字列で捉える?それを16進文字列に変換して返すみたいな・・・
なんか違いますよね。char値があってそれを利用してpackで10進数から16進数文字列に変換できるだけで
元々char値をそんなためにあるわけでもないですよね?
ぐぐてもchar値とはみたいなサイトが見つからないんですよねorz
map {s/aaa/bbb/} @foo;
おおこれは便利
551 :
529:04/08/11 19:57 ID:???
mysqlのデータ型読んでたら・・・
char値 符号付
10進で言えば -128〜127
int値 符号付
10進で言えば -2147483648〜2147483647
short値 符号付
10進で言えば 不明
long値 符号付
10進で言えば 不明
結局扱える大きさが違うだけですか?でもそうなるとpackの型のC等の意味と内部的な処理内容がよくわかんないんですよね。
だんだんスレ違いになってきたので、後は自分で色々なサイトを読んでみます。
親切に対応してくださってありがとうございました。失礼します。
>>542 blobToimageでやってみました。
なぜかRGBでblobToimageやるとうまくいかないので、
PPMでやってヘッダだけ付け足したらできました。
まともな速さになりました。ありがとうございました。
>>545-548 これって漏れも初めて知ったんだけど怖くない?
map s/kuroguro/hage/,@family;
妄想の中で家族が全員はげたところを創造してみたら、現実にみんなはげちゃったーーーーー
って冗談じゃなく怖いな。
フォームから送られてくるデータって
%83%7E%83P%83l%83R
みたいになってますが、これは何エンコードなのでしょうか?
同じ形式でエンコードしたいのですが
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;
では同じ形式にはならないです。(URIエンコードで調べて見つけたサイトに乗ってたコードです)
ちなみに
$value = '%83%7E%83P%83l%83R';
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
print $value;
>ミケネコ
です。
map {s/aaa/bbb/} @foo;
は戻値のためにバッファ用意されんのが無駄。
戻値いらんのなら、
s/aaa/bbb/ for @foo;
でええやろ。
557 :
556:04/08/11 21:17 ID:???
かぶったorz
559 :
554:04/08/12 00:07 ID:???
>>555 そのサイトを見て自分でやってみましたが、
$str = "ミケネコ";
$str =~ s/(\W)/'%' . unpack('H2', $1)/eg;
$str =~ tr/ /+/;
では
%83%7E%83P%83l%83R
になりませんがどうすればよいですか?
つーか、なりませんって言うならどうなったかぐらい書けよな
%83%7e%83%50%83%6c%83%52
ではヤダ、って話じゃないのかしら?
>>558 ベンチマークってメモリ消費量も分かるの?
>>556 map使っても無効コンテキストなら戻り値作らないはず。
%a5%df%a5%b1%a5%cd%a5%b3
になってしまう。という話かもしれん。
ソースの可読性まで考えてコーディングする人間には
map s/aaa/bbb/, @foo;
は生理的に気持ち悪いんだよ。
そんなこと気にも止めんorそこまで手の回らん奴には
分からん感覚さね。
速度が欲しけりゃCで書け。
>>566 お前が生理的に気持ち悪いだけだろ?
オレはそれは一種のイディオムだと思ってるので
別に読みにくいとは思わんし気持ち悪くもないよ。
>>566 可読性まで考えてっておかしくないか?
map { ブロック } リスト は普通の書き方だろ。
単にmapを使い慣れていないから見慣れないものを
気持ち悪いことにしてるとしか思えない。
{} ブロックをなるべく使わないようにする。
つーのもあるわな。(非効率)
可読性というより読解力が足りねーだけじゃんw
map って基本的に使う必要のない関数だったから今調べて見たんだけど、リストを返せる?
今回の問題でmapを使うのは変わった書き方と言われてるぞ(ゲラ
>>572 ふーん、普段もmap使わないの?
grepは?
まあどっちもリストを返せないわけがないけど。
>>572 変わった書き方というより使い方を知らないから使ってなかっただけでは?
575 :
566:04/08/12 04:08 ID:???
>>568 書き方の問題じゃねえっての。理由は555に書いてあんだろ。
mapにはmapの使いどころってもんがあんの。
何でもmap使えばいいってもんじゃねえのよ。
仕事で人のコード読んだりコードレビューだのが増えてくると
自然と身につくんだよ。そういう感覚が。
Perlで仕事だって(プゲラ
577 :
554:04/08/12 10:02 ID:???
%83%7E%83P%83l%83R
これはshift_jisだったんですね;すみませんでした。
ところでShift_JISの「ケ」は83Pになるみたいですが、これはどういうことでしょうか?
文字コード表を見てみたら、0x83,0x4Fの「グ」の一つ右側にあるので
0x83,0x4F+1で0x50?になるのかと思ってたんですが、0x83Pなんですね。
$str =~ s/([0-9a-fA-F][0-9a-fA-F])/pack("C",hex $1)/eg;
これでデコードするときにPは置換されませんよね?0x83で返してくる値にPを付けると
shift_jisではケになるんですか?ケの2バイト目は他とは違う扱い方がされてるんでしょうか?
578 :
554:04/08/12 10:04 ID:???
$str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex $1)/eg;
パーセントが抜けててごめんなさい。
P==0x50です。
つーかアスキーコード表読めよ
>>576 通説しか知らん素人の藻前には分からんだろうが、mod_perlを含め
Perl使ってるとこはまだまだ多い。
よっぽど小規模な仕事してんだろうね(プゲラ
別に100%PurePerlなわけじゃないだろうに・・・
Perlは大規模開発に向かないって誰が言ったんだろうね?
Perlの言語仕様なら何の問題も無いと思うんだけど。
Perlのまともにカプセル化もできないウンコOOで大規模開発ですか(プゲラ
変数の自動生成を抑制できないPHPより100倍マシな言語、それがPerl
mapとmoduloの2つの演算子から同じ匂いがする
>>584 えっと中規模以上の開発はPHPとかPerlじゃなくてJ2EEでやるんですよ(ワラ
>>583 カプセル化という名の強制隠蔽は、技術者のレベルと意識の低さを
言語仕様で補おうというもの。
決められたルールに厳重に従ってコーディングされるならば、
カプセル化は必要ない。
俺はPerlより開発効率のよい言語を知らない。
だから仕事でもPerlを使ってる。
さっさと作って儲けるのが第一なんで。
そりゃ一人開発ならPerlで十分だろ(プ
576=581=583=586=589
必死だなw
藻前らもうPerlのスレには来んでええぞ
>>587 それはさすがにいいすぎ。
効率よく手を抜く手段、くらいにしとこうよ。
592 :
554:04/08/12 11:38 ID:???
>>579 ありがとうございます。しかしそれだと何故に
%83%7E%83P%83l%83R
が
%83%7E%83%P%83%l%83%R
にならないんでしょうか?「ミ」の文字はちゃんとバイトの前に%が付いているのに。
594 :
554:04/08/12 13:43 ID:???
>>593 ありがとうございます。読んでみましたが、
>付加的に、8ビット文字は文字 "%" に続く 8ビット文字の 16進数値となる 2
>つの 16進数 ("0123456789ABCDEF") の 3文字により符号化される。(文字
>"abcdef" も 16進数符号化で使われるだろう。)
やはり%が付くと思うんですが、どうして%83%Pにでなく%83Pなのか理解できません
もしかして、元々shift_jisの「ケ」は"\x83","\x50"ですが、エンコード処理中に
先に"\x83"だけ置換されて、次は"\x50"になる。そしてその時に"\x50"=Pなので
/(\W)/単語構成文字以外に一致
Pは単語構成文字なので一致せずに処理が行われない。だから%もつかない。
そしてデコードでも処理はされないけど
"\x80","\x50"をshift_jisで読むと「ケ」と解釈する。
!?これで正解ですよね?
>>594 8ビット文字は、もしそれらが US-ASCII コード文字セット内の印字可能な文
字でない場合、その文字の使用が安全でない場合、もしくはそれが特殊な URL
スキーム内で何か別の処理のために予約されている場合に符号化されなければ
ならない。
印字可能な文字でないとは:
URL は US-ASCII コード文字セットの印字可能な文字でのみ記述される。8
ビット文字の 80-FF は US-ASCII で使われていない。そして 8ビット文字
00-1F と 7F は制御文字に相当する。これらは符号化されなければならない。
さっきの所のコピペ
596 :
554:04/08/12 15:01 ID:???
>>595 要はPは印字可能な文字なので符号化する必要がないってことですね。
DBIなんだけど
$dbh = DBI->connect ($dsn,$user,$password,{ AutoCommit => 0 , RaiseError => 1 });
$sth = $dbh->prepare(
qq|select * from test|
);
$sth->execute;
@a = $sth->fetchrow_array;
jcode::convert(\$_ , "euc" ) foreach @a;
print $_,"<br>" foreach @a;
$dbh->disconnect;
みたいにしてtestテーブルから全レコードを引き出そうと思ったんだけど、何故か1行しか取り出せない。
一気に全レコード取り出すにはどうやればいいの?
$all= $dbh->selectall_arrayref(qq|select * from test|);
>>597 fetchrow_array は、
DBの1レコードを1つの array にして取り出すメソッドで、
array の各要素には1レコード中の各フィールドが入る
全レコードを取り出すときには
>>598 のようにやるか
あるいは while で回すか
600 :
597:04/08/12 17:02 ID:???
>>598 selectall_arrayrefがレコード全部をスカラで返してくるのかな?
でもこれSQL文を引数にしるんだな。なんかprepareしたいけど。
>>599 そういうことね。わかりやすい説明thx
ところでprepareって元々何のためあるの?XSS対策にサニタイジングしてくれるわけではないでしょ?
なんかprepareしておいたほうが安全だよって話をよく聞くんだけど。
>>600 prepareしたければfetchall_arrayrefってのもあるよ。
602 :
597:04/08/12 17:29 ID:???
>>601 ありがととりあえず
$a = $sth->fetchall_arrayref;
から試したけど、この子はリファレンスの中にリファレンスでさらにリファレンス(これがfeachrow_arrayかな)が入ってるのね。
MySQLの中身がShift_JISで、perlはeucで出力はShift_JISだからちょっと面倒;
とにかくthx!
>>602 暇だからコーディングしちゃった^^
for ( $i=0 ; $i<$#{$a} ; $i++ ){
jcode::convert( \$_ , "euc" ) foreach @{$a->[$i]};
}
$i<=$#{$a}
か
$i<@$a
じゃない?
おまいらレン鯖にシェルでつないで
shell>perl -e "@array=qw/1 2 3 4 5/;
while(@array){print}"
とかしたことある?
606 :
603:04/08/12 17:42 ID:???
>>603 この場合インデックスはいらないと思うので、
foreach (@$a) {
foreach (@$_) {
Jcode::convert(\$_, 'euc');
}
}
でいいんでねーの?
608 :
597:04/08/12 17:56 ID:???
ものすごいことが起きたよ・・・・
せっかくだから遣わしてもらおうと思ったら
for ( $i=0 ; $i<=@{$a} ; $i++ ){
jcode::convert( \$_ , "euc" ) foreach @{$a->[$i]};
}
多分こう書いた。
ループから抜けられず延々HDDがガリガリ(表現悪いけど、処理してる音);
なんとか再起動できたけど、よくエラーにならなかったなとceleron2.7GHz/xp
のすごさを確認したよw
ていうかなんでループから抜けられなかったんだ?もしかしたら
$i=@{$a}
って書いちゃったのかも;
>>608 もし本当にそう書いたのなら$iは常に最後の要素の次の添字に
なるから、無限に配列が拡張されていきそうだな....
610 :
597:04/08/12 18:04 ID:???
>>607 それの方が安全そうwと思って試したけどできんかったよ?
それの後に
print $a;
で何も表示されず(リファレンスが表示されると思ったけど)
print @{$a};
でも何も表示なし・・・(リファレンスの配列が・・・)
print @[$a->[0]};
やっぱりだめで何も表示されず・・・・(実際のレコードの中身が・・・・)
603のやつではちゃんと表示されるけど、デリファレンスの方法が違うん?
611 :
597:04/08/12 18:07 ID:???
>>609 というか$iの中に要素数が代入され、代入成功時の真を返し続ける・・・・・・・
>>609 その配列無限拡張って何かに使えないかな。
もちろんブロックの中に
last if @$a == 20;
みたいな制限をつけて。
そんなもんいっぺんに拡張した方が速いから使えない
>>613 いくつ拡張するかが未定な時には?
一応最大長は決めるが最小長は決めないみたいな場合なんかにつかえるかなと・・・;
駄目か。ごめんよ。
>>600-601 確か
selectall_arrayref()
ってちゃんとprepareされてるよ。自分でやるか自動でやるかの違い。
http://ash.jp/db/dbi_dbd.htm でも配列よりハッシュで取り出したいよね。columns_nameをハッシュのキーにして。
$sth->fetchrow_hashref()
みたいなのがあると便利なんだけどしゃ。
mapを知らなくてキレ、カプセル化が出来ないアフォな香具師が居るスレはここですか?
>>617 しつこいよ君。ここはそうやって他人を罵倒するスレじゃないんだよ。
今までずっと気になってたけど、fetchってなんて発音すればいいの?
フェッチ?フィーチ?なんかの略だよね?
>>619 fetch で辞書に載ってますよ。略語でなく。
たぶんフェッチが一般的だけど、読み方は好みで可。
スレ違っててごめんなさい...orz
map 知らないとかじゃなくて、ここでの論点は副作用を利用してることの方だろ?
>>566,567だけみるとそういう風に誤解されやすそうだけど。
ちゃんと元の投稿
>>545 から関連する部分を読んでみよう。
@foo = map s/aaa/bbb/, @foo;
>>622 だからそこでmapを使うべきじゃないんだってば。
must notじゃなくてshould notね。
>>624 べきとかって、StrictHTMLじゃないんだから処理効率を最優先させることを非難してもしょうがないよ。
とりあえずもういいんじゃなかなこの話題は。自分の環境にあわせて好きにしようってことでさ。
一応俺の個人的な意見は、「どっちでもいい」だね。まあforeachの処理速度がmapより遅いからね。おやすみ
いちいち処理速度とか言っている人って気持ち悪い
個人で遊んでるんだから好きにさせて
>>626 >処理効率を最優先させることを非難してもしょうがないよ。
Perl使っときながら処理効率?はぁ?
んなこと言ってる奴のコードには必ずと言っていいほど
他に見直すべき部分があるんだよな。
>>622 >@foo = map s/aaa/bbb/, @foo;
mapによって@fooは置換済みなのに何で入れ直すの?
mapの動作理解してるか?
629 :
570:04/08/13 00:29 ID:???
あの一般的にいってmapのvoid.contextより、forの方が早いんですけど。。。
なんか可読性だけで遅いってことになっているような。
use Benchmark;
timethese(-3,
{
map => sub{
my @list = 1..1000;
map { $_ *= 2 } @list;
},
for => sub{
my @list = 1..1000;
$_ *= 2 for @list;
},
}
);
__END__
Benchmark: running for, map for at least 3 CPU seconds...
for: 4 wallclock secs ( 3.13 usr + 0.01 sys = 3.14 CPU) @ 1504.78/s (n=4725)
map: 3 wallclock secs ( 3.00 usr + 0.01 sys = 3.02 CPU) @ 745.27/s (n=2247)
>>628 いるんだよな、まともなアルゴリズムも組めないくせに
最適化とか言って部分的な高速化にこだわる奴。
ま、素人相手にムキになりなさんな。
631 :
570:04/08/13 00:38 ID:???
ちなみにmapをvoid.contextでつかってもlistは作られないようだ。perl 5.8.1から(英語は苦手だが。。。)
What's wrong with using grep in a void context?
The problem is that grep builds a return list, regardless of the
context. This means you're making Perl go to the trouble of building a
list that you then just throw away. If the list is large, you waste both
time and space. If your intent is to iterate over the list, then use a
for loop for this purpose.
In perls older than 5.8.1, map suffers from this problem as well. But
since 5.8.1, this has been fixed, and map is context aware - in void
context, no lists are constructed.
>>629 同じ事を書こうとして先越されたので、ヴァージョンでの差異も含めて追試。
#--- test.p ---
use Benchmark;
@Str = ((qw(aaa bbb ccc aaabbb cccaaa)) x 100);
timethese(-5, {
for => sub { my @str = @Str; s/aaa/bbb/ for @str },
grep => sub { my @str = @Str; grep s/aaa/bbb/, @str },
map => sub { my @str = @Str; map s/aaa/bbb/, @str },
});
__END__
・ActivePerl 5.8.4 Build 810
for: 6 wallclock secs ( 5.71 usr + 0.00 sys = 5.71 CPU) @ 660.25/s (n=3770)
grep: 6 wallclock secs ( 5.65 usr + 0.00 sys = 5.65 CPU) @ 667.26/s (n=3770)
map: 6 wallclock secs ( 5.49 usr + 0.00 sys = 5.49 CPU) @ 656.83/s (n=3606)
・ActivePerl 5.005_03 Build 522
for: 5 wallclock secs ( 5.06 usr + 0.00 sys = 5.06 CPU) @ 782.81/s (n=3961)
grep: 5 wallclock secs ( 5.00 usr + 0.00 sys = 5.00 CPU) @ 808.60/s (n=4043)
map: 6 wallclock secs ( 5.38 usr + 0.00 sys = 5.38 CPU) @ 440.33/s (n=2369)
わざわざ副作用を使おうとするひねくれた子には grep を勧める。
「grep より map の方が読み易い」というのは当然無しだよ。:p
>>632 追加ということで。(Vine 3.0)
This is perl, v5.8.2 built for i386-linux-thread-multi
Benchmark: running for, grep, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.28 usr + 0.01 sys = 5.29 CPU) @ 848.77/s (n=4490)
grep: 5 wallclock secs ( 5.29 usr + 0.00 sys = 5.29 CPU) @ 808.32/s (n=4276)
map: 21 wallclock secs ( 5.44 usr + 0.02 sys = 5.46 CPU) @ 744.69/s (n=4066)
This is perl, v5.8.5 built for i686-linux
Benchmark: running for, grep, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.36 usr + 0.00 sys = 5.36 CPU) @ 1241.79/s (n=6656)
grep: 5 wallclock secs ( 5.27 usr + 0.00 sys = 5.27 CPU) @ 1261.10/s (n=6646)
map: 5 wallclock secs ( 5.35 usr + 0.01 sys = 5.36 CPU) @ 1216.98/s (n=6523)
速度でごちゃごちゃうるさいな
perl使ってる時点で速度とか捨てろよ
何か反論できなくなるとすぐベンチ厨だもんな
これだからまいるよ
コーディングセンスけなされて、速度でも負けちゃあ
そらまいるわなw
>>596 自分でも書いているように、
正確には「印字可能」だからではなく、
単に \W にヒットしないからそのままPなだけ。
逆に、符号化する必要のない - とかまで符号化されちゃうけどね。
判って使う分には\Wで手抜きするのもOKなり。
まあ俺はどっちでもいいがな
可読性の話じゃなかったのか。
戻り値やパフォーマンス、効率、map/forに限らず
副作用を期待したコードは出来るだけ避けた方が良いと思うんだけど。
>>628 >>622はmapの副作用の有無に関わらず、
@fooが変更されたと言うのがコードから読みとれる。
そもそも、そう言った用途にmapを使うなって話なら同意だけど、
もしmapを使うとしたら配列が変更されたのを明示するって例だと思う。
perl以外の言語を使っている立場から見ると、
mapが勝手に配列の要素を変更するのが気持ち悪いんじゃないかな?
例えば次のコード例で、barの引数 @data にはどんな値を期待するか。
foo(map s/A/B/, @data);
bar(@data);
例えが悪かった
map{s/A/B/; $_}@data としないと期待通りにならないね。
>>622
いちいち処理速度とか言っている人って気持ち悪い
藻前はTemplate::HTMLとか使わないで全部自分でHTML printするのかと。
>>638 可読性の話だよ。
>>555 にあるように Perl コミュニティ的には、
何をしているのか分かり易くする為、副作用のみを利用する
ようなコーディングを奨めていない。
しかし (Perl スクリプトという手段の中で) 速度の為に可読性
を犠牲にしなければならない場面というのは確かにある。でも
そういう時でさえ map でやる意味が無い、という事をベンチ
マークが示している。それを理解できない子が吠えてるだけ。
>>640 HTML::Template の仕様が気持ち悪いから必要充分なものを
再発明、というのはありじゃないかな。
>>629 1.関数の一番最後の式は戻り値になるのでvoid contextじゃない。
2.mapの方だけブロックにするのは不公平。
use Benchmark;
timethese(-3,
{
map => sub{
my @list = 1..1000;
map $_ *= 2, @list;
1;
},
for => sub{
my @list = 1..1000;
$_ *= 2 for @list;
1;
},
}
);
Benchmark: running for, map for at least 3 CPU seconds...
for: 4 wallclock secs ( 3.23 usr + 0.00 sys = 3.23 CPU) @ 1535.91/s (n=4961)
map: 4 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 1577.47/s (n=5111)
643 :
570:04/08/13 05:33 ID:ZD4WTWGN
>>642 確かにね。投稿してからきずいたよ。
ただ、ベンチとったら633と同じような結果だったからどうでもいいと思ったんだ。
その2点に注意して、
Benchmark: running for, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 1520.10/s (n=8242)
map: 5 wallclock secs ( 5.03 usr + 0.00 sys = 5.03 CPU) @ 1534.68/s (n=7721)
C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.42 usr + 0.00 sys = 5.42 CPU) @ 1520.10/s (n=8242)
map: 6 wallclock secs ( 5.50 usr + 0.02 sys = 5.52 CPU) @ 1486.58/s (n=8200)
C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 5 wallclock secs ( 5.23 usr + 0.00 sys = 5.23 CPU) @ 1529.42/s (n=8005)
map: 5 wallclock secs ( 5.48 usr + 0.00 sys = 5.48 CPU) @ 1495.26/s (n=8200)
C:\home\tenho\lavoratory\form>3.pl
Benchmark: running for, map for at least 5 CPU seconds...
for: 6 wallclock secs ( 5.50 usr + 0.00 sys = 5.50 CPU) @ 1502.36/s (n=8263)
map: 6 wallclock secs ( 5.53 usr + 0.00 sys = 5.53 CPU) @ 1482.28/s (n=8200)
644 :
nobodyさん:04/08/13 05:44 ID:JjTi/TTm
perlの掲示板スクリプトで、書き込みを終えた後ブラウザの「戻る」でバックした時に「クッキーの有効期限が〜」と出てさらに更新すると二重書き込みになってしまうのですがこれを防ぐ方法を御教授いただけませんでしょうか。
まったくの暗中模索状態なので検索ワードだけでもお教えいただければ幸いです。
よろしくおねがいします。
646 :
nobodyさん:04/08/13 06:15 ID:JjTi/TTm
>>645 ありがとうございます。
過去ログ読んで、ないようなら移動します
>>642 関数自体が無効コンテキストで呼ばれるので、
戻り値を気にする必要はないと思うよ。
Benchmark.pm の runloop() 参照。
暴れすぎだよ
どっちの意見もうなずけるがどっちもキモいな
可読性ってのは専門家には必要なんだろうが、個人の趣味でやってんなら無用。
ソース公開するってんなら別だが。
Bench取る癖は悪かないが、mapとfor比べたってしょうがないだろ。
複雑な問題解決のためのアプローチの違いとかでやんなさい。
euc-jpの全角数字を半角数字に変換するのにカコイイコーディングを募集中。
@math = ("0","1","2","3","4","5","6","7","8","9");
for($i=0;$i<@math;$i++){ $value =~ s/@math[$i]/$i/g }
ダサイ・・・・・・・
for($i=0;$i<10;$++){ $value =~ s/\xa3\xb$i/\x3$i/g }
こんなのがokなら一行ですむのに
>>650 上の方から気になってたんですが、思い切って質問することにしました。
foreachの速さを調べる時はforでベンチ取るんですか?
>>652 Perl では for ループも foreach ループも実体は同じ。
foreach (my $i = 0; $i < 5; $i++) { print $i }
for (5..9) { print }
但し "foreach" 修飾子は存在するが "for" 修飾子は
存在しないので、以下のような事はできない。
print $i for ($i = 0; $i < 5; $i++);
まぁ1つの文に ; が複数出てくる事になるので自明だけど。
>>653 見てなかったorzでもJcodeをコンパイルしてインスールするのが面倒だからダミダ・・・
656 :
652:04/08/13 13:16 ID:???
>>654 ありがとうございます。
for(@a){print}
print $_ for @a;
と
foreach(@a){print}
print $_ foreach @a;
両方使えるなんて知りませんでした。なんか今後foreach使わずにforだけでやってしまいそうですが
for(@a){print}ができるならforeachってあまり必要ないと思うんですが、そんなことはありませんか?
知恵を拝借。
%a=( aa=>1 , a1=>1 , a3=>1 , ax=>1 , a8=>1 , a5=>1 );
このハッシュのキーを正規表現にかけて
/\w\d/
に真がでるキーが3個以上あればそれらに対して
delete $a{hoge};
をしたい。
とりあえずいまのとこ思ってるもの↓
@a = grep/\d\w/,keys %a;
undef $a[0] for 0..1;
delete $a{$_} for @a;
undefに配列スライスが使えないなんて知らなかった;
他にもコーディング案があったらレス下さい。
undef $a[0] for 0..1;
これは
undef $a[$_] for 0..1;
の間違いでした。
>>657 delete 対象の優先順位とかは無いの?
if ((my @key = grep /\w\d/, sort keys %a) > 2) {
delete @a{ @key[2..$#key] };
}
660 :
657:04/08/13 14:47 ID:???
>>659 優先順位はなし。消えればなんでもいい感じ。
delete @a{ @key[2..$#key] };
これいいね!@aってのがミソなのね。知らなかったよ。
ところで全然関係ないことなんだけど、HTMLタグのサニタイジングってどのタイミングでしてる?
今まで受け取って%formを作る際にしてたんだけど、それじゃちょっとよくないから
ちゃんと出力時||使用時にやろうと思うんだけど例えば
$form{hoge} まだサニタイジングしてない状態
$form{hoge} サニタイジング済み
にするべきか
$form{hoge} まだサニタイジングしてない状態
$hramless{hoge} サニタイジング済み
にするべきかなんだけど、やっぱり送られてきたデータの初期状態は残して置くべきだから
後者でやるべきだよね?
でもちょっとに大きくなってきたので(プログラムが)、きついんだよね。
>>660 俺は
read(STDIN.$buffer,$ENV{CONTENT_LENGTH});
foreach(split/&/,$buffer){
my($a,$b)=split/=/;
$b =~ s/%(..)/pack("H",$1)/;
$b =~ s/<>\:\;その他自分のサイトで必要ない記号//g;
$form{$a} =$b;
}
でやってる。いちいちその都度やってるとモジュール化もやりづらい。
ていうか第1引数を置換処理(種類は第2引数)して、returnしてくるメソッド作ればいいだけだろ。
第1引数を置換処理するのはサブルーチンだろ。少しはPerl使え。
>>664 呼び出し側からみたら第1っぽいからいんじゃね?
それよりここにいるやつのどれくらいがオブジェクト指向プログラミングできるのかね?
漏れは通販サイトの注文システムを一個の自作モジュールで、面倒andどのページでも使うような
処理をまとめようと思ったが、挫折したorz
どこまでをmainのオブジェクトにやらせて、どこからをモジュール側のオブジェクトにやらせるかの
境界線に苦悩して、最後は状態と振る舞いの境界(意味不明な言い方でごめん)までわからなくなって
結局ライブラリにして終らせた;
むずいんだよ!
>>665 お前はまずオブジェクトを何に見立てるかができてないんだろ?
例えばメインパッケージを注文を電話で聞くお姉さん。
モジュールの方を、お姉さんが使うパソコン。
とかな。まあお姉さんが注文が来るたびにパソコンを買う(new)なんてのはおかしな話だがなw
質問です。
$hoge="hoge=1&data=a-a-a&test=23456";
この$valueの中からdata=a-a-aだけを取り出したいです。
data=a-a-aのある位置は毎回違うのでsubstrではできません。
data=に続く文字列も毎回違います。
splitとforeachを使って%formなどを作るのは禁止で、実現したいです。
$hoge =~ s/(data=.*?)&//;
$value = $1;
で一応data=...の後に&がある時は取り出しに成功できますが、
$hoge="hoge=1&data=a-a-a";
などの場合もあるのです。それと
$hoge="hoge=1&data=a-a-a&test=23456&tete=ussgf";
みたいな場合もあります。
どうにかどんなときでもdata=文字列だけを一発で取り出せないでしょうか?
>>667 if ($hoge =~ /data=.*&/){
$hoge =~ s/(data=.*?)&//;
$value = $1;
}else{
$hoge =~ s/(data=.*)//;
$value = $1;
}
ちと長いな。
($value) = $hoge =~ /(data=.*?)&?$/;
($str) = $hoge =~ m/(data=[^&]*)/;
671 :
667:04/08/13 18:42 ID:???
>>668-9 ありがとうございます
/(data=.*?)&?$/
これ不思議なコードですね;どうしてこれでうまくいくのかな。
$は&?にかかってるけど、&がないときは(data=.*?)にかかるって言う便利なコードですか?
・・・すごいですね
>>669さんは。本当にすごいです。
672 :
667:04/08/13 18:44 ID:???
>>670 それ私も一度試しましたが、駄目でした。
理由はわかりませんが
print $str;
で何も表示されませんでした。
673 :
667:04/08/13 18:48 ID:???
>>669 ($value) = $hoge =~ s/(data=.*?)&?$//;
としたいんですが、置換にすると置換数?真偽?が帰ってくるので
$hoge =~ s/(data=.*?)&?$//;
$value = $1;
とするしかありませんか?一行でバチッとできるとカッコイイんですが。
ものすごく
>>669さんからの返事が楽しみです^^(頼り切ってすみません;)
674 :
667:04/08/13 18:51 ID:???
>>667 for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
my($value) = $hoge =~ /(?:^|&)(data=[^&]*)(?:&|$)/;
print "$value\n";
}
>>671 669ではうまくいかんはずだが。
ちゃんと試したのかい?
置換しなければならないのだろうか?
そして、ハシュを拒否する事由は?
my $hoge="hoge=1&data=a-a-a&test=23456&tete=ussgf";
my %hash = map +(split /=/), split /&/, $hoge;
printf qq|%s = %s\n|, $_, $hash{$_} foreach keys %hash;
env.:
$ perl5.8.5 -v
This is perl, v5.8.5 built for i686-linux
>>675は冗長。
$hoge =~ /\b(data=[^&]*)/
で十分。
679 :
669:04/08/13 19:10 ID:???
>>676 何でうまくいったのか検証してしまったよ(w
680 :
667:04/08/13 19:16 ID:???
>>675-6 /(?:^|&)(data=[^&]*)(?:&|$)/;
これは
>>669さんのやつの変形ですか?でも
>>669さんのコードで試したらちゃんと表示されましたよ?
テストが足りないんですかね?もう一度やってみます。
>>677 フォームで送られてくるデータを一度変数に入れて、その後
dataの部分だけをAルーチンに渡して、
それ以外をBルーチンに渡したかったのです。(ルーチンは外部ファイルに作ってあるます)
今はAルーチンとBルーチンの方で、ハッシュにする流れです。先にこちらでハッシュにしてわたしてもいいのですが、
こういうのもできたらカッコイイなと思って質問いたしました。
>>673 一行でバチッとw
$str = ($hoge =~ s/\b(data=[^&]*)//, $1);
682 :
667:04/08/13 19:23 ID:???
for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
($value) = $hoge =~ /(data=.*?)&?$/;
print "$value<br>";
}
>data=a-a-a&test=23456
>data=a-a-a
>data=a-a-a&test=12345
>>676 さっきはうまくいったと思いましたが、↑のソースでやってみたらうまくいきませんでした;
ちゃんとテストしたつもりが勘違いでした;
>>皆様
もの凄く勉強になりました!本当にありがとうございました!それでは失礼します。
>>660-663 オブジェクト指向で書く場合は俺はサニタイジングモードを作ってるよ。
sub new {
my $self = shift;
my $buffer = shift;
my %harmless_mode = (
normal => 1,
html => 0,
sql => 0,
csv => 0,
);
みたいなね。(1=on,0=of)
んで状態移行のメソッドを作っておけば一応問題ないかな。まあ俺は小規模プログラムしかやったことないから
大丈夫なだけかもねw
>>678 確かに
>>667 のは \b で充分だね。分かって言ってるんだろうけど一応。
for my $hoge (
"hoge=1&data=a-a-a&test=23456",
"hoge=2&a-data=a-a-a&test=12345",
"data=a-a-a\n",
) {
my($value1) = $hoge =~ /\b(data=[^&]*)/;
my($value2) = $hoge =~ /(?:^|&)(data=[^&]*?)(?:&|$)/;
print "1[$value1] 2[$value2]\n";
}
>>683 君の頭ん中のPerlでは動かないようだね。
>>685 後ろの(?:&|$)も必要なんでつか?
オブジェクト指向ってよくわかんないんですけど、自分でモジュールを作る時に
sub new{
my $this = shift;
my $propety = {
color => shift,
weight => shift,
};
bless $propety,$this;
}
ていうコンストラクタだったとして、あとから他のメソッドで
sub change{
my $this = shift;
$this->{color} = "red";
$this->{changed} = "1";
}
みたいにコンストラクタではなかったchangedっていうプロパティをいきなり作っちゃっていいんですか?
それとも、コンストラクタを
$propety = {
color => shift,
weight => shift,
changed => 0,
};
みたいにするべきでしょうか?そうしてしまうと新しいプロパティがほしくなった時に
わざわざコンストラクタをいじらなければいけなくて、不便かなと思うんですが・・・
689 :
683:04/08/13 21:00 ID:???
>>686 ウソ!?って思って試してみた。
for my $hoge (qw(
hoge=1&data=a-a-a&test=23456
hoge=2&data=a-a-a
data=a-a-a&test=12345
)) {
$str = ($hoge =~ s/\b(data=[^&]*)//, $1);
print "$str\n";
}
PCに入ってるPerlでも動かなかったw
>>689 そのコードの$hogeはReadOnlyな文字列への別名だから、
置換できるわけなかろう。
$hogeをループ先頭でmy $hoge=$_;とすりゃ動いたぞ。(Perl5.8)
#つか、foreachであるべきところをケチってforにすんな、紛らわしい。
ちなみに
>>685の問題も回避したい場合、
置換では
>>675でもうまくいかんので、
$str = ($hoge =~ s/(?:^|(?<=&))(data=[^&]*)//, $1);
とするといい。
#後ろの(?:&|$)はいらんべ?
>>688 作法として行儀がいいかどうかは別として、blessされてる以外は
ただのハッシュだからキーの追加だろうが削除だろうが自由にでき
ます。
use fields使ってりゃ別だけどな〜
692 :
688:04/08/13 22:39 ID:vpkCloyF
>>691 できるのは知ってるのですが、どうするのが一番「十分に拡張的なプログラム」なのかで悩んでます。
>>692 一番かどうかはともかく一つのやり方として。
コンストラクタでは何もせず、プロパティは全てアクセサ経由で触り、
初期値はアクセサで設定する。
#--- Foo.pm ---
package Foo;
sub new {
my $class = shift;
bless { @_ }, $class;
}
sub color {
my $self = shift;
@_ or return $self->{'-color'} ||= 'red';
$self->{'-color'} = shift;
$self;
}
1;
#--- script ---
use Foo;
my @obj = (Foo->new, Foo->new(-color => 'green'), Foo->new);
$obj[2]->color('blue');
print $_->color, "\n" for @obj;
694 :
nobodyさん:04/08/13 23:34 ID:Dbtrqa9I
695 :
nobodyさん:04/08/14 03:15 ID:HZTk9WgD
PerlでXMLファイルのデータを引き出したいのですが、方法がさっぱりなのです。
普通にファイルオープンの open(AAA,"<BBB.txt") のように開いて
データを取得することが出切るのでしょうか?
検索で、解説ページなどを探したのですが良いサイトが見つかりません。
(探し方が悪いだけかもしれませんが・・・・)
どこか良いサイトなどがありましたら、教えてください。
そのぐらい自分で探せないようならあきらめろ
697 :
688:04/08/14 10:22 ID:???
>>693 例まで書いていただいてありがとうございます。
買う時には必要でなかったプロパティが、買ってから途中でほしくなった場合のために
プロパティを後から追加できるオブジェクトメソッドを作っておいたらオブジェクト指向の利点がどこかで
失われてしまいますか?
sub additional_propety {
my $class = shift;
$class->{shift} = shift;
}
第2、第3引数に新規に追加するプロパティとその値を期待します。
>>697 そもそもコンストラクタ(new)を「買う」ことだと思ってる時点で、間違ってるな。
まあよくある解説だけどw
人に置き換えて考えてみ?例えば友達に「ジュース買ってきて」って頼むだろ。
そんでその友達がジュースをkって来るのは友達にはそういう振る舞いができるってこと
で、お前はその友達のインターフェースさえ知っていれば何度でもジュースを買ってきてもらえるんだ(買ってこない友達の状態もあるけどな)。
んでこんな時に new=買う ではおかしいだろ?だから new=自分と同一世界にいると認識する
なわけよ。だから認識さえすれば、人の家のテレビだって使えるわけだ。これが自然。
くだらん例えはいい
>>699 オブジェクト指向を理解させるのに、正しい例え話を聞かせるのって結構有効だろ?
そんなに怒るなよ
Perlの変数名とかに予約語を使っても大丈夫なのは仕様ですが?
$sub
$exit{for}
ここらへんがPerlのいいところですか?(Perlとmysqlしか知らないのでよくわかりませんが、すくなくともSQLでは予約語はdb_name,tbl_name,columns_nameには使えなかった気がしたので)
何だよ仕様ですが?って
$test = {
a => 1,
b => 2,
c => 3,
};
このハッシュのキーと値を「=」でjoinして、さらにそれを「&」でjoinしたいんです。
my @a;
foreach (keys %$test)
{ @a = $_."=".$test->{$_} }
$ok = join '*',@a;
undef @a;
わざわざ@aに一度入れるのが、冗長な気がするんですがいれない方法はありますでしょうか?
>>704 $ok = join '&',@a;
です
706 :
704:04/08/14 16:03 ID:???
とりあえず思いつきました。
$a = join "&",map{$_."=".$test->{$_}} keys %$test;
$a = 1 if $a == undefined;
と
$a == undefined && $a =1;
と
if($a == undefined){ $a == 1 }
これってどれが一般的に可読性がよいのですか?僕は結構真ん中の書き方がすきなのですが
みんなでプログラムを組む時などにはどれを使うと喜ばれますか?
use strict;すると喜ばれるかもな。
>>708 それなんか意味があるんですか?無駄に処理を増やすのは嫌いです。
一回で10個くらいの変数(スカラ、アレイ、ハッシュ入り乱れてます)をundefできませんか?
712 :
695:04/08/14 17:13 ID:HZTk9WgD
>>696 見つかりはするんですが、内容が難しかったり、関係無いものだったり・・・
わかりやすいページを見つけるにはどういった単語で検索すれば良いのでしょう?
>>707 undefinedじゃなくてundefだろ。
そういうミスを use strict が警告してくれるんだよ。
ちなみに普通はundefは使わず、それぞれ
$a = 1 if ! defined $a;
defined $a or $a = 1;
if (! defined $a) { $a = 1 }
のようにdefinedを使って書く。
また、if ! の代わりにunlessを使って
$a = 1 unless defined $a;
unless (defined $a) { $a = 1 }
のようにも書けるが、一般的にunlessやuntilなどの否定条件文は理解の
妨げになることが多いので使われない。
if ! より字数が多いのもネック。
で、or(または||)やand(または&&)を利用した「式1 or 式2」のような
記述は、副作用を持つ式1の結果如何で式2を評価するというものなので、
副作用のないただの条件式を式1に使うことはない。
#openがよい例
やるなら後付けif文か通常のif文かだが、今は$a=1しかすることが
なくても、後々他の処理も追加する可能性が少しでもあるなら
通常のif文を使うべき。
長文スマソ
>>712 >見つかりはするんですが、内容が難しかったり、
難しいんじゃなくてそれが普通なんだよ。
藻前には無理ってことだからあきらめろ。
>>713 undefined間違えてすみません。
でも聞く限りではuse strictはやっぱり無駄なモジュールなんですね。
一応文法チェックかけるんでそれで十分だと思います。というか何故に毎回そんなモジュールを読み込む必要が
あるのか?です。なんかアフォぽです。
>>711 ( スカラ、アレイ、ハッシュ入り乱れてます) = (undef) x 入り乱れた数;
>>716 プラグマです。
use strict;
はstrict.pmとかvars.pmとか色々読み込むので確かに遅くはなりますが、
$a == undefinedとか書いちゃうようなバカにはちょっと遅いくらいが
ちょうどいいと思いますよ。ほんと。
>>716 use strict; に厳しい添削をしてもらって完成したコードが
エラーや警告出なくなったらお引取り願えばいいことも
わからないバカは(ry
>>719 Perlオタクでない人にはオススメってことですか?
>>721 文法チェックだけで済ませられないバカは(ry
724 :
711:04/08/14 18:15 ID:???
>>718 @a = qw/1 2 3 4/;
$a = "absnd";
%a = (a => 1);
(%a , $a , @a) = undef;
print "$a\n",%a,"\n@a";
これだけできました。でも一応
(%a , $a , @a) = (undef) x 3;
とかしたほうがいいですか?
どんぐりの背比べが始まったw
>>716みたいなのに限ってcgi.pmを使っている(w
>>723 文法チェックだけでは済まない問題も、use strictによって
解決できること分からないバカは(ry
飯食いながら左手で打ってたら「も」が抜けちゃったYO
夏満開
>>732 だから、リストコンテキストにスカラーコンテキスト代入してどうするよ!
あんでふとーっ!
(´-`).。oO(>733 = '逝ってよし';だな)
736 :
724:04/08/14 19:33 ID:???
>>731 それでもできるんですね。
>>733 代入できても、やってはいけないことなのでしょうか?
(%a , $a , @a) = (undef x 3);
これが一番ですか?
>>733 コンマ演算子の優先順位が代入演算子より低いから括弧で括る必要が
あるのであって、代入する要素が一つの場合はわざわざリストにする
必要はない。つまり @a = 'a'; は @a = ('a'); と等価。
>>736 http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors (%a, $a, @a) = undef; は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = (undef x 3); は構文エラー。
(%a, $a, @a) = (undef() x 3); は %a = (undef), ($a, @a) = (); と等価。
(%a, $a, @a) = ((undef) x 3); は %a = (undef, undef, undef), ($a, @a) = (); と等価。
>>736 もまえは何がやりたいんだ?
(%a , $a , @a) = (undef x 3);
には少なくとも2つの大きな間違いが存在している。
まず、第1にundef x 3は文法エラーとなる。内容は実際に実行してから読め。
そして第2に、
(%a , $a , @a) = (1 => 2, 3, 4);
がどうなるのか考えろ。
しかしすごいなあ。
use strictの有用性を説明されても聞かないくせに、
自分の質問にだけは答えてもらおうとする。
さ す が 夏 休 み
夏休みに買うような本に載っているスクリプトはuse strictしたら
まったく動かない事くらい察してやれよ。
742 :
nobodyさん:04/08/14 21:49 ID:EgOE5Yt9
>>739 最初は釣りかと思ったが真性包茎みたいだねw
つーかずっとuse strictつけるとか思ってる奴ってww
簡易デバッガみたいな使い方だろ、use strictって
>strict.pmとかvars.pmとか色々読み込むので確かに遅くはなりますが、
っていうか、人間の感覚じゃまずわからんだろ。
strictは結構効率良いみたいだ。
Benchmark測ればわかる。
そんなことより、速度が遅いとか、無駄とかアフォとか言う前に、基本を勉強するべ
きで、しかもuse strict;の必要性についても、もっと勉強したりここの上級者の言
うことを信用したりしろっての。
my付けるのと付けないので挙動が変わったりするよ
use strict って擬似的なモジュールが存在するけど、実際はperlの内部で
完結してるんじゃないの?
まあuse strictと書きたくないなら
$^H |= 2|0x200|0x400;
とでも書きなさいっと。
use strict;なんてリリース時にはコメントアウトすればいいだろ。
>>748 いやそれが普通の使い方じゃないか?
ずっとuseしてる奴なんか居るのか?
>>746 ああ、my変数の typo を教えてくれるという重要な機能がありましたね・・・
sub unko {
my $unko = shift;
$$unchi = $$**$$; # $$unko (ry のつもり
}
751 :
nobodyさん:04/08/15 00:17 ID:ThpZR4Ya
先ほど間違ってphpの方で質問してしまいました...
C-BOARDで、投稿画面に追加したセレクトボックスの
投稿データチェック(未選択不可)を行いたいのですが、
どうすればいいのですか?
下記のところに、新しく追加したら大丈夫だと思うのですが..
チェックの仕方がわかりません。
#── メールアドレスをチェック
length($::FORM{'email'})
&& ($::FORM{'email'} !~ /^[!-?A-~]+@[!-?A-~]+\.[!-?A-~]+$/)
&& push(@error, 'メールアドレスが不正です。');
#── パスワードをチェック
($::FORM{'key'} =~ /[<>&"]/)
&& &::error(\('パスワードに「<, >, &, "」は'
. '使えません。'));
>>749 めんどいから use strict つけたままだけど
俺んとこは mod_perl だから実行時の速度は変わんないし
しかし珍しく本当に「コーディング」の話題だなあ
754 :
nobodyさん:04/08/15 00:57 ID:3zveFoKh
↓のように記述して、csvファイルからデータを読み出したのですが、
読み出した文字列が文字化けしたままなのです。
&jcode'convertで文字コードが変換出来ていないようなのですが・・・
どこが原因なのか、良くわからないのです。
お手数ですが、教えてくださいまし。
require "jcode.pl";
open(FI,"aaa.csv") || return 0;
while(<FI>){
$_ = nkf("-ed",$_);
chomp();
split(",");
if($_[0] eq $bbb){
$ccc = $_[1];
&jcode'convert(*ccc, "sjis");
}
}
close(FI)
>>751 まずC-Boardのあるディレクトリを削除する。
756 :
754:04/08/15 06:40 ID:3zveFoKh
すいません、解決しちゃいました。板汚しスイマセン・・・
757 :
724:04/08/15 11:33 ID:???
>>737-738 とりあえず一回で10個くらいの変数(スカラ、アレイ、ハッシュ入り乱れてます)をundefして
メモリを開放したいんです。
($a,@a,%a) = ();
これで完全に未定義の時と同じメモリ状況になるんですか?一応消えるのは確認しましたが。
>>757 ならんて。
$aは未定義になるがメモリとは関係なし。
@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
undef @aするとその分の変数領域は解放されるが、システムリソースとしては
喰われたままでPerlが終了するまで解放されない。
過去ログ嫁
759 :
724:04/08/15 13:05 ID:???
>>758 >$aは未定義になるがメモリとは関係なし。
>@aと%aは要素がない状態になるだけで、それまでに確保したメモリはそのまま。
>ちなみにPerlは最初にある程度のメモリを確保して変数領域に使ってるので
Perlではundefしてもメモリの開放はできないから、メモリ開放を期待して
ちょこちょこundefする必要はないってことですね。
ageておこう
761 :
ぢおぢお:04/08/15 15:24 ID:EbxomzZw
ifを使ってもしファイルがあったら〜の処理をするというのをしたいんですが
ファイルがあったらというのはどうやってすればいいんですか?
>761
ファイル検査演算子を使う。
演算子だらけのperl
764 :
ぢおぢお:04/08/15 15:33 ID:EbxomzZw
osがwindowsなので前やってみても駄目だったんです
>764
何をやってダメだったか書いてみ。
winだからって全てのファイル検査演算子が使えないわけじゃない。
tu-ka,環境依存の話なら先にそれを言え。
なにをやってもダメなやつっているよ
767 :
ぢおぢお:04/08/15 15:56 ID:EbxomzZw
if ( -e "$hozon" ) {
print "存在\n";
}
という風に存在したらというのをやったらなりませんでした
if (-e $hozon) {
769 :
ぢおぢお:04/08/15 16:19 ID:EbxomzZw
できました。ありがとうございました
770 :
nobodyさん:04/08/15 16:39 ID:LDNVI8I+
tesa
771 :
ぢおぢお:04/08/15 17:11 ID:EbxomzZw
if (-e "./nakama/$in{'id'}.cgi") { }
のようなやつで
何々と何々と何々が読み込めたらという処理はどうすればいいんですか?
すみません検索しても分からなかったので
>>771 そ ん な お 前 が
や り た い こ と
直 接 の サ ン プ ル は な い
$aと$bと$cが1以上ならという処理はどうすればいいんでしょうか。
考える気がないだろ。
>>771 @hozonに全部パスを入れとけアフォ
foreach(@hozon){
print "ok" if -e $_;
}
このクソアフォが!?
>>773 っていうか
print "ok" if grep {-e $_}@hozon;
だったな。
print "ok" if (grep {-e $_}@hozon) == @hozon;
776 :
ぢおぢお:04/08/15 17:44 ID:EbxomzZw
見ても全然分かりません。出直してきます・・・
>>772 if ( $a && $b && $c ){ print "これでよくね?w" }
それとも
if ( $a > 0 ){ if ( $b > 0 ) { if ( $c > 0 ) { print "天山ツームストン" } } }
にするか?いっそのこと
exit || exit;
でいいんじゃん?
ウホッ!?フィーバーだ!w
なんだこれ アホらし
780 :
ぢおぢお:04/08/15 18:01 ID:YD+WDikb
>777
なりませんでした。
782 :
ぢおぢお:04/08/15 18:10 ID:YD+WDikb
何が?
制御構文で質問です。
foreachのように、毎回スカラにリストの内容を代入する
+
forのように$iに現在のループ回数を入れる。
みたいなことは不可能ですか?foreach側で使うのは keys %hash なのでforの$iとリンクさせる形での
処理はできません。
785 :
784:04/08/15 18:45 ID:???
うまく説明できませんでしたが、foreachの途中で現在のループ回数を調べて、
ループ回数が一定の基準を超えると、発動する処理をしたいのです。
>>785 ダサいやつでいいなら
$i = 0;
foreach(@a){
処理〜;
print "2桁キター" if $i > 9;
$i++;
}
で一応できるよ。
787 :
784:04/08/15 19:00 ID:???
%data = (
a => 1,
b => 2,
c => 3,
d => 4,
e => 5,
);
@a = keys %data;
delete @data{@a[1..3]};
これが
$data = {%data};
の場合に
delete @data->{@a[1..3]};
としてもうまくいきませんが、何か方法はありますか?
delete( @$data{ @a[1..3] } );
こうですね
readでSTDINから読んで、$bufferに代入したいんですが、いきなりリファレンスとして代入というのはやってもいいんでしょうか?
read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
のようにすればできたのですが、いきなり$$bufferに代入するとおかしい気がするので(シンボリックリファレンス?なんか非推奨って読んだ気がします)
$buffer = \"";
read(STDIN,$$buffer,$ENV{CONTENT_LENGTH});
とかを考えてみました。
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 質問者が返信する際は、名前欄に「最初に質問したレス番号」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
メール欄を空にするとage荒らし死ねと言われる。
上げっぱなしで続けるからだろ。
こんなところか。
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
☆ 新規質問は名前欄・メール欄を空にして行え ☆
★ ★
☆ 返信は名前欄に「最初に質問したレス番号」・メール欄に「sage」を入れろ ☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
メール欄を0にするとブラウザで見てる厨房にどうやってIDだけ消すのと聞かれる。
>>793 ☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ .★
☆ .☆
★ 右の星もちゃんと整列させてから書き込め .★
☆ .☆
★ ★
☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
>>795 そういうお前が整列させてから書き込め。
っていうかそんなルールこのスレにはないだろ
ウザい質問者は徹底スルーが基本だって。
798 :
nobodyさん:04/08/16 09:52 ID:f4GvLXd6
$sth = $dbh->prepare(
qq{ INSERT tbl_name SET name="$hoge{name}" sex="$hoge{sex}" weight="$hoge{weight}" }
)
%hogeにはフォームから送られてきたクエリが格納されてます。
このようなSQLインジェクションをやる場合にXSS対策として、
foreach( keys %hoge){
$hoge{_} =~ s/"|'//g;
}
としてるのですが、これでXSS対策は万全でしょうか?とりあえず上のSQL文の場合、クォートさえ消しておけば
全部文字列として解釈されるので、おかしなことにはならないと思いますが、もしも穴がありましたら
ご指導願います。
>>798 わざわざprepareするんだしプレースホルダ使えよ。
800 :
798:04/08/16 10:36 ID:???
801 :
798:04/08/16 10:49 ID:???
802 :
772:04/08/16 11:52 ID:???
803 :
nobodyさん:04/08/16 17:39 ID:YMFVNVGs
質問させてください。
telnetにて正常動作したperlスクリプトをCGIとして動かすと
エラーになってしまいます。
ログをたどると以下のようになってます。
Can't locate CGI.pm in @INC (@INC contains:
/usr/home/xxx/usr/local/lib/perl5/5.8.4/i386-freebsd
/usr/home/xxx/usr/local/lib/perl5/5.8.4
/usr/home/xxx/usr/local/lib/perl5/site_perl/5.8.4/i386-freebsd
/usr/home/xxx/usr/local/lib/perl5/site_perl/5.8.4
/usr/home/xxx/usr/local/lib/perl5/site_perl
.) at /usr/local/etc/httpd/htdocs/board/index.cgi line 6.
BEGIN failed--compilation aborted at /usr/local/etc/httpd/htdocs/board/index.cgi line 6.
[Mon Aug 16 10:19:51 2004] [error] [client 138.243.201.4]
Premature end of script headers: /usr/local/etc/httpd/htdocs/board/index.cgi
で、不可解に思って、なんでCGI.pmがないんやろかと@INCのフォルダを
洗いざらい調べてみたら、なんときっちり存在しているのです。
なにか他に思いつく原因ってあるでしょうか?
ちなみにperl5.8.4です。
>>803 @INC の各パスやファイルのパーミッション
>>804 パーミッションは755です。ちなみに705にしてもエラーが出て、
上記のログがApacheのエラーログに追加されます。
またpmモジュールは読めさえ出来ればパーミッション関係なかったような。
ちなみにpmモジュールのパーミッションは444でした。
@INCの各パスとはどういうことでしょうか?
CGI.pmは/usr/home/xxx/usr/local/lib/perl5/5.8.4に確かに存在していました。
806 :
803:04/08/16 18:01 ID:???
>>805 名前とE-mailを入れ間違えた。805=803です。
/usr/home/xxx/ の中に usr/local/lib/perl5/5.8.4 があるって事?
おかしくない?よくわからんけど。
>>805 /usr
/usr/home
/usr/home/xxx
/usr/home/xxx/usr
/usr/home/xxx/usr/local
/usr/home/xxx/usr/local/lib
/usr/home/xxx/usr/local/lib/perl5
/usr/home/xxx/usr/local/lib/perl5/5.8.4
これらディレクトリ自体のパーミッションが CGI の実行ユーザに対して
開いているか (読取及び実行権限があるか) ? という事。
たぶん自分の home に自分で入れたんだろう
一番疑われるのは、既出の通りファイルまたはディレクトリのパーミッションが
apache の実行権限で読めないようになってる、という可能性だが、
それじゃないなら、なんだろうなあ
まさか apache が実行時に chroot されてるとかか?
apache の管理人に相談した方がいいような気もする
「Apache(から呼び出されたPerl)が/usr/home/xxxに入れない」に一票
MD5暗号化、照合ライブラリってないものでしょうか。
cryptがサーバ対応してなくてMD5使えないもので、
ありましたら使い方等教えていただけますと幸いです。
>>805 ていうかなんでおまいはサバカンに問い合わせないんだ?
815 :
803:04/08/16 23:04 ID:???
>>814 問い合わせてみました、返答ですが
「本サーバは若干特殊でお客様のホームデレクトリが仮想ルートと
なっております。(だからホームの下に元々usrとかetcとかあるわけです)
@INCの値を/usr/home/xxx/usr/local/lib/perl5/5.8.4から
/usr/local/lib/perl5/5.8.4に書き換えれば動作します」
とのこと。@INCがおかしくてlib.pmにもアクセスできないのに
どうやって@INCを書き換えればよいのだろうか…。
>>815 use の仕組みを理解して lib.pm が何をしているか
読み解けばいいんじゃないか。
でもおじちゃんが君の勉強の機会を奪ってあげよう。
BEGIN { unshift @INC, '/usr/local/lib/perl5/5.8.4' }
>>816 間違っちゃいないが、それはそれで非効率的だな。
原因の根源から断つ考えは出来んのか?
まともな鯖に引っ越す。
これだな、うん。
820 :
803:04/08/17 03:32 ID:???
>>816 なるほど、@INCも所詮はただの配列だからスクリプト側で
勝手に追加すれってことですね。すこし効率悪いかなとも
思ってましたけど、いざ使ってみると1箇所追加するだけでも呼び出す
ライブラリ全部に反映されるみたいなので結構いい感じです。
ご教授ありがとうございます。
if(判断式1){
DispError("ERROR") if (判断式2);
$count++;
}
なんですが、
これは判断式1がtrueの場合DispError(ERROR)が発生するとして、
その後の判断式2はどうかかわるのですか?
823 :
nobodyさん:04/08/17 13:54 ID:4w98o0dA
Perlでモジュールを使ったオブジェクト指向風プログラミングを
始めたんだけど、文字列の変数展開で、
"$Foo->bar()"
みたいな事出来ないかな?
Rubyだと
"#{Foo.bar}"
という書き方が出来るんだけど。。。
文字列の変数展開は
"$Foo->{bar}"
$Foo->bar() はメソッド
>>823 print "${\($Foo->bar())}";
print "@{[$Foo->bar()]}";
826 :
821:04/08/17 14:01 ID:???
>822
ありがとうございます、特殊な書き方なんですね。
827 :
nobodyさん:04/08/17 14:04 ID:4w98o0dA
でも
>>825の書き方って、見て呉れが悪いのが嫌なんだよな
829 :
825:04/08/17 16:06 ID:???
print $Foo->{bar} じゃ不満?
printf "%s", $Foo->{bar};とか
print "", $Foo->{bar} . "";とか
いくらでも書き方はあるけど?
で、
>>824に突っ込むなら、Class::Accessor使ってみたら?と。
>>830 ヒアドキュメントを考えてるんじゃないか?
>>831 ああ、あんまり使わないからわかんなかった。
漏れの場合は825の2つ目のを使うけど。
ヒアドキュメントを使う場って、長いHTMLとかSQLとか書くときがほとんどだけど、
前者はTemplate、後者はプレースホルダーとかsprintfとか使うから、
使うとしても、内部に変数を埋め込むことは少ないなぁ。
TMTOWTDIとすれ違いなのでここまでにしとく。
>>832 >TMTOWTDI
これ何?ネオマスぐらい気になるな;
834 :
832:04/08/17 17:02 ID:???
835 :
833:04/08/17 17:38 ID:???
>>834 は?どういうこと?
最近Web製作板で、ネオマスって言葉を質問してるやつがいて誰もわからなかったんだよ。
で、お前のアルファベットんp羅列も同じようにわかんねって話なんだが?
>>833 ぐぐればわかるよ。
まあ気にすんな。
時々、ああやって見慣れる言葉を書いて得意気になってる
いつものウンチクオタクだろうから。
837 :
832:04/08/17 17:44 ID:???
釣りじゃないのね。PerlのスレでTMTOWTDIがわからんという人間がいるとは
本気で思わなかったんだよ〜
There's More Than One Way To Do It.
Perlの標語だよ。発音はtim-todayらしいね。詳しく知りたかったらググってみそ。
初心者スレですから
839 :
名無しさん:04/08/17 19:11 ID:s4X1hHlI
Perlのセッション管理ってDBとかファイルとかに書き込まないとだめなんですか?
メモリ上だけでやる方法教えてください。
あと、JavaのServletでインスタンスフィールド作ると
スレッドセーフじゃなくなって他のセッションの情報とか混ざっちゃたりするからダメ
みたいなそういう心配ってしなくても大丈夫ですか、Perlは?
>>839 無理。
mod_perlで変数を初期化しなければ・・・みたいなアクロバティックな
方法もあるけど、初期化しないという保証はないからお勧めできない。
PHPとかのセッション管理も実際はファイル書き込み以外の何物でもない。
後Servletは知らないけど、CGIのPerlならプロセスだから問題ない。
mod_perlだと、グローバル変数に適当にセッションの情報を放り込むと、
混ざらないとは言い切れない。
>>839 RAMをマウントしてファイル作るとか。
842 :
名無しさん:04/08/17 20:10 ID:s4X1hHlI
ありがとうございます!
あと日本語が変でごめんなさい。
JavaのServletではそういうことやっちゃダメで
心配しなきゃなんないんだけど、
Perlでそういう感じの心配しなきゃならないとこってありますか?
ってことを書いたつもりでした。ごめんなさい。
SJISで書かれたフォームから入力された文字をEUCコードの
プログラムで受け取っているのですが、変な文字化けを起こして
しまいます。
jcode::convert(\$form{text}, "euc");
ですと、$form{text}が「てすと」の場合は文字化けを起こさず、
「テスト」の場合は文字化けがおこります。
「テ」の場合は文字化けしません。
これを jcode::convert(\$form{text}, "euc", "sjis");
に明示的に指定すると、「テスト」の文字化けは直りますが、
今度は「てすと」が化けるようになってしまいます。
ループにはまってしまったので、質問させていただきました。
どうか宜しくお願いいたします。
844 :
843:04/08/17 21:21 ID:???
すみません、解決したっぽいです。
そのまえのフォーム受け取りルーチンに問題があったっぽいです。
スレ汚しすみませんでした。
>>839 内部状態をhiddenで渡す。勝手に書き換えられないように、チェックサム付けとく。
846 :
798:04/08/17 23:56 ID:b/+hcgJE
mysqlにDBIを使って接続して、フォームからのクエリを埋め込んだSQL文を発行したいときは
プレースホルダを使用して、LIKE用に%と_をエスケープしておけばそれ以上サニタイジングは
何もしなくても安全ですか?
色々読んだところとりあえずそれで問題はないようなのですが、一応このスレのみなさんに
最終確認して自信を持ちたかったので投稿しました。
どうぞお願いします。
>>845 チェックサムって何や?まあ何でもいいけどさ。
848 :
nobodyさん:04/08/18 16:37 ID:FTnHFAXj
#1番目の数字###############
$rule1 = rand 20;
$data1 = int($rule1) + 1;
#2番目の数字###############
$rule2 = rand 20;
if ($rule2 <= $data1) {
$rule2a = rand 20;
}
$data2 = int($rule2a) + 1;
ランダムで選んだ2つの数字を$data1より$data2のが大きな数字にしたいのですが
うまく動作しません、どうすればよいのでしょうか?
$data2を先に選んでそこからランダムな値を引いて$data1に入れるとか
>>848 $rule1 = 1 + int rand 20;
do { $rule2 = 1 + int rand 20 } while $rule1 == $rule2;
$rule1 < $rule2 or ($rule1, $rule2) = ($rule2, $rule1);
print "$rule1 < $rule2";
852 :
848:04/08/18 17:30 ID:???
>>839 systemV系のosなら共有メモリが使えるよ。 see also IPC
854 :
846:04/08/18 18:50 ID:???
お願いしますm(__)m
>>854 「色々読ん」で問題はないようなんだったら問題ないんだろ。
問題があるなら色々読んでたら見つかるはず。
>>855には答えられませんでしたw
まあ完璧か?と聞かれるとそこまで自信が持てなくて返事ができなかったりする;
だってセキュリティ問題ってそういうもんだろ?後は↓こいつが見事な答えをだすんじゃないか?
俺の話題はDBI確定かよ!w
まあいいけど。
SQLインジェクションが怖いのは、例えば発行してるのがSELECT文なのに
INSERTとかDELETEとかDROPとかCREATEとかそういうのを使われること。
そういう点では、プレースホルダ使えば”ほとんど”問題はない。
ただ、当然のことだが、SELECT * FROM some_table WHERE ? = ?
みたいなSQLを書いて、?にテーブルのカラム名を入れる〜みたいなのだとまずい可能性が高い。
つまり、数値だとか文字列をエスケープすると言う点ではいいんだけれど、
動的にSQLを作成し、なおかつその値をユーザーからの入力に任せるとダメ。
この辺りのチェックは絶対に必要になる。
それから、他人の情報を盗まれたり〜という点に置いての
チェックなんかも、ユーザーからの入力じゃなくて、セッション管理とかしないとね。
この辺になると、インジェクションというのとはちょっと違うけれど。
>>846 お前さ。2chで大丈夫だよといわれるだけで安心できるの? いくらでも逝ってやるよ。
それで完璧。絶対に大丈夫。
>>857 > 動的にSQLを作成し、なおかつその値をユーザーからの入力に任せるとダメ。
それは設計が悪い。
859 :
798:04/08/18 23:11 ID:???
みなさんありがとうございます!
>>857 注文を保存するだけのものなので、
INSERT tbl_name SET name=?
のような使い方しかしないつもりです。
>>858 2ちゃんでというか、自分でできる限り調べるのと+このスレの人の回答を
足し合わせると安心できます。
おまいら自分でフォームから渡された文字列の文字コードしらべられるか?
モジュール||ライブラリ なしで。
できるやつってすげえな。まあjcode.plの中身を見ちゃえばわかっちゃうけど、
見ないでわかっちゃうやつは
どうでもいいことだ
>>860 目で見ればわかる。なれた。
SJISをEUCのつもりでSJISに変換したのもわかる。
ただなぁコード書けって言われても・・・その、なんだ、困る
parlで作ったプログラムA、B、C
このABCを管理する為のperlプログラムDを作りたいと思っております。
具体的には
DにてABCを起動
ABCを監視し、終了したプログラムに対して再起動やログなどを残す。
プログラムの起動や終了状態を取得するには
system関数を使おうと思っているのですがsystem関数では一つの子プロセスが
終了するまで、親プロセスには制御が戻らないのでどうしたものかと
悩んでおります。
アドバイスなど頂ければ幸いです。
よろしくお願いします。
fork
つーか戻り値ないsystemを使うのか・・・
865 :
863:04/08/19 00:25 ID:???
>>864 ありがとうございます。
forkについて調べてみます。
forkだけじゃだめなんだが
>>863 system "A.pl &";
system "B.pl &";
system "C.pl &";
868 :
857:04/08/19 01:23 ID:EPjrU+Ei
>>858 > それは設計が悪い。
その通り!
でも、そういうことを聞いてるんだと思ったんだが・・・
869 :
863:04/08/19 01:25 ID:???
>>869 そ、それはすげー盲点だった > W2K
不可能ではないが、どちらかと言うと、潔く諦めることをお勧めする
871 :
863:04/08/19 02:38 ID:???
レスありがとうございます。
今調べていると
Win32システム用Perlで実装されていない関数
にforkが入ってました・・
>>870 >>不可能ではないが、どちらかと言うと、潔く諦めることをお勧めする
こう言うことでしょうか?
確かめる為に実際にforkを入れてみるとちゃんとプロセスが増えました。
dos窓がもう一つ増えるわけではありませんが、dos窓一つにperlプロセスPIDが
二つ。
本当はdos窓二つ、perlプロセス2つにしたいのですが。
forkは自分の分身を子プロセスとして作り出すのでDという管理プログラムを
使ってA、B、Cというプログラムを動かすには
Dのコードの中にABCのコードも含めて、子プロセスの場合はABCそれぞれの
ルーチンを機能させるみたいなことにしないといけないのでしょうか?
全く別のプログラムを起動させて、そのPIDを監視と言うか取得できる
方法があれば涙モノなのですがそう上手くはいかないようですね・・
873 :
863:04/08/19 05:26 ID:???
>>872 Win32::Process
Win32API::Console
あたりかな・・ありがとうございます。
ジロジロしてみます。
874 :
nobodyさん:04/08/19 19:10 ID:4YGc7qXm
1.フォームからのデータをSTDINから読んで、スカラに入れる
2.1の変数をハッシュにする。
1はだいたい$buffer
2は%form
が多いし、何より自分もそれをずっと使ってきたからわかりやすい。
でも、ちょっと今回は他のことにその名前を使いたいので(ifないのローカル変数だからダブッても
一応問題ないけど、可読性が悪くなっちゃうから)、別の名前を考えてるんだけど
なかなかいいのが思いつかない;
1と2の変数のいい感じの命名をおながいします!
>>874 A
1 $query
2 %query
B
1 $query
2 %data
C
1 $stdin
2 %query
D
1 $demand_query
2 %demand
あんまいいの浮かばないな。
やっぱフォームからクエリの方を統一して$buffer,%formとしたほうがいいと思う。
877 :
874:04/08/19 19:21 ID:???
>>875 可読性の問題で;わかりやすい変数名にしたいんだ。
>>876 オゥ!?thx!
$queryはわかりやすいね。Aを使わせてもらおうかな。
>>877 こういうやつに限って全体のアルゴリズムとかがなってねんだよな。
コンパイラから見た可読性も考えろよ。
>>878 言いたいことには賛成なんだが、コンパイラは読みやすさなんぞ
微塵も求めちゃいないし、アルゴリズムってのは個々の問題解決
方法を指すのであって、全体の構成や設計を指す場合には使わん。
自分のシステムがどのタイムゾーンに属していて、
GMT(UTC)とどのくらいの時差があるかを知るには
どうすればいいでしょうか?
Windows / UNIX 双方で共通に使える方法があれば
それでお願いします。
>>880 Time::Zoneでいいんでね? 例えば、
perl -MTime::Zone -e 'print tz_local_offset();'
→ 32400
perl -MTime::Zone -e 'print tz_name();'
→ jst
windowsでは使ったことないんで動くかどうか知らんけど。
882 :
nobodyさん:04/08/19 23:05 ID:TB99xw7G
>>882 とりあえずサブルーチンについて勉強しれ。
まあ簡単におしえてやると引数だ。
perl歴3ヵ月の初心者です。
UNIXコマンドの df -kを使って求めたハードディスクの容量(KByte単位)を
GB単位への変換方法がわかりません。
求めた値÷1024÷1024から、splintfで%4.1dとして表示させると
小数点以下が0になってしまいます。
1GB未満 (500KByte等) は0.5GBと表示させたいと思います。
贅沢をいえば、小数点以下第2位を四捨五入できればベストです。
どなたか、お助けください。
よろしくお願いします。
>>884 %dで小数が表示されるわけないだろう。
これ、どこかでも書いたな。