Perlコーディング初心者質問スレ Part 39
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/11/27 11:35:03ID:DJwiGeFM【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0359nobodyさん
04/12/15 17:17:16ID:???それもあるが、1バイトずれてマッチすることもあるから
注意してね。
たとえば$testの値が「a@」なんてときは(?:\x81\x40)に
マッチしちゃうよ。(「a@」は"\x82\x81\40"なので。)
ttp://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0360nobodyさん
04/12/15 20:07:39ID:M/kRzQtl引数のデータとログ中の一致するデータを表示する物です。
ページ送りがあるので配列の行数を得たいので
読み込んだログを配列に入れたいのですが、ここで悩んでます。
100KBのログの読み込みを250回繰り返した結果です。
1番目 2.6秒
open(FL, "パス");
while(<FL>){
push(@dump, $_);
}
close(FL);
2番目 4.3秒
open(FL, "パス");
@dump = <FL>;
close(FL);
上記の様になりました。
1行ずつ処理すると軽いといいますが、
1番目の物でも1行ずつ処理している事になっているのでしょうか?
いったん全て読み込む必要のある物は1番だと手順が増えて
2番の方がよさそうに見えていたのですが。
現在、ローカルでしかテストできる環境がないため、
実動作でも有効なのでしょうかご教授下さい。
0362nobodyさん
04/12/15 20:51:19ID:???> 実動作でも有効なのでしょうかご教授下さい。
(´-`).。oO(何のためのローカルテストなんだろう)
0363nobodyさん
04/12/15 20:58:10ID:???0364nobodyさん
04/12/15 21:55:29ID:tOkXdbQQ#!/usr/bin/perl
require './jcode.pl';
print qq(Content-type:text/plain\n\n);
print qq(OK);
exit;
では、きちんとOKと表示されるのに
#!/usr/bin/perl
use Jcode;
print qq(Content-type:text/plain\n\n);
print qq(OK);
exit;
だと「'c:\www\test.cgi' script produced no output」
と表示されてしまいます。何か考えられる原因を教えてください。
perl.plとperl.pmは同じ階層に置いてあります。
環境はWindow2000,ActivePerl5.8.4,AN HTTP1.42nです。
0365nobodyさん
04/12/15 22:17:01ID:???私のところでは問題ないけど。
二行目にこれを入れてみそ。
use CGI::Carp qw(fatalsToBrowser);
0366nobodyさん
04/12/15 22:18:04ID:???sjisという話ですが、実際はWindows code page 932(cp932)使ってませんか?
ttp://www2d.biglobe.ne.jp/~msyk/charcode/cp932/Windows-31J-charset.html
文字化けするのは、IBM拡張文字じゃないかと思います。
from_to("cp932", "euc-jp")で、変換できない文字は諦めるとして、
変換できない文字は'?'に置き換えられるので、そこをチェックするとか。
予め、変換できない文字のテーブルを作るのもいいかも。
EncodeモジュールはUnicodeを介して変換しているようで、
Unicodeに無い文字は変換できないようです。
直接計算で変換するjcode.plやJcode.pmを使えば89区から92区は
変換できるようです。
0367364
04/12/15 22:39:07ID:???回答ありがとございます。
2行目という事は↓こんな感じで良いんですよね?
#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use Jcode;
print qq(Content-type:text/plain\n\n);
print qq(OK);
exit;
↓こんなエラーが出ました(T_T)
Software error:
Can't locate Jcode/Constants.pm in @INC (@INC contains: c:/Perl/lib c:/Perl/site/lib .) at Jcode.pm line 61.
BEGIN failed--compilation aborted at Jcode.pm line 61.
Compilation failed in require at C:\www\test.cgi line 4.
BEGIN failed--compilation aborted at C:\www\test.cgi line 4.
0369364
04/12/15 22:53:50ID:???ごめんなさい。ちゃんとインストールされてませんでした。
ご迷惑をおかけしました。
…ところで、*.pmを扱うのは初めてなのですが
*.plの場合は*.cgiがあるディレクトリに置いておくだけで
動作しましたが、*.pmの場合はインストールしないと
動作しないのでしょうか?
無料ホスティングサービス等を利用する場合に
自分が希望する*.pmが無い場合は、どうすれば良いのでしょう?
0371364
04/12/15 23:06:50ID:???なるほど、鯖管じゃないと*.pmのインストールは
できない訳ですね。>>329-330等を見てる限り
自分の望む*.pmが、鯖にインストールされて
なければ、使えないって考えた方が良さそうですね…
色々とありがとうごさいました。
0374nobodyさん
04/12/15 23:39:27ID:???アーカイブの中身で必要・不要の判断がつかないなら全部そのままサーバの好きな場所にぶち込め。
で、use lib "ぶち込んだディレクトリ";とやってからuse Jcode;だ。
0376nobodyさん
04/12/16 00:14:20ID:jXnHIVD70377nobodyさん
04/12/16 01:29:55ID:B5pcTDRphtmlに表示したいのですが、
その際常に10番目には同じ文字列を表示させたいのです
どのように書けばいいのでしょうか
0382nobodyさん
04/12/16 13:56:27ID:???2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0383nobodyさん
04/12/16 14:55:31ID:kPNHSAIcセキュリティ上何に気をつけたらいいですか?漠然としていてすいません。
とりあえずtaintモードで、use re 'eval'は宣言してません。
0385nobodyさん
04/12/16 16:35:35ID:ZCA0MXpEなるほど、それはまったく考えてませんでした。
バックトラックを大量に発生させる正規表現の検出なんて
思いつきません_| ̄|○
自鯖なので、ちょっとの負荷ぐらいならいいのですが、
タイムアウトさせることにします。
0386nobodyさん
04/12/17 09:17:36ID:???CGI::Sessionはセッションの有効期限があり、有効期限を
過ぎるとエラーになるまでは良いのですが、有効期限が
切れたセッションデータ(ファイル)がディレクトリに無限に
溜まっていきます。
ユーザーがログアウトするなりして、セッションを閉じれば
消えるのですが、ブラウザを閉じられたりするとセッション
を消すタイミングがわかりません。
これらの有効期限切れのセッションデータは、どのように
して削除すれば良いのでしょうか?
0388nobodyさん
04/12/17 11:00:46ID:???ありがとうございます。
…しかし、ファイルが消えてくれません。
use CGI::Session::ExpireSessions;
CGI::Session::ExpireSessions->new(temp_dir=>'./session', verbose=>1)->expire_file_sessions();
↑こんな感じで消そうとしてるのですが…。
作る側は↓こんな感じなのですが。
my $session = CGI::Session->new(undef,undef,{Directory=>'./session'});
$session->expire('+1m');
$session->param( 'id', $id );
どこか、間違ってる所はあるでしょうか?
0389nobodyさん
04/12/17 11:12:36ID:???examplesにある例もそんな感じだから、動きそうなもんだけどね。
verboseを1にしてるからなんかメッセージでてないすか?
ありがちな間違いとしては、カレントディレクトリが適当でない
(temp_dirが相対パスなので)か、実行するユーザが適当でない
あたりかと。
0390nobodyさん
04/12/17 11:27:29ID:???ごめんなさい。消えました。
原因はセッションファイルの頭に付く'cgisess_'を
変更してた為でした。ExpireSessions.pmの中の
'cgisess_'を同じように変更したら、うまく動きました。
どうもご迷惑をおかけしました。
0391nobodyさん
04/12/17 15:54:21ID:???ループを0〜8と10〜99に分けるとか
ループの中でif分噛ませるとか
配列に入れといてあとから[9]を上書きするとか
0392nobodyさん
04/12/18 00:47:15ID:l7mnvpO6timelocal 内のエラーメッセージを表示させずにエラーを検出し、
自分で定義したエラー処理を行いたいのですが、どうすればいいでしょうか。
0394nobodyさん
04/12/18 06:04:33ID:???my $t = eval{ timelocal(0, 0, 6, 18, 12, 104) };
$@ and print "エラーですな $@";
0395392
04/12/18 16:45:30ID:l7mnvpO6おお!できますたよ。ありがとうございます。
0396nobodyさん
04/12/18 22:25:58ID:Zy8umN1o誕生記念age
0397nobodyさん
04/12/18 22:34:22ID:???0398nobodyさん
04/12/18 23:29:49ID:???. ,,-'''~;;;;;;;;;;;;;;;;;;;;;;~'-_,,,,_
. /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;~ヽ,
. /;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;;;;;;;;;;;;;;ヽ
/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,;;;i;l;;;;;;;;;;;;;;;;;;;l
. /;;;;;;;;;;;;;;;;,;;;;;;;;;;;;;;;;;;;;;;;/l;;l;l\;;;;;;;;;;;;;;;l
l;;/;;;;;;;;;;;/l;;;;;;;;;;;;;;;;;;/;///l;l \;;;;;;;;;;l
. l;;l;;;;;;;;;;;;/;l;;;;;;;;;;;;;;;;;//// l/ ヽ;;;;;;;;l
l;l;;;;;;_,,,,l- '''''''''~~~''~ ' ~''''''--,, .ll;;;;;;;l
''-l',-'l _,,-'''(~)' '~l~(~),-,_'' l;l;;;;;;l
. l.l l ' l;;;;;;ol .lo;;;;;;l ' /~ヽ;;l
. l;ヽ l ~~~ , ~~~ / ノ;;;l
. .l;;l;;;i~''l ,__, /-i''l;;;;;;l
l;;l;;;l;l;;;;ヽ,_ ./;;;;l;l;l;;;;;;l
. l;;ll;;;l;l;;;;;;;;;l~'''i-,,_ _,,,-i'''~;ll;l;;;;;l;;ll;;;;;;l
l;;ll;;;l;;l;;;;;;;;;ll,/'l ~~ lヽ,_ll;l;;;;l;;;l;;;;;;;l
l;;ll;l;l;;l;;;,-''~ lノ '/ '-,,_;l;;;;l;;;;;;l
. l;/;l,,-'~ l_ _/ ~'-,;l;;;;;l
l,-i~l l l~'' '~/ .//'-,;l
i'l l. l l l ./ .// / 'l
. l. l. ヽヽヽ _,,-'~-l /-'''-,_ /./. / l.l
. l iヽ ヽヽ,''~,---,ヘ,-,ヘ--,,~''-'//.i /,.l
l| lヽl ヽ,_~ヽ ,-/l~lヽ,, /~'',/ .l // l
/l ヽ l /\/.l l l lヽ-'ヽ~'' .l// .l
. /;l ヽl. \ l l l l / l/ l
0399nobodyさん
04/12/18 23:30:21ID:???(⌒\:::::::::/⌒(⌒∨⌒)
( ̄>::( ゚Д゚)<(⌒\:::::::/⌒)
( ̄/:::::::: (_>::( ゚Д゚)::<
/((⌒∨⌒(_/U::U\__)
/ (⌒\::::::::/ (_∧_)`∨⌒) 、@,
<(__>::( ゚Д゚)::<__し//J\::::::/⌒;@@^
|ヽ(_/::::::::\_)(_>::( ゚Д゚).つ|/`
| ヽ. (_∧_) // (_(ノ:::::::\_)
| \し|.|J ////(_∧_)
l `.:7 ̄ ̄ ̄ ̄ ̄/ し"J
ヽ / .:::/
/ ̄ ̄ヽ(,,゚Д゚) ~ ̄ヽ < おめでとうございます!
ヾニニ=/./ハゞ\=ニン
/ / /| |ヽ \
(__ ̄l/__U"U V`"
0400nobodyさん
04/12/20 08:55:27ID:???いや、絶対なんか便利なモジュールがあると思うんですが、ちょっと検索してもスパッとでてこないので……
0402nobodyさん
04/12/20 10:07:18ID:???txtファイルのアドレスを送ってファイルオープンしようとしたら出来ませんでした
アドレス自体は、確認したところちゃんと送られてるようでしたし
ファイルも、送られてくるアドレスでなく、相対パスをいれたら開くことが出来たんですが
urlではファイルのオープンは出来ないのでしょうか?
0404nobodyさん
04/12/20 11:17:15ID:???mod_perl 環境下で Apache::Request の headers_in() を使え
という話になるわけだな
0405nobodyさん
04/12/20 13:25:42ID:???ただ、どうしても生のヘッダ全てが欲しいならしょうが
ないが、CGIでも環境変数経由である程度は情報もらえる
ので、それでなんとかなることもある。
0407400
04/12/20 13:51:18ID:???む、mod_perl必須ですか。mod_phpがなかったのでPerlならと思ってみたんですが……今のレン鯖じゃだめかー
やりたかったのはIf-Modified-Sinceをぶんどることなので環境変数経由じゃダメっぽい。
レスありがとうございました。
0409nobodyさん
04/12/20 15:59:24ID:???次のような状況で、エラーは出ないのですがこれは問題ないのでしょうか。
ご指導下さい。
script.cgiでuse strict;って書いてコーディングを厳格化しています。
そこで、require "library.pl";としてあります。
library.plには、宣言されていない変数が使用されていますが大丈夫でしょうか。
library.plではstrictしていないのでこれは問題ないのでしょうか。
よろしくお願いします。
0410nobodyさん
04/12/20 16:07:28ID:???use strict;でもscript.cgiの記述が対象になるだけで
requireされたライブラリの中身までは見ない。
0411nobodyさん
04/12/20 22:25:10ID:???FTP使えなくてTeraTermからviでコーディングさせられてて、超しんどいです。
できたら予約語ハイライトがあったら嬉しいですが
これよりマシな環境なら何でもいいので、どうかお願いします。m(_ _)m
0412nobodyさん
04/12/20 22:28:11ID:???0414nobodyさん
04/12/21 00:58:35ID:???自分のPCからFTPクライアントが使えないのか、shからもFTP出来ないのか、
>>412って事だから、この際PerlでFTPクライアント組んじゃえ。
そしたら自分でFTPサーバ立てれば(もしくはどっかにUP)、shから落とせるな。
Net::FTP使えば、ワンライナー程度でも十分いけそうな感じ?
ま、別にFTPにこだわる理由は無いのだが・・・
0415411
04/12/21 01:59:02ID:???レス有難うです。
とりあえず入力補完があるらしいemacsで頑張ります。
非武装サーバにログインして、そこからssh経由で開発サーバに接続
という2段構えになっていて、どっちのサーバも設定触れないので・・。
スレ違い申し訳ない。平にご容赦を。
0416nobodyさん
04/12/21 06:35:50ID:???scpとか。
コピペでviに流し込むとか(teratermだと無理かな?)。
Unix板の方が適切なレスもらえると思うけど。
0417nobodyさん
04/12/21 20:22:36ID:???0418nobodyさん
04/12/21 22:20:45ID:???Perlについての質問箱 14箱目
http://pc5.2ch.net/test/read.cgi/tech/1101649274/
0419nobodyさん
04/12/22 01:13:08ID:???0420nobodyさん
04/12/22 02:02:21ID:???Windows上からアップしたいならWinScp使えば?
0421nobodyさん
04/12/22 19:14:08ID:PL97VF7o配列に格納したいのですが、なかなか上手くいきません・・。
全部グローバル変数とかでやるなら、
open FH '<', "data.csv";
$i = 0;
while(<FH>){
chomp;
$count = sprintf("data%03d", $i);
@$count = split(/;/);
$i++;
}
close(FH);
と記述して一応は出来たのですが、最近use strict;なるものを知ってからは全く手が出なくなってしまいました。
どういった記述をすれば別々の配列に格納することが出来るのでしょうか?
まだuse strict;について全然理解していない段階で聞くのもどうかと思ったんですが、思い切って書いてみました。
説明も上手く出来なくて申し訳ありませんが、何かご指導お願いできないでしょうか。
よろしくお願いいたします。
0422nobodyさん
04/12/22 19:23:36ID:???何これ???
0425nobodyさん
04/12/22 20:06:11ID:???ワラタ
0427nobodyさん
04/12/22 20:45:13ID:???配列の配列を使う。
my @count;
open(FH, '<', "data.csv") or die $!;
while(<FH>){
chomp;
push(@count, [ split(/;/) ]);
# これはこんな意味
# my @dummy = split(/;/);
# push(@count, \@dummy);
}
close(FH);
アクセスするには?
$count[$i]->[$attr]; # 明快
$count[$i][$attr]; # 同じ意味だけど、私は嫌い
例えば$count[1]->[1]とは?
$count[1]に配列のリファレンスが入っているので、
それを->[1]を使いデリファレンスする
ということ。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldsc.html#LISTS_OF_LISTS
0429nobodyさん
04/12/22 22:48:45ID:???>>427の通りで出来ると思うけど、こっちもついでに >
http://www.kt.rim.or.jp/~kbk/perl5.005/perlref.html
0430nobodyさん
04/12/22 22:56:49ID:???ま、なんとなくそういう前提で書こうとしてるだけの気はするけどな。
どうしてもそうしなければならない理由はいくら考えても思いつかないし。
0431nobodyさん
04/12/23 00:32:14ID:???use strictを記述すると 変数名に型宣言をしないとエラーが表示される
ということで、早速以下のようにコードを書いて試してみたのですが
エラーがまったく出ずに
ブラウザには「test : 0」と通常通り表示されるのみです。
何故エラーが出ないのでしょうか。
#!/usr/bin/perl -w
use strict;
$a = 0;
print "Content-type: text/html\n\n";
print "test : " . $a;
0432nobodyさん
04/12/23 00:37:33ID:???0434431
04/12/23 00:45:14ID:???$aでなく$abcにしたら見事エラーがでてページが表示されませんでした。
知りませんでした…
ありがとうございました。
0435nobodyさん
04/12/23 00:49:46ID:???つーかperldocに思いっきり書いてあるから。
0436nobodyさん
04/12/23 00:52:21ID:???これですね。
Because of their special use by sort(),
the variables $a and $b are exempted from this check.
0438nobodyさん
04/12/23 01:48:55ID:???となると本当に極めるにはPerlのソース読むが一番と。
ま、確かにそうだな。
0440nobodyさん
04/12/23 14:15:05ID:???9を16回(4.9999999999999999)繰り返すとなんで5以上の判定なんだ。
print "数値を入力: ";
$value = <stdin>;
chomp ($value);
if ($value >= 5)
{
print "5以上\n";
}
else
{
print "5未満\n";
}
0441nobodyさん
04/12/23 14:49:47ID:???0442nobodyさん
04/12/23 15:00:41ID:???0を足してみれば分かるかも。
$value = 4.9999999999999999;
print(0+$value);
Perlの内部で値を正しく表現できないと表現誤差が出る。
そういうときは、
use bignum;
を宣言する。
0443nobodyさん
04/12/23 15:37:47ID:???0444nobodyさん
04/12/23 23:37:19ID:a8M2UJvQ使いたいモジュールが入ってるか調べたいのですがどうやって調べられますか?
0445nobodyさん
04/12/23 23:41:49ID:???0446nobodyさん
04/12/23 23:59:18ID:???expires値も食わせてるし、IEの設定をヤワにしても駄目。
Firefox1.0はちゃんと食ってるんですが…。
IEに独特な制約とかって、ありましたっけ。
0450nobodyさん
04/12/24 00:58:03ID:???use PHP::Perlinfo;
perlinfo();
こうやってみましたけど、500エラーになっちゃいました。
0454nobodyさん
04/12/24 08:09:11ID:o66Ux/q0やりたいことは、画像ファイルをアップしてもらったときに、その画像を表示させる際、widthとheightの指定をするために、数値が必要なのです。
表示する際に取得しても、アップされたときに取得してdatファイルに書き込んでもどちらの方法でもいいんですが、
いいやりかたがありましたらお教え下さい。
0455nobodyさん
04/12/24 08:22:07ID:???Image::Magickが使えるならもっとお手軽。
0456450
04/12/24 10:56:48ID:tsjI5bY5だからレンタルサーバーだからわかりませんて。
■ このスレッドは過去ログ倉庫に格納されています