Perlコーディング初心者質問スレ Part 55
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/05/30(水) 11:34:01ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >>2-10
前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0380376
2007/07/05(木) 12:03:58ID:???どっちでも良いと分かって一安心。
前半同じ名前で後半の数字が違うだけ、って変数名が多いんで
調べる手間はそんなかなぁ、と思ってたけど、結局全部網羅するとなると
大して作業量は変わらないかな・・・。
>>378
それはムチャクチャ長くなりそうなんで、ちょっと勘弁w
アドバイス感謝!
0381378
2007/07/05(木) 12:15:33ID:???my ($authID, $authPASS, $authEXP) = qw(〜); # 認証関連
my ($htmlTITLE, $htmlSUBTITLE, $htmlCSS) = qw(〜);
のように似てるもの同士でまとめて書くのよ
0382nobodyさん
2007/07/05(木) 13:21:28ID:rw6MBlh965,536byteは60KB以上で間違いありませんか?
0383nobodyさん
2007/07/05(木) 13:23:29ID:???0384nobodyさん
2007/07/05(木) 13:49:32ID:rw6MBlh9答えたことはあるけどな。>>19と>>362の二回だけ。
もういいや。ありがとうございます。たしかGNOME電卓にそんな機能が・・・
0385nobodyさん
2007/07/05(木) 13:58:27ID:???our
0387nobodyさん
2007/07/05(木) 14:06:19ID:???0388nobodyさん
2007/07/05(木) 14:08:13ID:???0389nobodyさん
2007/07/05(木) 14:10:35ID:???>前半同じ名前で後半の数字が違うだけ、って変数名が多いんで
俺も変数名で悩んで、そういう名前をつけてしまうことがたまにあるけど、それはやめたほうがいい。
自分の頭の中でも整理がつかなくなってしまうから。
俺は実は、use strict;してないんだけど、変数名を整理して、局在化して書くことだけ気をつけていれば、
仕様書を書かなければ整理がつかないような大きなスクリプトを書くのならともかく、そんなに問題はないと思うけどね。
0390378
2007/07/05(木) 14:43:43ID:???と釣られてみる
0391nobodyさん
2007/07/05(木) 17:42:15ID:/MBCt40Zuse Benchmark;
sub test{ 色々 }
timethis(1,&test);
というplファイルをwinのcmdから実行させると、ちゃんとtest内に掛かれてる処理はされてるようなのですが、
timethis 1: 0 wallclock 〜
なんてことになってしまいます。timetheseでやるとちゃんと秒数が出てくるのに。thisだと出ない。
countを10回にしても実際には一杯時間掛かってるのに1分くらい待って出てくる表示は
timethis 10: 0 wallclock 〜
使い方間違ってますか?お助けくださいませ。
0392nobodyさん
2007/07/05(木) 22:09:43ID:???サブルーチンのリファレンスか
evalして実行できる文字列だけだにょ
0393391
2007/07/05(木) 22:56:26ID:/MBCt40Zopen FH,"bench.txt";
my @line = <FH>;
close FH;
sub test1{
my %get;
while (@line){
$csv->parse($_);my @fields = $csv->fields();
for (my$i=0 ; $i<=1 ; $i++){
$get{$fields[0]}->[$i] = $fields[$i];
}
}
}
sub test2{
my %get0;
my %get1;
while (@line){
$csv->parse($_);my @fields = $csv->fields();
$get0{$_} = $fields[1];
$get1{$_} = $fields[2];
}
}
timethese(100,{ PatternFast => 'test1', PatternSlow => 'test2',});
おかしいんです。今度はこれまでも0.00秒になってしまう。
どこをどう直せばいいのですか?
0394nobodyさん
2007/07/05(木) 23:33:45ID:???0.00秒になるのは分からんけど
無限ループだにょ
0395391
2007/07/06(金) 10:06:20ID:oyGEvxOpforeachと間違えました。すいません。危うく死亡するところでした。
benchの中で大助かりです。
ところで無限ループが始まった時って賢い対処法はありますか?
いつもはwindowsの終了をやってますが、タスクマネージャあけてアプリケーションの終了させればいいだけなのですか?
とりあえず問題は解決しました。benhの花井で卯s。
なんか数がすくないよってことだったらしいです。50000000とかにしたらようやく比較できました。
0396nobodyさん
2007/07/06(金) 18:49:11ID:???if($name eq ""){&er_("名前が未記入");}
if($name eq " "){&er_("名前が未記入");}
if($name eq " "){&er_("名前が未記入!");}
・
・
if($name eq "連続する半角全角スペースいっぱい"){&er_("名前が未記入!");}
とやっていくとキリがないです。
そこでパターンマッチ演算子というのを使ってみたのですが↓のであってますでしょうか?
if($name=~ /^ /){&er_("名前が未記入");}#半角スペースが先頭の時
if($name=~ /^ /){&er_("名前が未記入");}#全角スペースが先頭の時
とりあえず判定できてるっぽいですが
もっとスマートな方法があれば教えてください。
0397nobodyさん
2007/07/06(金) 19:01:01ID:???正規表現ド素人なんであんまり自信ない。
0398nobodyさん
2007/07/06(金) 19:03:58ID:???フォームに入力される文字がどういう文字なのか(2バイト文字とかを含むのか)とか、
スクリプト中での文字コードの扱いにもよると思うけど、古典的には以下の内容がかなり役立つかと。
http://www.din.or.jp/~ohzaki/perl.htm#JP_RmSpace
# 半角スペース
$space = '\x20';
# 全角スペース
$Zspace = '(?:\xA1\xA1)'; # EUC-JP
$Zspace_sjis = '(?:\x81\x40)'; # SJIS
0401nobodyさん
2007/07/06(金) 21:30:46ID:???&hoge($bar);
&hoge($bar{'id'});
&hoge($bar[0]);
sub hoge {
return $_[0];
}
真ん中の例のように、ハッシュを入れると値が帰ってきません。このような場合に、値を返すようにするには、どう記述するのが
一般的なのでしょうか?(試していませんが、一番下の配列の1要素を入れてもダメかもしれない?)
0402nobodyさん
2007/07/06(金) 21:36:05ID:???0403nobodyさん
2007/07/06(金) 21:46:38ID:???&hoge('hoge','hoge');
みたいに呼び出したときに、@_をshiftして呼び出すのはわかるのですが、同じ$_[0]で何故、$barの値は渡るのに、
$bar{'id'}の値は渡らないのでしょうか、という疑問です。
0404401=403
2007/07/06(金) 22:04:57ID:???問題は解決しましたが、>>401は依然疑問かも。恐らく
&hoge($bar{'id'});
でも
&hoge($bar[0]);
でも$_[0]に値は入ると思う(思いたい)という、もやもやは残りましたがw
0405nobodyさん
2007/07/06(金) 22:20:23ID:???> いつもはwindowsの終了をやってますが、タスクマネージャあけてアプリケーションの終了させればいいだけなのですか?
そんな面倒なことやってるんですか?
パソコンのコンセントを抜くだけですよ!
0406nobodyさん
2007/07/06(金) 22:36:49ID:???0407nobodyさん
2007/07/07(土) 00:38:24ID:???入力フォームを再度表示して、エラーのある箇所に赤文字でエラーメッセージを出力する。
この板的にはそういうスクリプト書くことが多いと思いますが、そういう場合に便利なモジュールなどはあるのでしょうか?
0410nobodyさん
2007/07/07(土) 09:38:06ID:???hiraZ2H(STRING)
hiraZ2H(SCALAR REF)
というのが出てきたんですけど使い方がわからないです
0411nobodyさん
2007/07/07(土) 10:04:34ID:???0412nobodyさん
2007/07/07(土) 10:33:19ID:???&jcode'z2h_sjis(\$foo);
で全角の$fooを半角にできました
でもひらがなをカタカナにしないと使えないです
0413nobodyさん
2007/07/07(土) 10:53:15ID:???print qq{$bar \n $bar{id} \n $bar[0]};
sakini kore yatte atai ga tyanto haitteruka checksitemite gomen ime okasiikara konnna kannji dakedo
0414nobodyさん
2007/07/08(日) 08:31:07ID:???print hira2kata_sjis("あめんぼ赤いなあいうえお");
exit;
BEGIN {
require 'jcode.pl';
my $from_code = 'sjis';
my $kata = 'ァ-ン';
my $hira = 'ぁ-ん';
jcode::convert(\$hira, 'euc', $from_code);
jcode::convert(\$kata, 'euc', $from_code);
sub hira2kata_sjis
{
my $str = shift;
jcode::convert(\$str, 'euc', $from_code);
jcode::tr(\$str, $hira, $kata);
jcode::z2h_euc(\$str);
jcode::convert(\$str, $from_code, 'euc');
return $str;
}
}
0415nobodyさん
2007/07/08(日) 11:06:02ID:???shift_jisで書かれたperlスクリプトをeucに変えてるのだけど、
文字コードをeucに変更して保存とjcode.plでshift_jisにしてる部分をeucに変更で
とりあえずは表面的には問題なさそうに見えるのだけど、ちょっと不安。
で、ここから質問なんだけど、他にやっておいた方がいい事とか注意する点とかってあるかな。
0416nobodyさん
2007/07/08(日) 11:22:52ID:???化石のようなライブラリを使わない
0417nobodyさん
2007/07/08(日) 11:31:27ID:???ぶっちゃけ、どんなスクリプトなのか、どういう人のアクセスを想定しているのか、
ぐらいの情報すら書かずに、ちょこちょこ後出しの駄レスが続くことに嫌気がさしてきた。
不特定多数の携帯からのアクセスがあるならUTF-8はまだダメだろうな。
まぁ、4、5年以上前の携帯だとそもそもEUCもダメなのあるけど。
0418nobodyさん
2007/07/08(日) 12:17:04ID:???utf8で書いてshiftjisで吐けばいいじゃん
0419nobodyさん
2007/07/08(日) 20:22:14ID:???utf-8はファイルサイズが増えるから・・・って思い込んでたけど思ったより増えないんだね。
これならそっちでも問題ないな。
どんなスクリプトとかアクセス方法によってそんなに変わるもの?
基本抑えておけば色々な場合に対応できると思ってたんだけど、
やっぱノウハウに違いが出てくるのかな。
ちなみにちょっとした掲示板系スクリプトとゲーム系スクリプト混ぜた感じの自作だったり。
アクセス数少ないし多分携帯も問題ない筈。
0421nobodyさん
2007/07/09(月) 06:10:18ID:???jcode.pl+EUCで書いてますがw
perlがいいのは、web上に情報が多いことで、さらに、ある程度化石級の書き方のほうが、
情報量が多くて便利なこともあるような。
0422nobodyさん
2007/07/09(月) 10:47:47ID:???古いライブラリだと新しい規格に対応してないなど不都合もある。
とりあえずjcode.pl+EUCでいいよ
0423nobodyさん
2007/07/12(木) 01:50:40ID:???2度目以降に動作しません。テスト用のpmファイルでは変数は一切使っておらず、
ただprint "test2"としているだけですが、最初の1回だけ出力されます。
main側もただtest1とだけ出力していますが、こちらは毎回出力します。
どのような原因が考えられましょうか。
0424nobodyさん
2007/07/12(木) 01:56:28ID:???見つかりませんでした…
どうかよろしくお願いしますm(_ _)m
0425423
2007/07/12(木) 02:01:32ID:???よろしくお願いします。
#!/usr/bin/speedy -w
use strict;
use warnings;
print "Content-type: text/plain; charset=utf-8\n\ntest";
require './lib/test.pm';
# test.pm
package test; print 'test2'; 1;
0426423
2007/07/12(木) 02:04:16ID:???http://72.14.235.104/search?q=cache:7-pqqTdFRYgJ:www.kent-web.com/perl/chap6.html+perl+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4&hl=ja&ct=clnk&cd=1&gl=jp
0429423
2007/07/12(木) 03:13:50ID:???関数だとちゃんと出力されました。
グローバル変数の初期化から前述のコードに迷い込んだのですが、
要するに初期化もパッケージの直下にour $a = 0なんて書くのではなく、
INITとか初期化用関数とかを用意しないとならないのですね。
グローバルという言葉をよく理解できてないようです。勉強します。
ありがとうございました。
0430nobodyさん
2007/07/12(木) 15:38:50ID:???http://www.au.kddi.com/test.cgi?atai=apple
のように、受け取った値を利用したURLにアクセスさせたいのですが、
今はやり方が分からずアンカータグを返して1クッション置いているのですが、ダイレクトで表示させるにはどのようにすれば良いのでしょうか?
よろしくお願いします。
0431nobodyさん
2007/07/12(木) 16:13:05ID:???それでダメならLocationなりで飛ばせばいいじゃない
0432nobodyさん
2007/07/12(木) 18:46:36ID:???文字コードをEUC-JPに変換して半角文字を全角文字に変換する場合、
&jcode::convert(\$value,"euc","","z");
これと
&jcode::convert(\$value,'euc');
&jcode::h2z_euc(\$value);
これは、
同じなんですか?
後者のはよく見かけるんですが、
前者のはあまり見かけないような印象があるんですが
何か理由があるのでしょうか?
0433432
2007/07/12(木) 18:51:01ID:qGszHv4Y質問なのにsageてしまったのでage直します。
0434nobodyさん
2007/07/12(木) 19:02:56ID:???もうね・・・
0435432
2007/07/12(木) 19:23:06ID:???&jcode::convert(\$value,'euc');
は
&jcode::convert(\$line, $ocode [, $icode [, $option]])
の第三と第四の引数(?)を省略した形ということですよね?
だとすると、なぜわざわざ省略したのに
&jcode::h2z_euc(\$value);
とするのかが理解できません。
最初から
&jcode::convert(\$value,"euc","","z");
で良いのでは?と思ってしまうんですが・・・。
0436nobodyさん
2007/07/12(木) 19:28:52ID:???0437nobodyさん
2007/07/12(木) 20:15:35ID:???ありがとうございます。
LocationはJavaScriptのことですよね?携帯端末向けなのでスクリプトは使用できませんm(_ _)m
GETで値を受け取って変数に入れて、それをアンカーで排出することまでは出来たのですが、
ダイレクトでの飛ばし方が分かりません…
0438nobodyさん
2007/07/12(木) 20:37:59ID:???0439nobodyさん
2007/07/12(木) 21:49:17ID:???複数あるダウンロード対象を複数選択し、
ダウンロードボタンを押したら順次ダウンロードできるようなものを作りたいんだが
1ファイルダウンロードするのは
print "Content-Disposition: attachment; filename=\"hige\.tar\.gz\"\n";
print "Content-type: application/octet-stream\n\n";
open(FILE, "hige.tar.gz");
binmode(FILE);
while(<FILE>){
print "$_";
}
close(FILE);
でいけるんだけど、複数ファイルとかどうやるか知ってる方いませんか?
0440nobodyさん
2007/07/12(木) 22:38:50ID:???複数のファイルをサーバで固めてから1回で落とすとか。順次というのは無理っぽい。
まあ、ふつう落とすファイルのリンクを並べたページをまず出力して、クライアント側で1つずつ
クリックして落としてもらうのが妥当なのでは?
それから、
while(<FILE>){
print "$_";
}
は
print <FILE>;
で済むよ。
0441nobodyさん
2007/07/12(木) 22:59:03ID:???0442nobodyさん
2007/07/12(木) 23:22:07ID:???ありがとうございます
固めるのも考えたんですが、素のtar.gzですでに1G超えファイルがあるので
別々にダウンロードしたかったんですね
#サーバが32bitなので最大6Gのファイルしか生成出来ない
そして、現状ひとつずつぽちぽち押してダウンロードする仕様なんですが
それがめんどくさいからまとめようぜ?見たいな乗りになった末での質問でした(_O_)
0443nobodyさん
2007/07/13(金) 00:21:04ID:???sysreadを使うのとreadを使うのでは、
一見、同じように見えますが、どういうときに違いますか?
お願いします。
0444443
2007/07/13(金) 00:34:18ID:???ttp://www.tohoho-web.com/lng/199907/99070330.htm
0445nobodyさん
2007/07/13(金) 02:24:03ID:???0446nobodyさん
2007/07/13(金) 04:18:38ID:???0447nobodyさん
2007/07/13(金) 07:42:31ID:???君が言う様な1GBのファイルを読み込んだらメモリが物凄いことになりそうだけどね
バッファを用意してsysreadとかsyswriteでチョコチョコ出す方が良いと思うのだけど
0448nobodyさん
2007/07/13(金) 19:25:41ID:rAe1S2vbモジュールとクラスの違いがよく分かりません。
クラスだとnewするので、その分メモリが多く使われるなど
メリット、デメリットってありますか?
0449nobodyさん
2007/07/13(金) 19:54:44ID:???0450nobodyさん
2007/07/13(金) 20:34:44ID:???モジュールは外部ファイルを読み込んで実行する機構の、外部ファイル。
クラスはオブジェクト指向プログラミングで使われる、データと操作手順をまとめて雛形にしたもの。
よって比較できない。
0451nobodyさん
2007/07/13(金) 20:53:17ID:rAe1S2vb共通部分はモジュールかクラスかにするんだな。と単純に考えていて
どっちがいいのかな?と思っていたのですが考え方が違うと。
クラスのほうがスッキリしそうですけど、遅いとかメモリ食うとか
あるのかなと思いました。
0452nobodyさん
2007/07/13(金) 20:55:36ID:???0454nobodyさん
2007/07/13(金) 22:59:52ID:???0455nobodyさん
2007/07/13(金) 23:02:35ID:???ApacheのモジュールもPerlで書けるとオライリー(Apache拡張ガイド 上)に書いてあったよ。
mod_perl云々言ってるんで、Apache解説本でも読んでるのかと思ったんで一応聞いてみたんだが。
0456nobodyさん
2007/07/14(土) 02:19:51ID:???たとえを出すと、自動車とタイヤキ型を比べてるようなものだから、
比較が出来ないという話。
それで、オブジェクト指向と非オブジェクト指向のどちらがいいかという質問か?
0457nobodyさん
2007/07/14(土) 07:44:47ID:???それって例えがちょっと違わね?
クラスの方は型っていうのはほぼ良いとしても、
モジュールは、部品の切り分け方(取り付け方)だから、例えで言えばネジ止めみたいな事じゃね?
つまり、
「鋳造型とネジ止めを比較するようなもので、鋳造された部品だってネジ止めする事はあるから比較できない。」
って感じじゃね?
0458nobodyさん
2007/07/14(土) 08:17:22ID:???こうやってぐだぐだになるんだよな
0459nobodyさん
2007/07/14(土) 13:05:26ID:???どうせ違うとしても大した差じゃない。見通しよく書けるかどうか
のほうが重要だよ。
0460nobodyさん
2007/07/14(土) 13:23:11ID:XODLozhP旧サーバでは動いているのが、新サーバでは以下のようなSocket接続でこけています。
$remote = IO::Socket::INET->new(Proto => "tcp",
PeerAddr => $server,
PeerPort => $port,
) || &error("error");
IO:Socket:INETD.pmを1行ずつ進捗printしてみたところ、コンストラクタ(sub new)の
「return $class->SUPER::new(@_);」で止まってしまいます(長い時間かかったあと"error"が帰ってくる)。
この$class->SUPER::new(@_);って親クラスのコンストラクタを
呼び出していると思うんですが、INETD.pmの親クラスって何になるんでしょうか?
perl初心者につき変なこと言ってるかもしれませんが、
よろしくご教授ください。。。
0461nobodyさん
2007/07/14(土) 13:40:14ID:???ソースを読んでuse baseか@ISAをいじってるところをさがす
or
そのパッケージの@ISA配列の値を調べる
0462nobodyさん
2007/07/14(土) 13:50:10ID:???0463nobodyさん
2007/07/14(土) 15:18:54ID:???>>451がどれだけドンチキな話をしてるのか理解してもらえればそれでいいのよ。
>>460
IO::Socketが親で、さらに上をたどるとIO::Handle。
0464460
2007/07/14(土) 15:20:34ID:XODLozhPありがとうございました。親クラスはIO:Socketでした。
今のところ、IO:Socket:connect()まで入ってきているのを確認できたので、
connect()の中を色々探ってみたいと思います。
(connectのどこかで止まっている状態)
0465460
2007/07/14(土) 15:24:56ID:???>>464
Hanndleとか行ったりきたりして、今のところ463のような状態なので
引き続き調べます。ありがとうございます。
0466nobodyさん
2007/07/14(土) 15:55:23ID:???0467トラハムちゃん
2007/07/14(土) 16:32:18ID:M6VlwpzHユーザーエージェントに「AAA」または「BBB」という文字が
含まれていなかったらエラーを表示したいと思っています。
if(not $ENV{'HTTP_USER_AGENT'} =~ /AAA/) {
&error("エラーです");
}
「AAA」だけでしたら作れたのですが、うまく「BBB」が追加できなくて困っています。
初心者なりにor等を使ってみても、入れ方が悪いのかうまくいきませんでした。
どなたかご教授いただければと思います。
よろしくお願いします。。
0468nobodyさん
2007/07/14(土) 16:35:18ID:???0469トラハムちゃん
2007/07/14(土) 17:14:18ID:M6VlwpzHできました!
ありがとうございました!!
助かりました!!
0470nobodyさん
2007/07/14(土) 17:54:00ID:???慣れないうちは、&errorとかサブルーチン作った方が、本人の!可読性がいいと思うし、
webprog的には、エラーが発生したときにブラウザに表示させることも多いので、別に構わないというか
俺はそうしてる。
特殊変数なんかも同じで、慣れないうちは使ってなかった。
foreach my $str (@hoge) { print $str; } みたいに。
0471460
2007/07/14(土) 18:53:18ID:???IO:Socket:connect()の↓のconnect関数から反応が返ってこないということが
分かりました。
if (!connect($sock, $addr)) { }
connect()関数を使うにあたって、
サーバ側で何か設定が必要だったりするでしょうか?
今回自宅サーバのため、同じcgiが動いているレン鯖と何か設定が
違うのかもしれないと思いまして。
もしくは、ポート開放関係?一応メールの110ポートはあけているんですが。。。
すみませんが、よろしくお願いします。
0473448
2007/07/14(土) 19:25:34ID:ybwwq6evその点が気になってたとこです。
実行効率か、可読性かみたいな。
ただ、どっちがどうかは良く分かってませんが。
すんません。
0474nobodyさん
2007/07/14(土) 23:24:23ID:???0475nobodyさん
2007/07/15(日) 00:16:49ID:tgDYqhX7普通にやるとアクセス元のcgiのあるフォルダにファイルが作られてしまいます。
ライブラリであるplのあるフォルダにファイルを作りたいのですが、
どのようにすればいいのでしょうか?
0476nobodyさん
2007/07/15(日) 00:32:58ID:???0477nobodyさん
2007/07/15(日) 00:50:43ID:???0478nobodyさん
2007/07/15(日) 02:37:03ID:???■ このスレッドは過去ログ倉庫に格納されています