Perlコーディング初心者質問スレ Part 56
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0760nobodyさん
2008/01/18(金) 12:04:46ID:Z4Jr4bliどこかいいサンプルないでしょうか?
アップロードしたいファイルはエクセルファイルです
0761nobodyさん
2008/01/18(金) 12:15:45ID:???0762nobodyさん
2008/01/18(金) 12:39:13ID:???それともファイルをアップロードするCGIなのか知らんけど
http://search.cpan.org/~gaas/libwww-perl-5.808/lib/HTTP/Request/Common.pm
http://search.cpan.org/~lds/CGI.pm-3.33/CGI.pm#CREATING_A_FILE_UPLOAD_FIELD
0764nobodyさん
2008/01/18(金) 14:27:48ID:???0765nobodyさん
2008/01/18(金) 15:13:46ID:???0766nobodyさん
2008/01/18(金) 16:38:38ID:???#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use CGI qw/:standard/;
use constant MAX_WAIT => 10;
my $q = new CGI;
$q->charset('utf8');
my $wait = rand(MAX_WAIT);
my @mind = qw(uploadしたい uploadしたくない uploadしてもいい);
my $mind = $mind[ int( rand(scalar @mind) ) ];
print start_html(
-head => meta({-http_equiv=>'refresh', -content=>"10; URL=$ENV{SCRIPT_NAME}"}),
-title => 'CGIの気持ち'
),$mind,end_html;
0767nobodyさん
2008/01/19(土) 01:06:12ID:???$waitは、どこで使ってるの?
-head => meta({-http_equiv=>'refresh', -content=>"$wait; URL=$ENV{SCRIPT_NAME}"}),
とかやりたかったのか?
0768nobodyさん
2008/01/19(土) 14:38:24ID:gMv3rNuv100%の確率のうち30%が当たりという設定をして
くじを引かせる場合、
my $rate = 30;
my $atari = int((rand(100))) + 1;
if($atari <= $rate){
print "あたり\n";
}
これで30%ということに理屈ではいえるのでしょうか。
それとも上か下かなので2分の1になるのでしょうか。
ご教示いただけますと幸いです。
0769nobodyさん
2008/01/19(土) 15:04:56ID:???0770nobodyさん
2008/01/19(土) 15:25:31ID:???0771nobodyさん
2008/01/19(土) 16:00:15ID:???そういうときは、そのコードを何万回か繰り返してあたりとはずれのカウントを取って、
実際に30%くらいになるかを調べればいいんですよ。
0774nobodyさん
2008/01/19(土) 21:24:36ID:???ありがとうございます。
>>773
実行有難うございます。
私の方でもやってみましたが、平均値が30%になりました。
安心しました。
0775nobodyさん
2008/01/19(土) 23:16:40ID:???use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX qw(strftime);
my $q = new CGI;
print $q->header(), $q->start_html();
#print $q->dump; # for debug
my $outputdir = "log"; # ファイルを置く先 (ディレクトリ)
my $fh = $q->param('uploaded_file');
my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子
if ($fh ne "") {
my $timestamp = strftime "%y%m%d%H%M%S", localtime;
my $outputfn = "$outputdir/$timestamp$ex";
open(F, "> $outputfn") or die;
flock(F, 2);
if (defined $fh) {
while (<$fh>) {
print F $_;
}
}
close F;
print qq{saved as <a href="$outputfn">$outputfn</a>};
}
print $q->start_multipart_form(-name => 'myform'),
$q->filefield(-name => 'uploaded_file'),
$q->submit("OK"),
$q->endform,
$q->end_html(), "\n";
0776760
2008/01/19(土) 23:18:40ID:???日本語おかしかったですね、すいません。
サンプルを探したんですが
>>775のままだったら
ファイルをアップしたときにファイル名が
アップロードした日付になってしまいます。
ファイル名を変更することなくアップロードするにはどうすればいいでしょうか?
0777nobodyさん
2008/01/20(日) 00:14:39ID:1RDcSYMgのところを、そうじゃなくすれば良い。
0779nobodyさん
2008/01/20(日) 02:12:08ID:???0780nobodyさん
2008/01/20(日) 03:03:09ID:???同名ファイルの処理が必要になるし、文字化けとかあるし。
文字化けとかしたら、ダウソとか出来なくなる場合もあるし、
削除とかはsshログインして * とか使って消さないといけなく
なる場合もある。(解決は出来るから問題なしともいえるのだが)
日本語はファイルと一緒にコメントとして管理すべきだと思うけど、
どうかな?
0782nobodyさん
2008/01/20(日) 19:19:48ID:xw354eHRopen(OUT, ">$filename");
binmode(OUT);
while (read($fh, $buf, 1024)) { print OUT $buf; }
close(OUT);
close($fh);
上記なソースをよく見かけるんだけど、
三行目で一気に処理するんじゃなくて、
1024バイトずつ取り出して処理する理由って何?
0783nobodyさん
2008/01/20(日) 19:21:07ID:???0784775
2008/01/20(日) 19:37:21ID:???具体的にどうかえればいいのでしょうか?
教えてくださいとはいいません。
やってください
>>780
ご意見ありがとうございます。
0785nobodyさん
2008/01/20(日) 20:21:40ID:???0786nobodyさん
2008/01/20(日) 22:56:33ID:???レン鯖とかも考えた時の常識的なメモリ使用量ってどのくらい?
シュワルツ変換とか使っていいものかいつも悩む。
0787nobodyさん
2008/01/20(日) 23:26:35ID:???「レンタルサーバ メモリ使用量」でぐぐってみたらどうかな?
ま、突き詰めるとそのサービスの仕様次第となるだろう。
シュワルツ変換も「やってはいけない処理」ではなく、重たい処理
でしかないからな。それだけの質問では何もいえない。
具体的なソースを出して、この負荷は問題ないか?とかなら分かるが。
0788nobodyさん
2008/01/21(月) 21:15:32ID:29cYlZ80この場合のファイル名そのものを取得するようにするには
どのようにしたらよいですか?
0790nobodyさん
2008/01/21(月) 22:20:09ID:29cYlZ80有り難うございます
よく分かりませんが、ヒントを元にくぐってみます
0791nobodyさん
2008/01/21(月) 22:33:12ID:MggCWroJtoolkitのテンプレートを利用ユーザに編集させてたいと思っているのですが、
[% myheader = 'my/index.cgi' %]
[% INCLUDE myheader %]
などされるとソースが見えてしまいます。
なんとか規制できないでしょうか?
phpのsmartyであれば以下のように、テンプレートからのインクルードを規制することができます。
同等の機能はあるのでしょうか?
$this->security = true;
$this->security_settings["INCCLUDE_ANY"] = false;
$this->security_dir = "/path/to/templates";
$this->trustes_dir = "/path/to/php";
または、テンプレート内で使える関数を指定できるとかありますでしょうか?
日本語マニュアル見てみましたが、それらしいものがありませんでした。
http://www.hakoniwa.net/tt/
0792nobodyさん
2008/01/21(月) 23:09:44ID:???亀レスですみません。ぐぐってみました。
>782-783 のような流れをたまに見るので業界の暗黙知が
あるのかと思いましたが特に無いようですね。
会社毎に見ていくと具体的な数字を出している所は少なかったですが、
少ないところで2MBと10Mb(=1.25MB?)でした。
0793nobodyさん
2008/01/21(月) 23:29:51ID:???あるサーバで5秒くらいかかっていたのが、最新のでは1秒くらいで終わるので、
ぜんぜん問題にならなくなったとか。
でも、1分を1秒にするのはムーアの法則でも5年以上はかかるわけで、
そのくらいの規模はどう頑張っても無理だろという話だ。
0794nobodyさん
2008/01/22(火) 09:20:05ID:???INCLUDE自体を抑制するやり方はわからんが、
If a BLOCK definition is not currently visible then the template
name should be a file relative to one of the INCLUDE_PATH directo-
ries, or an absolute or relative file name if the ABSOLUTE/RELATIVE
options are appropriately enabled.
これを利用すれば普通は十分じゃねーの?
0795nobodyさん
2008/01/22(火) 10:10:27ID:???そこでチェックすりゃいいんじゃね?
0796791
2008/01/23(水) 00:37:55ID:fM6ljyqY>もし、ブロック定義が見つからない場合は、テンプレート名はINCLUDE_PATHのディレクトリにあるファイルか、ABSOLUTE/RELATIVEオプションが付いていれば絶対/相対パスにあるファイルを対象とします。
とのことですが、相対・絶対でスクリプト指定できてしまうということですよね?
考えても理解できませんでした、具体的にどのように利用すれば大丈夫なんでしょうか?
>>795
たしかにテンプレート編集時にinclude等、使わせたくない文言を削除する方法もあるのですが、
入れようとしているシステムが銀行ほどではないんですけど、絶対にユーザにソースが漏れてはいけないシステムなんです。
(今後のシステム拡張等も含んで)チェックミスが出てきやすい作りで作るのはあまり好ましくないと考えています。
html-templateでも、includeなど規制する機能はなさそうですし・・・。
使いたい機能はifとloopだけなんですけど、
perlでセキュリティ完備したテンプレートエンジンほかにあるのでしょうか?
0798nobodyさん
2008/01/23(水) 10:07:27ID:???0800nobodyさん
2008/01/23(水) 11:28:58ID:???0801nobodyさん
2008/01/23(水) 11:58:33ID:???http://anond.hatelabo.jp/20071030153111
0802nobodyさん
2008/01/23(水) 14:51:21ID:???$s = Unicode::Japanese->new;
$s->set($aaa);
$str = $s->sjis-imode;
という風に、perlで記述したところ、0という値しか返ってきません。ちなみに$aaaをそのままprintすると、文字化けします。
何がいけないのかよくわかりません。どなたかお答えいただけるとうれしいです。
0803nobodyさん
2008/01/23(水) 14:59:42ID:???$str = ($s->sjis) - 'imode';
と書いたのと同じだな。いちおうエラーにはならないが、
use strictとuse warningsを使ってればいろいろ怒られる
のではまらないですむパターンの間違いなので、なぜ
使わなかったのかよく反省しとけ。
0804nobodyさん
2008/01/23(水) 15:07:11ID:???試してみましたところ、こんどは??????という文字列が返ってきました。
いま現在、iモードシュミレータを使って表示させているのですが、これは携帯を使ってテストしないのが悪いのでしょうか?
0805nobodyさん
2008/01/23(水) 15:27:16ID:???iモードシミュレータとなるとそれはもはやPerlの話題ではないな。
適切なところへいって質問するほうがお互いのため。
その前に$strを16進ダンプ表示してみて期待したバイト列になってるか
どうかぐらいは確認しといた方がいいとは思うが。
0806791
2008/01/23(水) 21:46:29ID:fM6ljyqYいろいろな案有難うございます。
一つづつ試してみます。
どうもありがとうございました。
0807nobodyさん
2008/01/23(水) 23:17:40ID:FgvU3OwA>>775をいじってくれる
心のやさしくて暇なやつはおらんのか
サーバに日本語のファイルをUPしたいんだ
0808nobodyさん
2008/01/23(水) 23:18:24ID:???0809プログラミング歴2ヶ月
2008/01/23(水) 23:19:54ID:bNex267Nいざwebにアップロードしてみると、ディレクトリの生成をやってくれません。
この場合、原因として何が考えられるのでしょうか。
ちなみにperlのパスはあっています。
mkdirなどでググって見ても、よくわかりませんでした。。。
ヒントだけでもいいんで、どなたかよろしくお願いします。(_ _)
0812プログラミング歴2ヶ月
2008/01/24(木) 00:03:36ID:+24Wb9Puご親切にご教授いただきありがとうございます。
先ほど、パーミッションを変更したところ解決いたしまして、とても感謝しております。
しかしそれと同時に新たな問題が浮上してきまして、困っています。。。
mkdirを行った後に、とあるdatファイルに文章を出力しているのですが、
出力した後の改行コードが■になってしまいます。。。
こっちもローカルホストではうまくいっていたのに、なぜなんでしょう??
0813nobodyさん
2008/01/24(木) 00:05:46ID:???ttp://www.tohoho-web.com/wwwxx011.htm
0814nobodyさん
2008/01/24(木) 00:28:39ID:???ヒント
・UNIXではLF、WindowsではCRLF。
・\nはLR、\r\nがCRLF。
・FTPのアスキーモードで転送すると自動相互変換してくれる。
0815プログラミング歴2ヶ月
2008/01/24(木) 00:53:36ID:+24Wb9Pu解決しました。ありがとうございました!
マジに感謝してます。
0816nobodyさん
2008/01/24(木) 10:27:32ID:???例えばxyzzyみたいに、改行コードを確認したり、変更できる
テキストエディタを入れておいたほうがいいよ。
0817nobodyさん
2008/01/24(木) 10:41:34ID:???0818nobodyさん
2008/01/26(土) 19:03:18ID:???0819nobodyさん
2008/01/28(月) 12:09:42ID:fVIm37qB簡単なPerl/CGIのプログラム(掲示板など)が書ける程度のレベルです。
mod_perlの超初心者向けの解説本、ウェブサイトがあれば教えてください。
できれば日本語でお願いします。
あと、今は退社された方が書いたらしい、現在稼動中のプログラムのソースを入手したんですが、
ソースの最後に
exit;
って思いっきり書いてたりするんですが、これって大丈夫なのでしょうか?
0820nobodyさん
2008/01/28(月) 12:53:50ID:???0821nobodyさん
2008/01/28(月) 15:21:58ID:eRROoQGzこれに関して、オーバーライドを利用したコードを書いているとき、
ある関数(この場合はexit)が、どのパッケージに属しているかを調べる方法があればお願いします。
0822nobodyさん
2008/01/28(月) 16:14:02ID:Fd8GryNXたとえば、TeraTermPro with SSHの設定でcodepageというのがあります。
ほかにもありますがこれを例にとります。
ヘルプやgoogle検索で調べても引っかからないのでここでおたずねします。
locale=japanese codepage=932
だとどうもShift-jisの設定をなんらかの形でやるみたいです(付属ヘルプ)。
locale=japanese codepage=65001
だとutf-8みたいです。
それで、私のマシンはWindowsなので、codepage=932で統一しておけばいいんでしょうか。
ケースバイケースなのでしょうか。
相手マシンがFreeBSDで通信することがあるのですが、その場合は、
設定の漢字受信/送信ともutf-8でokですか??
unixだとeucとも聞きますが、最近はutf-8化したほうがいいようなことも聞きます。
ので、よくわかりません。
もちろん、ソースを何で書くかはケースバイケースなのは知っています。
分からないのは、TeraTermの設定で
漢字受信/送信 と codepage という2つのよく分からない項目がある点です。
TeraTermは有名なので当然スレがあるかと思ったらありませんでした。
それにperlプログラミングでよく登場するので、ここで質問させていただきました
0823nobodyさん
2008/01/28(月) 16:22:56ID:???実はそう言われてるけど逆で、exit(0)はダメだけどexitなら問題ない、
最近のヤツはどっちでもいい(具体的なバージョンはか書かれてない)、
色々と情報が混ざってて、調べれば調べるほど混乱してきた orz
0824nobodyさん
2008/01/28(月) 17:37:21ID:???0825nobodyさん
2008/01/28(月) 18:19:41ID:???0826nobodyさん
2008/01/28(月) 18:33:58ID:???思うように行きません。
$name =~ tr/ぁ-ん/ァ-ン/
一度、sjisやらecuやらに変換して、文字コードで置換させないと駄目でしょうか
0827nobodyさん
2008/01/28(月) 18:39:31ID:???0828nobodyさん
2008/01/28(月) 18:55:50ID:???そんなことはない。
use utf8してないとかdecodeしてなくて$nameがバイトのままとか
そういうあたりじゃねーの?
use utf8;
binmode STDOUT, ":encoding(utf8)";
foreach (ord('ぁ') .. ord('ん')) {
my $h = my $k = chr($_);
$k =~ tr/ぁ-ん/ァ-ン/;
printf "%x %s %s\n", $_, $h, $k;
}
0829nobodyさん
2008/01/28(月) 19:04:20ID:???> TeraTermは有名なので当然スレがあるかと思ったらありませんでした。
テラターム
http://pc11.2ch.net/test/read.cgi/linux/1012915309/
0831nobodyさん
2008/01/28(月) 21:13:04ID:???0832nobodyさん
2008/01/30(水) 17:37:10ID:irpAKk1Dその処理結果をファイルにしてデスクトップ上に出力したいのですが、
デスクトップまでのパスをどう取得すればいいか分かりません。
ログインユーザ毎にデスクトップのパスが変わってしまうので、
そのあたりを上手く解決できる方法があれば知りたいです。
0833nobodyさん
2008/01/30(水) 18:10:39ID:???0834nobodyさん
2008/01/30(水) 18:43:24ID:???use Win32::OLE;
my $sh = Win32::OLE->new('WScript.Shell');
print $sh->SpecialFolders("Desktop");
use strict;use warnings;
use Win32 qw/CSIDL_DESKTOP/;
print Win32::GetFolderPath( &CSIDL_DESKTOP );
0835nobodyさん
2008/01/30(水) 21:04:32ID:FClDhuIRは通るんですが、
no strict 'refs'; require "Hoge";
が通りません。Can't locateとなります。
文字列からrequireするにはどう書いたらよいでしょうか。
0836nobodyさん
2008/01/30(水) 21:12:10ID:???0837nobodyさん
2008/01/30(水) 21:17:18ID:???Hogeはあるつもりなんですが、前者と後者は同じものを指してないですか?
0838nobodyさん
2008/01/30(水) 21:29:04ID:???0839832
2008/01/30(水) 21:59:46ID:???システム環境変数とユーザー環境変数ってやつですよね。
ここにあらかじめデスクトップへのパスを設定するという事でしょうか?
>>834
ソースありがとうございます。
実際に実行してみたんですが、CGIとして実行すると
SYSTEM ユーザ名義で実行され、ログインユーザでのパスが取れませんでした。
DOS窓から実行するとバッチリなんですが…。
少し調べた所、WMIで実現できそうな気がしてきたので
そちらを当たってみようと思います。ありがとうございました。
0840nobodyさん
2008/01/30(水) 22:29:21ID:???以前は日本語の検索の時、EUCを使わなくてはいけないとかあったと
思いますが、普通にshift-jisで書いて、パターンマッチも問題なし
だったのですが、今のバージョンのPerlは文字コードとか気にしなくて
良くなりました?それともたまたま文字化けしなかっただけ?
0842nobodyさん
2008/01/30(水) 23:05:02ID:???だめっすね。
まだjcode.plとか使ってるんですかね。
実は全てunicodeで問題なくなったりしてますか?
日本語のパターンマッチで注意することとかまとめた
いいページ知ってたら教えてください。
0843nobodyさん
2008/01/30(水) 23:12:08ID:???一部の文字列を使う時だけ注意をして、POSTで受け取った文字列を
jcode.pl 使うという程度でも、Shift-JISでいけることはいける。
ttp://www.shtml.jp/mojibake/sjis_cgi.html
0844nobodyさん
2008/01/30(水) 23:19:37ID:???thxです。しばらく離れていましたが、少し思い出しました。
結局Perlはその間進化していなかったのね。
0845nobodyさん
2008/01/30(水) 23:19:46ID:???システムでも記号とか入力しようとすると駄目な場合もあるからな。
シビアに全部に対応とか考えなくても良いのではと思ったり。
0846nobodyさん
2008/01/30(水) 23:22:28ID:???Perl は 5 が出てから結構経っているはずだよ。
3 年前に触ったのも 5 じゃないかな?
そこまで大きな変化が無いからこそ、という
メリットももあるんだけどね。
次に 6 には、構文とか大きな変化があるらしいから
そっちに期待だなw
0847nobodyさん
2008/01/30(水) 23:45:06ID:???「This」にマッチしたら、
htmlの色のタグを付けて<font color>This</font>と置換する場合、
これをやると次に「This is」に色を付けたい場合マッチしなくなる
のですが、上手いやり方あります? 先に「This is」の置換を
する位しか思いつかない。
0848nobodyさん
2008/01/31(木) 01:44:59ID:???Thisにマッチしたとき、
いきなり This → <tag>This</tag> と変換するのではなく、例えば「1番目の単語にマッチした」という情報だけ保存しておく。
で、最後にまとめて置換する。
Perlの持つ強力な文字列操作が活かされないという欠点はあるが。
0849nobodyさん
2008/01/31(木) 07:23:10ID:???$out_str = '<font color="red">' . $in_str . "</font>";
ここで $str に検索対象の文章を入れる。
$str =~ s/$in_str/$out_str/g;
0850nobodyさん
2008/01/31(木) 09:05:07ID:???それ同一箇所を何度も置換する場合でも大丈夫?
0852nobodyさん
2008/01/31(木) 09:59:40ID:???<tag>This</tag> is a pen.
が$strに入ったら、次にThis isは一致しないでしょ?
0853nobodyさん
2008/01/31(木) 10:21:21ID:???その優先度はあなた次第だもの。
0854nobodyさん
2008/01/31(木) 12:45:35ID:???一括してやるなら長い方を先にすればいい
0855nobodyさん
2008/01/31(木) 13:03:27ID:???↓
<tag>This is</tag> a pen.
このあとに、「tag」というフレーズで検索する可能性は否定できない。
いや、細かくマッチ条件つければ別だろうけど。
0856nobodyさん
2008/01/31(木) 21:12:55ID:ZyBf2Z6K以下のようにやってもだめでした。
&subtest(@arr,$str,@arr2);
function () {
my (@arr,$str,@arr2) = @_;
}
0857nobodyさん
2008/01/31(木) 22:22:57ID:???(@arr,$str,@arr2)は新しい配列として扱われるので、サブルーチン側では区切りが分からん。
arrとarr2は参照を渡すとか、要素数が分かってるならサブルーチン側で@_をspliceするとかがいいかも
0858nobodyさん
2008/02/01(金) 00:10:05ID:???長い方を先にした場合、
ThisとThis isとis a penがあって、
結論は<font>This is a pen</font>に色を付けたいのだ。
848の方法かなぁ。
ただ、入力テキストが100M位、マッチする検索リストが1万個とかなので、
動かせるか・・・。
Perlよりwordマクロとかの方がいいのかなぁ。
wordなら何度重なって色付けても問題ないし・・・。
■ このスレッドは過去ログ倉庫に格納されています