Perlコーディング初心者質問スレ Part 45
■ このスレッドは過去ログ倉庫に格納されています
0001988
2005/12/08(木) 22:48:27ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0047nobodyさん
2005/12/12(月) 20:06:34ID:???http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-48,GGLD:ja&q=perl+%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA
0048nobodyさん
2005/12/12(月) 20:15:06ID:???0049nobodyさん
2005/12/12(月) 20:16:30ID:???危ない文字を潰すのではなく安全な文字列だけ取り出すのが基本。
http://www.ipa.go.jp/security/awareness/vendor/programming/a04.html
0050nobodyさん
2005/12/12(月) 20:24:48ID:???SJISでないコードを送りつけたのかどうやったのかは知らないけど。
0051nobodyさん
2005/12/12(月) 21:07:50ID:???Shift_JISの上位1バイトだけを送っても、そのまま表示されていた。
この状態では、次の1バイト分の文字は漢字の下位1バイトとして扱われる。
ここにタグの"<"や">"があるとタグが壊れる。
0052nobodyさん
2005/12/12(月) 21:32:13ID:???0053nobodyさん
2005/12/12(月) 22:25:19ID:???栄ttp://www.yahoo.co.jp/
とか入力すると化けちゃったりとか、結構ある。
0054nobodyさん
2005/12/12(月) 22:26:18ID:???0055nobodyさん
2005/12/12(月) 22:34:31ID:???0056nobodyさん
2005/12/12(月) 22:37:40ID:???一つは通信されるデータ量についてなのですが、
printで表示させたhtml分だけ通信されると考えていいのでしょうか?
つまりCGI内の変数に大量の文字列が入っていてもprintされなければ
通信されないのかということをお聞きしたいのです。
何故こんなことを聞くかというと携帯用に作っているのでパケット代が気になるからなのです。
もしCGI内のソース全てにパケット代が生じるのであれば、データは別ファイルにまとめようと思っています。
サーバーで動くCGIであると考えればhtml分だけだと思うのですが不安です。
もう一つあります。CGIは特別な処理をしなくてもダウンロードされる心配はないと考えていいのでしょうか。
つまり第三者にダウンロードされてソースが見られることがあるのか気になったのです。
分かり辛い質問かもしれませんがよろしくお願いします。
0057nobodyさん
2005/12/12(月) 22:39:12ID:???後者:パスワード等と記したファイルはドキュメントルートより上に置いた方が良い
0058nobodyさん
2005/12/12(月) 23:14:46ID:???ありがとうございます!
人に知られたくないものは上に置きますね。
0059nobodyさん
2005/12/12(月) 23:15:52ID:???速レス頂けたのにお礼の返事が遅れて済みませんでした。
0060nobodyさん
2005/12/13(火) 04:28:32ID:???$hoge->{'bar'}=$moge->{'bar'}と記述してしまって、左辺に
値でなくてリファレンスが入ってしまって泣きそうなんですけど、
例えばすべて$hoge{'bar'}[$i]といった多重配列のフォーマットにして
書き直したほうがいいのでしょうか。
0061nobodyさん
2005/12/13(火) 04:38:08ID:???>>1
1: 自分はこういう事がしたい。
何がやりたいのか書いとくれ。それによって適したやり方があるから
ただ配列をコピーしたいだけなら
@arr1 = @arr2;
でできるし、ディープコピーをしたいならCloneモジュールを薦めるし
0062nobodyさん
2005/12/13(火) 12:59:52ID:???一つ目:
否。クライアントからのリクエストパケットも通信量に含まれるよ。
あと、携帯だと、中継サーバが対象端末用に言語を変換している場合も。
でも基本的なことは >>56 のでOK。
0064nobodyさん
2005/12/13(火) 14:29:33ID:???0066nobodyさん
2005/12/13(火) 14:32:29ID:???006860
2005/12/13(火) 14:50:00ID:???再度出直してきますorz
どうにも強引ですが、内部のリファレンスをコピーしてしまっている
例を挙げます。
$hoge=[{'id'=>'65563','count'=>'11'},{'id'=>'87214','count'=>'14'}];
$moge=[{'id'=>'65563','count'=>'32'},{'id'=>'87214','count'=>'28'}];
@$hoge=@$moge;
$moge->[0]{'count'}=60;
print $hoge->[0]{'count'};
0069nobodyさん
2005/12/13(火) 17:44:46ID:???強引というか、それが普通の挙動で、リファレンスのいいところでもあるのに
ちなみに>60の「多重配列」もリファレンスだからね
0070nobodyさん
2005/12/13(火) 22:31:03ID:???my $cgi = new CGI;
if(param()){
if (param('save')){
print header(-type => "text/html",-charset =>"x-euc-jp" -cookie => param('test'));
}else{
print header(-type => "text/html",-charset =>"x-euc-jp");
}
printDump,start_html('test'),start_form,
"クッキーにデータを保存する",
submit(-name => '保存', -value => 'save');
end_form,end_html;
}else{
printheader(-type => "text/html",-charset =>"x-euc-jp"),
Dump,start_html('test'),start_form,
checkbox(-name => 'test', -value => 'test'),p,
submit,end_form,end_html;
}
0071nobodyさん
2005/12/13(火) 22:34:20ID:???親CGIでsubmitを押すと、子のCGIに親のフォームデータが送られますが、
その子CGIでsubmitを押すと、孫CGIには親のフォームデータが引き継がれません。
子CGIで、親CGIのフォームデータをhiddenfiledなどに入れれば良いのですが、
フォームデータが多い場合は少々煩雑になってしまいます。
何かスマートな方法がありましたら、ご教示願えますでしょうか。
0072nobodyさん
2005/12/13(火) 22:38:04ID:???false print header(-type => "text/html",-charset =>"x-euc-jp" -cookie => param('test'));
true print header(-type => "text/html",-charset =>"x-euc-jp", -cookie => param('test'));
false submit(-name => '保存', -value => 'save');
true submit(-name => 'save', -value => 'save');
以上、よろしくお願いします。
0073nobodyさん
2005/12/13(火) 23:29:21ID:???別スレにて、「」で囲まれた単語を抜き出してカウントするスクリプトの
ソースをいただいたのですが、
http://pc8.2ch.net/test/read.cgi/php/1133361560/116
これを数の多い順にソートするにはどう記述すればよろしいでしょうか?
0074nobodyさん
2005/12/13(火) 23:36:48ID:???元スレで既に回答されているが。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq4.html#how_do_i_sort_a_hash__optionally_by_value_instead_of_key_
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_sort_SUBNAME_LIST
007573
2005/12/14(水) 00:00:59ID:???74さん有難うございます!
0076nobodyさん
2005/12/14(水) 00:34:23ID:???#!/usr/local/bin/perl
use CGI qw/:standard Vars/;
my $charset = 'Shift_JIS'; my %param = Vars;
my($cookie, @form);
if ($param{'save'} eq 'save') { # 孫
$cookie = cookie(-name => 'test', -value => 'test');
@form = ('OK');
} elsif (keys %param) { # 子
@form = (
'Cookie に保存',
map(hidden($_, $param{$_}), keys %param),
submit(-name => 'save', -value => 'save'),
);
} else { # 親
my $name = 'a';
@form = (map(checkbox(-name => $name++, -value => $_), 1..5), submit);
}
print header(-charset => $charset, -cookie => $cookie),
start_html(-title => 'test', -encoding => $charset, -lang => 'ja'),
Dump,
start_form, p(@form), end_form,
end_html;
007776
2005/12/14(水) 00:39:21ID:???http://perldoc.jp/docs/modules/CGI-Session-3.11/Tutorial.pod
http://search.cpan.org/search?query=Session
0079nobodyさん
2005/12/14(水) 01:32:12ID:???おお!早くも神レス大変ありがとうございます。
あまりにもスマート過ぎて、素人な自分には謎の部分(特にVars)が多いのですが、
これから理解して、神コードを取り入れさせていただきます。
Vars はperldocを読んでも今ひとつ理解できなかったのですが、
こんなに便利なものだとは判りませんでした。
繰り返しになりますが、質問に答えていただいてありがとうございました。
0080nobodyさん
2005/12/14(水) 02:03:01ID:???http://search.cpan.org/~lds/CGI.pm-3.15/CGI.pm#FETCHING_THE_PARAMETER_LIST_AS_A_HASH:
0081nobodyさん
2005/12/14(水) 10:29:49ID:???ほとんどの本やwebにあるサンプル等はopenを使ってます。
sysopenのメリットはわかるのですが、デメリットとかあるのでしょうか?
それと何故、サンプル等はopenの方が多く使われてるのでしょうか?
0083nobodyさん
2005/12/14(水) 11:02:06ID:???いちいちフラグ用の定数を用意する必要もないから
openでできることをやる分には楽だよ。
sysopenじゃないと指定できないフラグの組み合わせが
あるからそういうときはsysopen使うけど。
0084nobodyさん
2005/12/14(水) 11:10:22ID:???話した人ってのは、メリットを話した上で勧めたんだろ?
だから、「sysopenのメリットはわかるのですが」と書いてある。
…で、>>81は多くがopenの方が使われてるのを疑問に
思ったんじゃないの?
あと、何故勧めないのか書かないと回答にならんよ。
>>81
漏れは>>83と同じようにフラグ用の定数用意がめんどう。
パイプ等はあまり使わないから、sysopenでも良いんだけどね。
008573
2005/12/14(水) 12:37:52ID:???sort { $b <=> $a }でソートされるのはわかったんですが、
どこに記述すればいいのかわかりません。
21行目に、sort {$b <=> $a} %count と書くと、ソートされた数字のみが表示されてしまいます。
0086nobodyさん
2005/12/14(水) 13:36:36ID:???sysopen()は環境によって使えなかったりするモードがある。
例えばWindows環境ではロック関連が使えないとか。
それを注意していれば特に問題はないよ。
>>85
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_sort_SUBNAME_LIST
> # this sorts the %age hash by value instead of key
> # using an in-line function
> @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
0088nobodyさん
2005/12/14(水) 21:24:43ID:S7xP2RtY全半角英数字・全角日本文字(ひらがな・カタカナ・漢字)以外の文字
が入っているか判定したいのですが、
そのための正規表現を教えてもらえませんか、文字コードはEUCです。
0089nobodyさん
2005/12/14(水) 21:49:35ID:???>8にあるサイトが詳しいので良く読むといいよ
0090本日@挫折90%
2005/12/14(水) 22:43:42ID:SzJP4ieY等勉強したのですが、perlプログラムのサンプルを見たのですが、
まったく桁が違うすごいプログラムでした、このまま本の通りに
覚えていけばいいのか、正直不安になりました、このまま、焦らずに
本書どおりに進めていいのでしょうか?
熟練した方もしいい教材などありましたら、参考におしえてください。
0091本日@挫折95%
2005/12/14(水) 22:45:21ID:SzJP4ieY0092nobodyさん
2005/12/14(水) 22:50:34ID:???バット二三回振って打てねーよとか言われても誰も相手しないよ
0093nobodyさん
2005/12/15(木) 00:33:35ID:???最初から全てを理解できる人が居たら、それは天才。
他人が書いたperlのソースをスラスラ読めるようになったら上級者。
(ピンキリあるし、神レベルのコードはそれはそれで読むのが難しい。)
0094nobodyさん
2005/12/15(木) 01:11:02ID:???文章(コード)中に知らない文法やら単語がいっぱいでてくるところだろうな。
わからないところはとりあえず飛ばせばOKくらいでやらないと
学校の勉強に慣れてきた人間には正直ツラいと思う。
0095nobodyさん
2005/12/15(木) 01:37:31ID:w2M1wJUgopenはパイプ文字による外部プログラブが実行可能です。
「ブラウザで入力した情報をformにて送信して、
その情報のファイル名を表示するなんてCGIを作った場合、
入力文字にパイプを混入されるとセキュリティ上危険(入力文字検査すればOK)」
が理由のアドバイスかもね。
0096nobodyさん
2005/12/15(木) 08:39:34ID:???{
local *FH;
-f $file or die "No such file.\n";
open FH, '<' . $file or die $!;
while (<FH>) { ++$count{$_} for 「 (.*?) 」/g }
close FH;
}
header(-charset => $charset),
start_html(-encoding => $charset, -lang => 'ja'),
table(Tr([ map td([ $_, $count{$_} ]), sort keys %count]) ),
end_html,
文中の単語の数を数えるスクリプトなんですが、
「x回以上出た場合はbgcolorをredにする」という風にしたくて、
if(5<$count{$_}){$bg="orange";}を追加して、
tr部分に{-bgcolor=>$bg}を追加したんですが、上手く変わってくれません。
どなたかご教授お願い致します。
0097nobodyさん
2005/12/15(木) 08:43:28ID:???009896
2005/12/15(木) 08:45:17ID:???CGI.pmっていうのがそもそも何なのか・・・
0100nobodyさん
2005/12/15(木) 09:30:08ID:???いくらPerlでもこんな自由な書き方できないだろ?
0101nobodyさん
2005/12/15(木) 11:20:29ID:???こっちのスレから誘導されてきたやつだ
0102nobodyさん
2005/12/15(木) 12:17:37ID:???{
local *FH;
-f $file or die "No such file.\n";
open FH, '<' . $file or die $!;
while (<FH>) { ++$count{$_} for 「 (.*?) 」/g }
close FH;
}
if(5<$count{$_}){$bg="orange";}
header(-charset => $charset),
start_html(-encoding => $charset, -lang => 'ja'),
table(Tr([ map td({-bgcolor=>$bg},[ $_, $count{$_} ]), sort keys %count]) ),
end_html,
こんな感じで書きました。
>>100
for 「 (.*?) 」/gのほうは問題なく動作してます
0103nobodyさん
2005/12/15(木) 13:38:24ID:???while (<FH>) {...}を抜けた直後は$_はundefになってる筈なので、
そこで
if(5<$count{$_}){$bg="orange";}
などとやっても意味がない。
直し方としては、どれか一つでも5を超えたら全部色をかえたいのか
5を超えたやつだけ色を変えたいのかで違ってくるが、説明が不明瞭
なのでなんともいえんな。
0104nobodyさん
2005/12/15(木) 13:49:29ID:tLuO4r1h$string =~ s/\r//;
$string =~ s/\n//;
という処理をしたら
出力したときに#2#の結果になります。
1行目は確かに文字列から改行が取り除かれていますが、
3、4行目は変わっていません。
すべてに対して改行を取り除く方法ってありますか?
# 1 ####################
お願いします
おねがいします
本当
おねがいします"
########################
# 2 ####################
お願いしますおねがいします
本当
おねがいします
########################
0105nobodyさん
2005/12/15(木) 13:52:52ID:???0106nobodyさん
2005/12/15(木) 13:55:39ID:???0107nobodyさん
2005/12/15(木) 13:59:42ID:???0108nobodyさん
2005/12/15(木) 14:01:43ID:tLuO4r1hできました。
ありがとうございます!!!
0109nobodyさん
2005/12/15(木) 14:10:23ID:???できれば5区切りで色を変えたいと思ってます。
10以上黄色、15以上オレンジ、20以上赤みたいな感じです。
お手数ですがお願いします。
0110nobodyさん
2005/12/15(木) 14:15:52ID:???0112nobodyさん
2005/12/15(木) 14:31:42ID:???わかりました。有難うございました。
0113nobodyさん
2005/12/15(木) 15:19:56ID:tLuO4r1helse {if ($csv) {$csv_data .= '0,';}}
formから渡された「どのようにして」に”インターネット”というキーワードが入っていた
場合、1というデータをCSVファイルに挿入したいんですが、
どうやら、上の記述に間違いがあるみたいです。
記述ミスありますか?
0114nobodyさん
2005/12/15(木) 15:23:56ID:???0115nobodyさん
2005/12/15(木) 15:26:36ID:tLuO4r1h使ってますねwww
どうすればいいのかな?対処方法知ってたら教えてください
0116nobodyさん
2005/12/15(木) 15:29:56ID:???/\Qインターネット\E/
http://perl.misty.ne.jp/meta.html
0117nobodyさん
2005/12/15(木) 15:34:15ID:tLuO4r1hサンクス。 htmlからフォーム渡すとき
この部分だけ valueを 日本語から 数字に変えて渡したら上手くいったよ。
SHIFT JISややこしいね。
0118本日@挫折0%
2005/12/15(木) 18:44:33ID:3wI62WI7今後ともよろしこお願いします。
0119nobodyさん
2005/12/15(木) 21:41:38ID:???0120nobodyさん
2005/12/15(木) 22:02:39ID:???0121nobodyさん
2005/12/15(木) 22:26:35ID:???はいはい、ここまでカット
0122俺の日記@パールちゃん
2005/12/15(木) 23:41:06ID:3wI62WI70123nobodyさん
2005/12/15(木) 23:46:19ID:???=cut
0124nobodyさん
2005/12/16(金) 00:03:04ID:???最強
0125nobodyさん
2005/12/16(金) 01:21:20ID:???0126nobodyさん
2005/12/16(金) 03:05:21ID:???0127nobodyさん
2005/12/16(金) 05:31:09ID:nqW99XKPヒアドキュメント使うとソースが見づらいorz
0129nobodyさん
2005/12/16(金) 18:01:05ID:???0130nobodyさん
2005/12/16(金) 18:09:46ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perltrap.html#C_Traps
0131cbi-cgi/count/dayx.cgi?gif
2005/12/16(金) 19:52:49ID:u8eearJF0132カウンター2日目
2005/12/16(金) 19:58:13ID:u8eearJF.txtに変換
16<>1000<>2000<>3000<>fri<><>
0133nobodyさん
2005/12/16(金) 21:22:32ID:Nkz0ct/3その際リンクを、順番ではなくランダムで表示するようにしたいんです。
それぞれのページで、重複したリンクが表示されないようにしたいのですが、
具体的にどのようにコーディングすれば良いのでしょうか?
0134nobodyさん
2005/12/16(金) 21:26:03ID:???0135nobodyさん
2005/12/16(金) 21:30:13ID:???0136nobodyさん
2005/12/16(金) 21:43:16ID:Nkz0ct/3それをパラメータとしてURLに含めるといった感じの処理でいいんでしょうか?
0137nobodyさん
2005/12/17(土) 00:09:34ID:???それを順番に出力すりゃいいんじゃね?
参考になるかわからんが、こんなんどうよ
@array=();
for ($count = 0; $count < 7; $count++) {
push(@array,$count);
}
&shuffle (\@array);
sub shuffle {
my $array = shift;
my $i;
for ($i = @$array; --$i;) {
my $j = int rand ($i + 1);
next if $i == $j;
@$array[$i, $j] = @$array[$j, $i];
}
}
0140nobodyさん
2005/12/17(土) 18:08:47ID:???2.ページ移動用のスクリプトを用意して、ページ移動用のリンクに全部埋め込む
3.SSIを利用して、リンクの部分を別ファイルで用意する
一定時間ごとに混ぜるのなら3.でもいいけど、
訪問者ごとに違う順番を見せるのなら3.は向かない。
2が一番無難。
って答えでいいかしらん。
0142nobodyさん
2005/12/17(土) 21:16:26ID:6Cij4iqn戻ったりすると「有効期限切れ・・・・」という画面がでますが
そういう仕組みってどうすればいいんですか?
perlからすこしそれた質問かもしれませんが教えてもらえませんか?
0144nobodyさん
2005/12/17(土) 21:51:48ID:???アップロードされたファイルの、保存される前のファイル名の取得方法をおしえてください。
おねがいします。
0145nobodyさん
2005/12/17(土) 22:07:09ID:???観察してみろと。
0146nobodyさん
2005/12/17(土) 23:16:57ID:???0147nobodyさん
2005/12/18(日) 03:17:23ID:3ossMEQR警告 : ページの有効期限切れ
が出ます。
少し調べてみたところ、入力フォームがあるとこうなるらしいですね。
入力フォームを残したまま、エラーを出させないようにすることは出来ないでしょうか?
よろしくお願いします。
■ このスレッドは過去ログ倉庫に格納されています