Perlコーディング初心者質問スレ Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
05/03/10 00:47:16ID:sT66OcmD【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0076nobodyさん
05/03/11 18:45:46ID:stOV0FtXprint "3回目" if /^3$/;
0077nobodyさん
05/03/11 19:20:11ID:???0078nobodyさん
05/03/11 20:08:10ID:???$value =~ s/\xa4\xa5/`/g;
$value =~ s/\xa5([\xa1-\xfe])/\xa4$1/g;
$value =~ s/`/\xa4\xa5/g;
0079nobodyさん
05/03/11 20:13:17ID:???ところで、ひらがな→カタカナの変換はあれで大丈夫?
$value = "ばぅばぅ";
$value = "靴が痛い";
こんなのが、ちとヤバイと思うのだけれど。
>>60
大抵は先頭だね。
でも、配布するモジュールでもなければ好きな所に書いていいと思うよ。
(それから、encodingは、エンコードを始める位置で宣言する必要があるはず。)
>>72
sub at($);
for(1..4){
print "3回目" if at 3;
}
sub at($){ $_ == shift }
# 意味不明な世界へようこそ。
008060
05/03/11 21:13:35ID:???やっと来た・・・・・
やはり先頭ですよね。でももしも間違って
100行目: use DBI;
.
.
.
700行目: use DBI;
とかしても表面上にはエラーにならないくらいだから、内部的にも何の問題もないんですよね?(encordingなどは別として)
0081nobodyさん
05/03/11 21:30:45ID:???実行時に評価されるのは require で。
0082nobodyさん
05/03/11 21:43:35ID:???useやrequireは何度呼び出しても問題にはならないことになっている。
モジュールを先頭で呼び出すのは分かりやすくする為にすぎないので、実際に使う分にはどこに書いても構わない。
0083nobodyさん
05/03/11 21:57:38ID:???大丈夫。
http://www.harukaze.net/~mishima/perl/man/perlfunc.1.html
> use Module
> 指定したモジュールから、現在のパッケージにさまざまな
> 内容をインポートします。 多くは、パッケージのサブル
> ーティン名や、変数名に別名を付けることで、実現されて
> います。 これは、
>
> BEGIN { require Module; import Module LIST; }
>
> というのと、全く同値です。
> require EXPR
...
> ファイルは、同じ名前で 2 回読み込まれることはありま
>せん。
http://www.harukaze.net/~mishima/perl/man/perlvar.1.html
> %INC ハッシュ %INC は、do や require によってインクルード
> された、個々のファイル名をエントリとして持っています。
> key は指定したファイル名で、value は実際に見つかった
> 場所となっています。 require コマンドは、指定された
> ファイル名が既にインクルードされているかを、この配列
> を使って調べます。
0084nobodyさん
05/03/11 23:40:01ID:???useは頭に並べておくのが良いと思います。
0085nobodyさん
05/03/11 23:55:38ID:???後からどんどんルーチンが増えていく時に、useだけルーチンから出しておくと、
何かと面倒。
なので俺は両方に書いてる。
0086nobodyさん
05/03/12 00:26:54ID:???ログインとかログアウトってどうやるんですか?
CGI::Session使えば簡単なセッションはできますが、相手のIDとPASSをセッションファイルに入れればいいのかな?
なんかセキュリティ云々がよくいわれてますが、どちらにしても言うほどのセキリティなんか実装しようがないですよね。
つまりどのレベルまですれば一般レベルなのかということです。
CGI::sessionでセッションIDはクッキーに焼くことで渡し、セッションファイルにIDとパスを。
IDとパスが実在すればログイン状態。
↑これはセキリティ的に足りないでしょうか?
0087nobodyさん
05/03/12 00:43:48ID:???・IPの一致チェック
・cookieはディスクに保存させない
・可能ならSSLを使用
スクリプト作成者にできることはこれくらいでは。
それと、パスは保存する必要なしかと。
0088nobodyさん
05/03/12 02:35:22ID:DLGfeKNq0089nobodyさん
05/03/12 03:03:55ID:???セッションで渡り歩かなくても済むような構成にしてしまうのも手。
渡り歩いた履歴はCookieに溜め込んで、最後のページでIDとPassを入力させて完了とか。
>>88
int()をちょいと工夫すればOK。マイナスには気をつけるよろし。
0090nobodyさん
05/03/12 07:24:17ID:???透過PNGの出力ができないんだけど、仕様ですか?
(透過しない)
透過GIFならできました。
0093nobodyさん
05/03/12 15:33:01ID:???0095nobodyさん
05/03/12 17:09:44ID:???0096nobodyさん
05/03/12 19:44:08ID:???ちょっといまさらだけど。
useは、通常の実行文ではなくて、コンパイル中に実行される文だから、普通は先頭。
例えば、
1 + 1;
use hoge;
2 + 2;
とか、書いてしまっても、
絶対にuseから処理される。
if(bool){
use hoge;
}
とか書いても、ifとか、そんな次元じゃなく、
1番最初にuseが処理される。
だから、普通は先頭に書く。
実行結果は、どこに書いても同じになるかもしれないけど、やっぱ普通は先頭。
スコープに影響するプラグマモジュールなら、話は別で、
適切な場所に書いておくよろし。
(ただし、この場合も実際にはuseは最初に処理されている)。
requireは、実行中に処理される普通の文なので、常に適切な場所が良いと思う。
でも、どこに書いても構わないなら、やっぱ先頭がいいなー。わかりやすいから。
0097nobodyさん
05/03/13 08:25:22ID:oiuJgK8iメモリやばいですよね?
0101nobodyさん
05/03/13 11:44:21ID:???確認する方法はある?
0103nobodyさん
05/03/13 13:32:47ID:???chmod … || die
0104nobodyさん
05/03/13 15:24:50ID:???テンポラリクッキーを使うのですか?でもそれって相手側に協力を求める必要があるんですよね。
IPチェックはちょっと面倒ですが、ログイン時の人間であるかどうかを確認するとセキリティの向上には
なかなかの効果がありそうですね。
SSLは当然です^^
>>89
それだとちょっと利便性が落ちそうですね。
会員価格とかが実現しづらくなります。
あ、IPチェックも無理だ・・・・・
携帯は確か毎回違うIP提出してくるキャリアがあるんだった・・・・
0105nobodyさん
05/03/13 15:25:19ID:???0107nobodyさん
05/03/13 18:35:32ID:???perl全般の質問スレになったの?
0108nobodyさん
05/03/13 18:39:04ID:???0111nobodyさん
05/03/14 11:03:24ID:???それはスレを分けても変わらないでしょ。
基本的にこの板内のPerl関係の質問は大抵同じ人間が回答してるんだから
個人的には分割することに意義を感じられないな。まあ既に分かれてるものを
無理してくっつける必要があるというわけではないけどさ。
0112nobodyさん
05/03/14 13:44:36ID:???回答者はどのスレでも一緒だろうな
そろそろどっかとまた合併すんじゃね?
0113nobodyさん
05/03/14 14:07:00ID:???ヲタク板なんて細分化する必要ないのになぁ。
0114nobodyさん
05/03/14 14:52:44ID:???0115nobodyさん
05/03/14 16:09:47ID:???0116nobodyさん
05/03/15 10:01:02ID:3Ik8WJWFtp://tech.bayashi.net/pdmemo/gzip.html
これを/bin/gzipでなくCompress::Zlibでやりたいのですが
open(STDOUT,"| $gzip -1 -c");の部分をどのように処理すればいいか
分かりません。どなたかご教授願います。
0117nobodyさん
05/03/15 10:28:44ID:???0118nobodyさん
05/03/15 11:26:01ID:???ユーザ層ごとに分けてどうするのよ。どうせ同じPerlだろ。
周辺関連に差は出るが、広い意見だったりちょっと関係ない知識までつくのが大手掲示板の利点でしょ?
CGIは作れるがwindowsで使える簡単なソフトは作れないなんていう人はこの板には結構いそう。
なんかもったいない。みんな一緒なら、知らずに目に入って付く知識で十分できるようになるのに。
って個人的な意見ゴメンね,(__),
0120116
05/03/15 11:56:36ID:3Ik8WJWFご回答ありがとうございます。
教えていただいたwebに私のやりたい処理と似たような処理が紹介されてましたが
ちょっと違う感じです。スクリプト内部にprint文で書かれた内容全部をgzip圧縮させて
転送させたいです。スクリプトを貼り付けると、以下のような感じで処理したいです。
##の部分がうまくいきません。
#!/usr/bin/perl
use Compress::Zlib;
if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}
## ここで$bufferに<h1>Hello world</h1>以下の出力内容全てを代入したい
print Compress::Zlib::memGzip($buffer);
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaaa";
0121nobodyさん
05/03/15 12:24:33ID:???printした後は標準出力に渡されるのでPerlでは圧縮しようがないのだが。
パイプでつなぎたくなければ圧縮してからprintするしかなかろう
0122nobodyさん
05/03/15 12:35:49ID:???ID番号の出るスレッドに書き込みしたのですが
どうしてもそのレスを消したい場合に方法はないのでしょうか?
すごく困っています。絶対入れてはならないことをレスしてしまったもので・・
0123nobodyさん
05/03/15 12:39:02ID:???レスの削除は、削除依頼板。
http://qb5.2ch.net/saku2ch/
0124nobodyさん
05/03/15 12:52:16ID:???どこやねwん
0125116
05/03/15 13:03:28ID:???ご回答ありがとうございます。
tp://www.rfs.jp/sitebuilder/perl/02/08.htmlを参考にして子プロセスを作ることで出力を$bufferに代入することができました。
回答していただいた方々ありがとうございました。
参考までに成功したスクリプトを貼っておきます。(直したほうがいいところは指摘お願いします)
#!/usr/bin/perl
use Compress::Zlib;
if ($ENV{'HTTP_ACCEPT_ENCODING'} =~ /gzip/) {
print "Content-type: text/html\n";
if($ENV{'HTTP_ACCEPT_ENCODING'} =~ /x-gzip/){
print "Content-encoding: x-gzip\n\n";
} else {
print "Content-encoding: gzip\n\n";
}
if( open BUF, "-|" ){
while ($buf = <BUF>) {
$buffer = $buffer.$buf;
}
close(BUF);
print Compress::Zlib::memGzip($buffer);
exit(0);
}
} else {
print "Content-type: text/html\n\n";
}
print "<h1>Hello world</h1>";
print "aaaaa";
0127125
05/03/15 13:06:21ID:???それ以外で直したほうがいい部分は指摘ください。
0128122
05/03/15 13:31:20ID:???ですが、とてもじゃないけど、該当する項目がなくって無理でした。
というのが、自分の独り言を赤裸々にタイピングしてる途中に、
間違って「書き込む」のボタンを押してしまったんです。
しかも、人に知られたら恥ずかしいし、どうしようもない内容なんです。
で、IDが1日たっても変わってなかったってのもあって、きっと誰かが
それに気付いて恥をかくか、煽りの的になるなーと思うと、もー気になって
気になってパニックしてます。書き込みは慎重に行うべきですね。
0131nobodyさん
05/03/15 16:10:30ID:???MySQLだけでは無理だと思うのでPerlでやるしかないと思うのですが、
name,age,mail
太郎,19,[email protected]
次郎,28,[email protected]
....
こういうデータからnameの重複文だけ表示させたいのです。
こういうのって1回ずつやらないといけないのでしょうか?
my $data = select 1番目のデータ取得
my @重複 = select 色々 where name=$data
みたいに。(変な書き方ですみません。)
dataの中から例えばメールアドレスが重複してるのがあるかないか、あるなら
それをすべて表示。
一発で[email protected]という値がいくつ重複してるか、[email protected]がいくつ重複してるかを調べたいのです。
0133nobodyさん
05/03/15 16:40:21ID:???そう? 少し気になるとこもあるけど、まだマシな方だと思うなあ。
というわけで >>126 お手本プリーズ
013448
05/03/15 16:49:20ID:???>MySQLだけでは無理
普通にできますが
SELECT count(*) AS `count`, * FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
0135134
05/03/15 17:01:28ID:???SELECT count(*) AS `count`, `name` FROM `table` GROUP BY `name` HAVING `count` > 1 ORDER BY `count` DESC
0137nobodyさん
05/03/15 22:04:08ID:???0139138
05/03/15 22:06:55ID:???0142nobodyさん
05/03/15 22:17:03ID:???0143138
05/03/15 23:51:35ID:???圧縮された内容にヘッダが付かないようにしたのと、
forkに失敗したときの対策。
my $pid;
if ($ENV{HTTP_ACCEPT_ENCODING} =~ /((?:x-)?gzip)/){
my $encoding = $1;
if ($pid = open(BUF, "-|")){
local $/;
my $buffer = <BUF>;
close(BUF);
print "Content-encoding: $encoding\n",
"Content-type: text/html\n\n",
Compress::Zlib::memGzip($buffer);
exit;
}
}
if (not defined $pid){
print "Content-type: text/html\n\n";
}
print <<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
exit;
0144nobodyさん
05/03/16 00:23:12ID:???my $encoding = $1;
local $/ = undef;
print "Content-Encoding: $encoding\n",
"Content-Type: text/html\n\n",
Compress::Zlib::memGzip <BUF>;
close BUF;
exit;
}
print "Content-Type: text/html\n\n",
<<"EOF";
<html>
<head><title>test</title></head>
<body><h1>Hello world</h1><p>test-test</p></body>
</html>
EOF
0145nobodyさん
05/03/16 01:23:42ID:???しかし local $/ = undef; っていいな、使える。 いままで気づかなかったよw
コードはいいけど、HTML中途半端なのは何でかなw
どうせ省略するなら title と p だけでいいのに。
0148nobodyさん
05/03/16 11:21:44ID:uAWX38vAURL中に?があるときだけうまく取り出せません
念のためエスケープしてもうまくいきません
たすけて
348 while ($main=~m/(<a href=\"(.*?)\">(.*?)(?: +?)?(?: +?)?<\/a>)/ig){
349 $matc1=$1;$matc2=$2;$matc3=$3;
350 if ($matc2 eq $matc3){
351 $main=~s/\Q$matc1/$matc2/;
352 }else{
353 $main=~s/$matc1/$matc3 $matc2/;
355 }#if else;
356 }#while;
0149nobodyさん
05/03/16 13:37:59ID:???いろいろ無駄っぽw
$main =~ s{<a href="(.*?)">\s*(.*?)\s*</a>}{ ($1 eq $2) ? $1 : $1 .' '. $2 }eig;
0150nobodyさん
05/03/16 13:40:10ID:???0151nobodyさん
05/03/16 14:36:59ID:???別にeqまでしなくていいでしょ。それならtitleとか考慮したら?
s{<a\s+.*?href="(.*?)".*?>\s*(.*?)\s*</a>}{$2 $1\n}ig;
0152nobodyさん
05/03/16 15:11:14ID:???え、なんで?
>>148 でそう書いてるなら、その条件で書くべきなのでわ。
どっからどこまでしたいのかなんてわからないよ。
あと、考慮するなら s オプションもつけとけば。
0155nobodyさん
05/03/17 06:55:12ID:???色々と絞ってみると下記のコードがエラーの原因だと分かったのですが、どのように治せばいいのでしょうか?
while ( my ($code, $ress) = each(%DATA{'expect'}) ) { }
%DATA{'expect'}はハッシュのハッシュです。これを%DATAに変えてみるとエラーが出なかったので、
ハッシュのハッシュをeachにぶちこんでるのが何か悪いのかな、と思いましたが解決方法が分かりません。。
どなたかご教授して頂けると幸いです。
0156nobodyさん
05/03/17 07:36:06ID:???015797
05/03/17 11:09:03ID:???はいwhileで1行づつ読み込んで処理しようと思います。ありがとうございます。
>>99
Flash用なのでテキストに書き出すことにしまふ。ありがとうございます。
0158125
05/03/17 12:01:21ID:???>>143のスクリプトでgzipの圧縮レベルを設定してみたのですが
Compress::Zlib::deflateInit( -Level => 1 );
という行を追加してCompress::Zlib::memGzip($buffer)の内容をファイルに書き出してみて
ファイルサイズを調べてみたのですが
-Level => 1の場合と-Level => 9の場合とでファイルサイズ変わんないのですが
使い方間違ってますか?
$bufferの中身はいろいろ変えてみましたが、やはり変わりませんでした。
0159nobodyさん
05/03/17 13:27:19ID:+OmKbfyB多数のファイルを生成する際に、ファイル名としてユニークな名前がほしいのですが
Perlの定石としてはどんな方法を用いるのでしょうか?
timeからファイル名を作ろうかと思ったんですが、同じ名前になることもあるだろうし
通し番号を持つのも面倒だし、と思いまして。
0160とうかつ
05/03/17 13:38:35ID:ZeP4drG9HTMLの<INPUT type="file">フォームで指定したファイルをcgiと同じ場所にアップロードしたいと思っていますが、
どうしても成功しません。、以下に関連ソースを書きます。
●フォームHTMLの中の記述
<FORM>
<INPUT type="file" name="pic_file_name" size="80">
<INPUT type="button" value="写真の追加" onClick=doAddPic()>
</FORM>
※この<FORM>〜</FORM>内に他に多数の<INPUT>あり。
●フォームHTMLのJavaScript記述
<SCRIPT language="JavaScript">
<!--
function doAddPic()
{
document.Form.action = "./pic_upload.cgi";
document.Form.method = "post"
document.Form.enctype= "multipart/form-data";
document.Form.submit();
}
//-->
0161とうかつ(続き)
05/03/17 13:39:20ID:ZeP4drG9use CGI;
my ($buffer);
$CGI::POST_MAX = 1024 * 1000; # max = 1MB
# オブジェクト作成
my $query = new CGI;
my $file_handle = $query->upload('pic_file_name');
# ファイル保存
my $save_name = "UploadFile.xxx";# 名前は仮
open (OUT, ">$save_name") || die "Can't open Savefile!";
binmode (OUT);
while(read($file_handle, $buffer, 1024))
{
print OUT $buffer;
}
close (OUT);
close ($file_handle);
0162とうかつ(続き)
05/03/17 13:39:57ID:ZeP4drG9・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
・途中 print "$file_handle"; としても何も出力されない。
・クエリーname 'pic_file_name' でファイル名は送られている。ほかのINPUTデータについても正常に送られている。
・フォルダの権限は777
・perlのバージョンはv5.8.0
apacheは自分でインストールした物ですので特別な設定が必要だったらかけている可能性も考えられます。
もし可能性がありましたら教えて下さい。
何とか動かしたいと思っていますのでご支援お願いします。
0163nobodyさん
05/03/17 13:44:23ID:???定石とか知らんけど
my $file = time();
while (-e $file . '.txt') { $file++; }
$file .= '.txt';
とかじゃね?
0164nobodyさん
05/03/17 13:55:35ID:???それだけだと危ないよ。
>>159
1個のプロセスがファイル作成関連処理のをしている間は
他プロセスにはさせないようにしれ。
0165nobodyさん
05/03/17 13:57:08ID:???>・"UploadFile.xxx"ファイルは作成されるが、中身に書き込まれない。
>・途中 print "$file_handle"; としても何も出力されない。
もう答えは出てるじゃん。アホ?
0166nobodyさん
05/03/17 13:59:10ID:???じゃあ一旦 temporary.txt に書き出した後、
>>163 でチェックして rename するとか。 ダメ?
0168とうかつ
05/03/17 14:11:41ID:ZeP4drG9早速やってみました、JavaScriptを抜いた普通のHTMLでやってみましたところ
正常にアップロード出来てしましました、ありがとうございます。
それはそれでまた困ったな…submitボタンの区別が出来ない…
0169nobodyさん
05/03/17 14:18:07ID:???誰やねんおまえは。159か?
普通に排他処理使って特定ファイルを開いてる間に本処理をやればいい。
>>168
お前はこのスレ以前の問題なんじゃないか?
0171nobodyさん
05/03/17 14:29:18ID:???Perl の定石はしらないけど、漏れはいつも djb 風に、
sprintf("%d.%d.%d", time(), $$, $uid++);
みたいなのを使ってます ($uid はプロセス内で unique になる数字) 。
ファイルシステムをネットワークで共有している場合は、
さらにこれにホスト名も付けます。
0172nobodyさん
05/03/17 14:34:28ID:???できたのかw
で、なんで submitボタン〜 とか考える必要があるの?
というか type="button" で submit させる方がいかがなものかと。
とりあえず class と CSS で指定しとけば 「区別」 はつくんじゃないの?
>>169
いやファイルロックの話じゃなくて、ユニークなファイル名をつけたい、って話なのだよ。
0173nobodyさん
05/03/17 15:59:43ID:???だからAというファイル名がユニークであるか確認してからAというファイルを新規に作成
するには排他処などで他のプロセスをとめないいけないんだよ。
もしかして新規作成するファイルをロックするとかいう勘違いしているのかな?
0175nobodyさん
05/03/17 16:56:31ID:???・・・・あなた俺より詳しいじゃない。
個人的には48はこのスレで一番まともな回答者だと認知している。
なのであなたに「どうでしょうか」といわれるととても恐縮だorz
なんか鬱だな・・・
■ このスレッドは過去ログ倉庫に格納されています