【Perl】初心者コーナー Part16
■ このスレッドは過去ログ倉庫に格納されています
00013PIO ◆3pIoOHKo
02/09/15 15:11ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 6 (その2)
http://pc.2ch.net/test/read.cgi/php/1025930486/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
010398
02/09/18 00:04ID:P3Sos/ey教本に付属しているCDのサンプルCGIはきちんと動作しています。
が、まったく同じ内容の私の作ったCGIはエラーになってしまうのです。
保存時の文字コードによっては文字化けして表示されたりもするので文字
コードではないかと思うのですが、いろいろな文字コードで保存していま
すがどれもうまく作動しません。
原因は他にあるのでしょうか?
010598
02/09/18 00:17ID:P3Sos/eyうーん、何回も見直してみたのですが……。
全角、半角も見直してみましたが間違ってはいないようです。
文字コードは関係ないのでしょうか?
010798
02/09/18 00:22ID:P3Sos/eyはい、比べて見ました。
どっちも1342バイトでした。
もしかしてもっと根本的な何かなんでしょうか?
Apacheを再インストールしてみます。
……普通は有り得ない現象なのでしょうか?
010998
02/09/18 00:30ID:P3Sos/ey>>108
同じ名前で試してみました。
やっぱり動作しません。
キャッシュっていうのは、インターネット一時ファイルを削除すると言うことでしょうか?
011098
02/09/18 00:37ID:P3Sos/eyもう眠るので落ちます。
ご意見ありがとうございました。
0111nobodyさん
02/09/18 01:20ID:8kqybO5Fの排他制御を使わせてもらおうと思っているのですが
return \%lfh if (time - $1 > $lfh{timeout} and
rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time));
last;
ここの部分がいまいち何をしているのかわかりません。
特に\%lfhというエスケープ演算子の後のハッシュはどういう意味なんでしょうか?
0113111
02/09/18 02:27ID:8kqybO5Fありがとう!少しスッキリしました。
0114nobodyさん
02/09/18 04:11ID:???サンプルのディレクトリにはjcode.plがあるが、
キミのディレクトリには無い。
とか、
キミのファイル名が日本語だから(XP上で日本語じゃダメなのかは不明)
とか。
0115nobodyさん
02/09/18 08:56ID:4xK36YHqコマンドプロンプトで
perl -cw filename.cgi
しろ
0116nobodyさん
02/09/18 09:45ID:04tSnTX3やりたいのですが、特定の環境・ホストの組み合わせによっては
出来ない場合があります。
ログインまでは出来るのですが、なぜかリスト取得(nlst)や
ファイルのput・getができません(pwdやcwdはできます…)。
エラーが出るわけではなく、タイムアウトしてしまいます。
どうすればいいでしょうか。以下、ソースです。
#ここから
use Net::FTP;
$ftp = Net::FTP->new($ftphost, Debug => $ftpdbg, Passive => $passive)||die "Net::FTP FAILED";
$ftp->login($ftpuser,$ftppass);
$ftp->ascii();
$ftp->cwd("web/cgi-bin");
@files = $ftp->dir();
print join("\n",@files)."\n\n";
#ここまで
このソースを別環境で試してみたところ、問題無く
動きました…。ちなみに、当方LANからのADSL接続です。
0117nobodyさん
02/09/18 10:21ID:???0118116
02/09/18 10:54ID:04tSnTX3接続先のftpサーバはPassive->0にしないとつながらないのです。
pasv()はPassiveに移行するコマンドですよね?
もしかしてデータポートの問題でしょうか。コマンドは
通るけどデータの受け渡しが出来ないので…。
011942=69
02/09/18 13:38ID:g3HNafQf0120nobodyさん
02/09/18 14:00ID:CaL1DwkZ-values=>['M', 'F'],
で
%labels = (M => '男', F => '女', ) ;
じゃだめなの。
0121nobodyさん
02/09/18 16:34ID:???まず、PASV モードにする事で何が変わるか理解してる?
ttp://www.atmarkit.co.jp/fnetwork/rensai/netpro11/netpro01.html
実験結果を理解する為には、条件について理解してる必要があるよ。
0122nobodyさん
02/09/18 19:54ID:???他のFTPクライアント(何でもいい)はその動かない環境で
PASVモードを使わないで接続できているのでしょうか?
データポートの問題には違いないけど。
0123nobodyさん
02/09/18 23:45ID:z0adaCjsif文で試してもどちらも同じような挙動をします。
&&、||は数値比較ということのようで、解説サイトで
if(($a==2) && ($b==2))
というような例を見ましたが、($a==2)は数値を返すのでしょうか。
print (1==1); ###1を出力
print (1==2); ###なにも表示されず
よくわかりません。よろしくお願いします。
0124116
02/09/18 23:54ID:hRbwuJFLnetpro01.html読んできました。ということは
Firewallの内側からftpする場合はpasv()する
ということですね。なるほど。
>122
他のFTPソフトでも、その動かないFTPサイトにはpasvか否かを問わず
同じ状況(ログインできるけどnlstやput・getができない)です。
それもそれで困っているのですが。仕方なくtelnetでつないで1ファイル
ずつftpしてます。
状況としては「クライアント→サーバはOK、サーバ→クライアントだと
データポートが食い違っている」ということ? なのかな。
0125nobodyさん
02/09/19 00:25ID:qg0OuaDdといったフォーマットのcsvファイルを読み出して、もし上下(下の行)の
文字列2と数値1が同じならば、別のcsvファイルに”上下”の
文字列1と当然ながら、同じ値の文字列2、数値1を出力するのはどうやればよいのでしょうか。
(csvファイルの入力、出力は大体分かっているつもりです。内部的な処理が分かりません)
また、仮に上下の文字列2、数値1が合わない場合(行自体が奇数だったりした場合)
文字列3、数値2を上下で比べて同様の事をしたいのですがこの方法も分かりませぬ。
よろしくお願いします。
0126125
02/09/19 00:29ID:qg0OuaDdAAA1,ABC,123,DEF,456(改行)
AAA2,ABC,123,DDD,444(改行)
というcsvファイルがあったなら、別のcsvファイルに
AAA1,AAA2,ABC,123
というのを出力したい、という意味です。
また、
AAA1,ABC,123,DDD,444(改行)
AAA2,ADD,777,DDD,444(改行)
ならば、同様に、別のcsvファイルに
AAA1,AAA2,DDD,444
というのを出力したいということです。
よろしくお願いします。
0128nobodyさん
02/09/19 03:24ID:???&&と&、|と||が同じ挙動なんてことはない。
&&は左と右の条件が両方成り立ったとき真、
||は左と右の条件が少なくとも一つ成り立ったとき真。
真てのは1を返し、偽は0を返すから条件が成り立たなければ
上の論理演算子を評価したとき、1が出てきたり0が出てきた
りするのは当然。こいうのは戻り値という。
0130nobodyさん
02/09/19 03:52ID:???こいうことかな?
while(<>){
chomp;
split /,/;
if ($o1 eq ($f1 = $_[1]) && $o2 == ($f2 = $_[2])) {
print "$o0,$_[0],$_[1],$_[2]\n";
} else {
print "$o0,$_[0],$_[3],$_[4]\n" unless $. == 1;
}
$o0 = $_[0];
$o1 = $f1;
$o2 = $f2;
}
0131nobodyさん
02/09/19 05:08ID:Ab8J7aLwあのよ、プログラムの質問なんだから無理に文章にしないで
・プログラム概略
プログラムの説明、使用目的など
・環境
OS、使用アプリ、関連アプリなど
・入力
データ入力の方法、データ形式など
・処理
プログラム内で行うデータ加工、計算、アルゴリズムなど
・出力
出力データ形式、出力先など
・問題点
不具合の説明
・自分なりの解決法(試したもの)
自分で試した方法
・ソース
問題となっているプログラムソース
このくらいの箇条書きに整理して質問しろよ。書いてるうちに問題が解決する
場合もあるだろ。
どうも、解り辛い書き込みが多いよ。
0132nobodyさん
02/09/19 06:51ID:???if($a eq '1' && $b eq '1'){
print "$aと$bが1なので表示しました。";
}
if($a eq '1' || $b eq '1'){
print "$aか$bが1なので表示しました。";
}
こんな感じ。
0133nobodyさん
02/09/19 10:58ID:IJ0KtDTA$day = sprintf("%02d",$day);
これを実行すると$dayが03になることはわかったのですが、
「%02d」の「2」は何を意味していますか?
0134nobodyさん
02/09/19 11:20ID:???ビット演算とか比較演算って知ってる?
解説書でも読めば必ず書いてあると思うんだが。
とりあえず出てきた演算子のperlでの分類と意味を書く。
・比較演算子
== 等しければ真、そうでなければ偽
・ビット演算子
| ビット演算した論理和(OR) (ex. 2|5 -> 7)
& ビット演算した論理積(AND)(ex. 2&5 -> 0)
・論理演算子
|| 真偽の論理和 (ex. 2||5 -> 2)
&& 真偽の論理積 (ex. 2&&5 -> 5)
ビット演算はその名の通りビットごとの演算がされる。
論理演算は、perlではundef,0,""以外は全て真なので
||なら最初の真の値、&&なら最後の真の値になると思って良い。
>>124
その状況でPASVが使えないならFTP接続は無理。
FW管理人と相談してね。
0135nobodyさん
02/09/19 11:24ID:???>>133
二桁の意味。
ちなみに%02dのそれぞれに意味がある。
% フォーマットを指定するよ宣言
0 隙間は0で埋めてね
2 2桁より少ないときにね
d 10進整数で表記してね
0136nobodyさん
02/09/19 11:34ID:???漏れはこう解釈したが
open O1, ">1.txt";
open O2, ">2.txt";
while(<>){
chomp;
split /,/;
if ($o[1] eq $_[1] && $o[2] == $_[2]) {
print O1 "$o[0],$_[0],$_[1],$_[2]\n";
} elsif ($o[3] eq $_[3] && $o[4] == $_[4]) {
print O2 "$o[0],$_[0],$_[3],$_[4]\n";
}
@o = @_;
}
0137nobodyさん
02/09/19 11:38ID:???詳しい解説ありがとうございます。
0138&&と||の質問者
02/09/19 18:03ID:???>>134さんの例で理解できました。
単に真偽を取り扱う場合は&&でも&でも同じということですね。
0&1 はビット比較で0=偽
0&&1 論理演算で0=偽
0139nobodyさん
02/09/19 19:04ID:???でも普通、真偽判定にビット演算子は使わない。
その文で何の処理をしているか読み下しにくくなるからね。
あとこういう場合、&& より and、|| より or を使う癖をつけとくと
後々幸せになれるかも知れない。数値として比較する時は
==、文字列として比較する時は eq、という区別もはっきり
させとくと尚良し。
$a = 0; $b = 1;
if ($a = 1 and $b == 1) {
print "$aと$bが1なので表示しました。";
}
$a = 0; $b = 0;
if ($a == 1 or $b = 1) {
print "$aか$bが1なので表示しました。";
}
0140nobodyさん
02/09/19 19:10ID:???一応つっこんでおくと、下から3行目=が1個足りない。
0141nobodyさん
02/09/19 19:11ID:???それで昔失敗したんだよなぁ。
懐かしい。
0142nobodyさん
02/09/19 20:16ID:???よく見よう。上の条件文は ($a = 1) && ($b == 1) と等価、
下の条件文は ($a == 1) || ($b = 1) と等価だ。
つまり代入の結果の値をそのまま条件に使っている。(w
&& と || は代入演算子より優先順位が高いが、
and と or は低いから括弧が不要。
0143nobodyさん
02/09/19 20:17ID:???それだと、print文の内容が不自然なんだが?
0144518
02/09/19 20:32ID:???$a = 0; $b = 1;
# $a = 1 で $a の値は 1
# ($a = 1) の式の値は 1 で真なので and の右の式も評価する。
# $b == 1 は真、両方真なので if ブロックに入る。
if ($a = 1 and $b == 1) {
# 条件文を解釈した時点で $a = 1, $b = 1
print '$a と \$b が 1 なので表示しました。';
}
$a = 0; $b = 0;
# $a == 1 は偽なので or の右の式も評価する。
# $b = 1 で $b の値は 1
# ($b = 1) の式の値は 1 で真なので if ブロックに入る。
if ($a == 1 or $b = 1) {
# 条件文を解釈した時点で $a = 0, $b = 1
print '$a か $b が 1 なので表示しました。';
}
0145nobodyさん
02/09/20 03:12ID:tkLzuZ53アスキー配列ではなくて日本語辞書(?)の並びで簡単に扱う方法はありませんか。
たとえば、
あアいイ〜かカがガきキぎ〜(空文字が最後)
みたいな感じです。
普通にperlで並べたデータベースをexcelで編集して並べなおすと辻褄が
合わなくなってしまいます。
よろしくお願いします。
0146nobodyさん
02/09/20 05:51ID:???有名どころでは、
豊島正之sortf、http://www.asahi-net.or.jp/~ez3k-msym/archive/archive.htmには、益山って人のsortlもあるね。
Perlのライブラリではないんかい。
googleでPerl、辞書順ソートで調べたんだけど、
fj.cmp.lang.perlでそんな話し合ったみたいだけどその記事に行き当たらない。
JCPANがほしいね。
0147116=124
02/09/20 11:07ID:???設定を一部解除したらFTPできるようになりますた。
♪勉強に〜なりましたっ。
0148nobodyさん
02/09/20 14:58ID:???ご回答ありがとうございます。
僕も調べてみたんですが、見つかりませんでした。
自分で辞書順配列作ってやるしかないのかなあ。
やってみます。
0150nobodyさん
02/09/20 16:06ID:???超素人なので、僕の作ったものは役立たずだと思いますw。
とりあえず比較だけで、&jcomp($a,$b)が1,0,-1を返す関数から初めてみます。
使ったことないから期待通り動くかしらないけど。。。
http://homepage1.nifty.com/nomenclator/perl/Lingua-JA-Sort-JIS.html
とかは?
で、sortで調べらたら出てきただけだったり
ちょっと興味>JCPAN
0156nobodyさん
02/09/20 19:00ID:VWOOYV2pあるスクリプトの負荷軽減をしたいのです。
一般論として、
1.コメントを削除するのは軽減につながる?
2.処理はなるべくサブルーチン化するほうが負荷が軽減する?
3.サブルーチンは別ファイルにしてrequireするより、1ファイルにしたほうが負荷軽減になる?
その他負荷軽減のセオリーなどあるのでしょうか。
ポインタなど教えていただければ幸いですm(_ _)m
2 - × ケースによって異なるけど、サブルーチンかすると付加は重くなる。
ただし不可の為だけにインラインかを進めるのはナンセンス。
3 - △ ケースによる。大量の「プログラム開始時には必要かどうか分からない処理」がある場合は別ファイル化したほうがいいこともある。
負荷軽減で重要なのは上記のような小細工よりもアルゴリズムだろうね。
あとはPerl以外の言語を使うとか。
すべての処理を1つのCGIで済ませるタイプのプログラムだと
適当なとこでぶった切って適当なところでrequireするように
するだけでずいぶん効率UPできると思われ...
0160nobodyさん
02/09/20 20:44ID:???0163nobodyさん
02/09/20 21:07ID:???メモリとか…
実際に別けてベンチ取ると処理時間が倍近く遅くなるんだけど。
本当に滅多に使わないような部分(管理モードとか)ならともかく
ファイルサイズが巨大にならない限りは極力別けないようにしてた。
関数化できる部分も展開した状態で書いた状態をさしてました。
>>163
それが本当だと
AutoSplitとAutoLoader使って書かれてる
CPANモジュールって多数ありますけど、
あえて効率悪くしてるのでしょうか?
CPANのも「なんでこの程度でAutoLoader使ってるの?」ってモジュールばかりだよ。
1回の起動でよばれない部分が大半なきもするんですが...
またCPANモジュールの場合、モジュールがモジュール呼んで
って繰り返す場合がおおいので、AutoLoaderなかったら
それこそ無駄なコンパイル、無駄なメモリがたっぷりなきがします
#具体例もなしに不毛なきがしてきた...
0167nobodyさん
02/09/20 23:10ID:???ただ、この場合は一つのファイルの一度のコンパイルで全てが終わるって事も
わかる。
処理してからコンパイルするんじゃなくてコンパイルしてから
処理するんでしょ?
って事はコンパイル後に外部を呼んだら外部もコンパイル、又は
全てを再コンパイルって事にはならんの?
(useは最初によまれちゃいますけど...)
むちゃくちゃ強引な例)
if(1){
require "a.pl";#ここに遷移したとき初めてコンパイルされる
}else{
require "b.pl";#つまりこっちはコンパイルされない
}
ちがいましたっけ?
(AutoLoader簡易版の一例)
sub AUTOLOAD {#定義されていない関数があると呼ばれる
my $file = $AUTOLOAD;
$file =~ s!::!/!g;
if(eval{require "$file.pl";}){
die('ダメっぽい')if($AUTOLOAD{$file});
$AUTOLOAD{$file}=1;
return &{$AUTOLOAD}(@_);
}
return undef;
}
とかしてあげると、ある関数が呼ばれたとき
初めて読み込んでコンパイルされ、
2回目以降は関数が存在するので
AUTOLOADは呼ばれないって動きになるものだと...
#突っ込まれるとなんか自身がなくなってしまう^^;
0170nobodyさん
02/09/20 23:41ID:???0171nobodyさん
02/09/20 23:42ID:???require "a.pl";#ここに遷移したとき初めてコンパイルされる
}else{
require "b.pl";#つまりこっちはコンパイルされない
}
動かなきゃそこに行くことは分からないんでしょ?
動くならそもそもコンパイルの必要が無いと思うんだけど。
0172171
02/09/20 23:45ID:???ただ、コンパイル>requierがあった>コンパイルって二度手間に
なるんじゃないかと言ってるわけで。
0173nobodyさん
02/09/20 23:58ID:???コンパイルをYO-
2段階でやってるからYO-
2度手間にはならねーYO!
それはもちろんそう。というか、そうじゃなきゃAutoLoaderの実装に苦労するよ…
で、内部のpp_requireのコード読んでたら妙なことみっけ
#!perl -w
sub Loader::new{
return bless{}, $_[0];
}
sub Loader::INC{
my($self, $file) = @_;
print "ファイル $file が要求されました\n";
return "/path/to/$file.pm"; # フルパスを返す
}
@INC = (Loader->new());
require foo;
__END__
こんなの何処かに書いてあったっけ?
INC()の挙動が妙なんで実験機能かなぁ。
0179156
02/09/21 03:05ID:mTosX4PH勉強になります。
ちなみにわたしのスクリプトは書いてあるルーチンをか必ずすべて使うスクリプトなので
1-3すべて無意味っぽいですね。
アルゴリズム見直しかあ。手に負えなそうtt
奇特な方がソースみてくれるの期待して公開してるスクリプト晒しときます。
http://tokada.s19.xrea.com/
今負荷率みてみたらあほみたいなアクセスは減ってるみたいで、
負荷も落ちついてるみたいですが。
0181156
02/09/21 04:22ID:???感謝です。
http://olive.zero.ad.jp/~zbk52224/files/Random2ch-0-2-1a.zip
にzipもあります
0183156
02/09/21 04:42ID:???もしよければ、改変したものを公開していただけるとうれしいです。
勉強になるしw
1.不要なコード,極端なコメント,不要な変数、ループの削除
2.局所化されてない変数ありません?(不確か)
3.関数内での定数の宣言,requireの廃止
4.Random2ch.pl,linksFromHtml.plの統合
5.インデントの調整
すると、もちっとよさげかなぁ?とかおもいますが、
Socket周りをちゃんとするのはえらいと思う
毎回HTTPのリクエストしないで、
解析結果を保存しておいて、一定期間内のアクセスであれば
保存したデータを使うようにするだけで、
結構スピードアップしそう。
ネットワークの開くのって結構コスト高いっすよね?
って感じかなぁ?
おやすみなさい。
 ̄ ̄ ̄V  ̄ ̄ ̄ ̄ ̄ ̄ ̄
.∧∧ エビフリャー
,.、,(゚Д゚ ) /i
;'`;、. :,.:∪`゙:゙:`''':,'.´ -‐i
'、;:.: .、.:',.: .:: _;.;. :.‐'゙゙~  ̄
`` U U
0187156
02/09/21 06:53ID:???なるほど参考になります。
ソースを再検討してみます。
>>185
たしかにbbsmenu.htmlは"比較的"静的なので1日ごとの更新でもいいかもしれませんね。
subback.htmlはどうしよう。更新時間の匙かげんが難そう。
まあどちらも
ファイルがない||更新時間以前のファイルがある場合、HTTPリクエストしてlocalに保存する。
そうでない場合localのファイルに対して処理する。
ってかんじですかね。
>>186
おやすみなさい^^
0188nobodyさん
02/09/21 06:59ID:???0190182
02/09/21 10:28ID:???とりあえずコードをまとめ直しただけですが。
http://boobar.hoops.ne.jp/Rand2ch/Rand2ch_0.2.1a.txt
connectの回数減らさないと体感できる遅さの原因になりやすいので
KEEP-ALIVEとかちゃんと使わないとまずそうですね。
0192nobodyさん
02/09/21 11:38ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0193156
02/09/21 11:53ID:???。。。。。。。。。
すげーーーーー
あまりのエレガントさにびびりました。
わたしの元ソースと比べるべくもないですな。
ハハハハハハハハ
めちゃくちゃ示唆に富んでるソースだし。。。。
ただ私のPerlへの理解度が追いついてない部分があるので、ラクダ本と突き合わせながらじっくり読ませてもらいます。
ここに質問してよかったです。
ありがとー
#こんな時に明日からしばらく出かけなくちゃいけないtt
#どっぷり漬かりたいのにtt
0194156
02/09/21 12:02ID:mTosX4PHおはよーございますw
KEEP-ALIVEですか。ほうほう。
はじめて聞きます(汗
字面からは、一度ソケットひらいて通信してそのまま次の通信をするって感じとか想像するんですが、
大外ししてるかな。。。。
資料あさりたいですが、後日ってことになりそうです。
すみませんtt
0195nobodyさん
02/09/21 12:57ID:/+fRFKXb正しく動きません。見てもらえませんでしょうか・・・
require "./jcode.pl";
open(IN, "aaa.txt");
$xxx = <IN>;
close(IN);
&jcode'convert($xxx,'sjis');
open (FILEOUT, ">aaa.txt");
print FILEOUT $xxx;
close (FILEOUT);
0196nobodyさん
02/09/21 13:00ID:???0197195
02/09/21 13:40ID:/+fRFKXb無事解決できました。ありがとう!
0198nobodyさん
02/09/21 13:41ID:???0199nobodyさん
02/09/21 14:02ID:???ぼく小学生だけとPerlのことはなんでも聞いてよ!
0200どうにかして
02/09/21 14:15ID:???俺のサイトは全てCGIを経由しないと表示できないようにしてる
リモホしだいでどんなページにでもジャンプさせてるぞ
56 名前:Name_Not_Found :02/09/14 12:20 ID:???
>>54
鯖のことを少しは考えてやれ・・・
自分の鯖なら別にいいが。
57 名前:3PIO ◆3pIoOHKo :02/09/15 21:39 ID:???
>>56
トップページの表示にかなり時間がかかる
苦情が鯖の管理人からきたらどうにかする
0201nobodyさん
02/09/21 14:25ID:???■ このスレッドは過去ログ倉庫に格納されています