Perlコーディング初心者質問スレ Part 45
■ このスレッドは過去ログ倉庫に格納されています
0001988
2005/12/08(木) 22:48:27ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0334nobodyさん
2006/01/04(水) 12:42:50ID:???sub get_info {
my ($page, $key) = @_;
my %info = map { split(/=/, $_, 2) } split(/\n/, $infobase{$page});
return $info{$key};
}
0336nobodyさん
2006/01/04(水) 14:00:43ID:???use FileHandle;
use Data::Dumper;
my $fh = FileHandle->new("sample.txt") or die;
flock($fh, 1);
chomp(my @lines = $fh->getlines());
$fh->close();
my @ini_set;
my $temp = {};
foreach my $line (@lines, ''){
if ($line){
my ($key, $value) = split(/=/, $line, 2);
$temp->{$key} ||= $value;
} else {
keys(%{$temp}) and push(@ini_set, $temp);
$temp = {};
}
}
print Dumper(\@ini_set);
こんな感じでどうなん。
0337nobodyさん
2006/01/04(水) 14:34:56ID:???use strict;
my $format = qr/^\s*([^=]+)\s*=\s*(.*)$/;
my $file = $ARGV[0] || './sample.txt';
-f $file || die "No such file.\n";
open FH, '<' . $file or die $!;
# local $/ = ''; # 段落モード
# while (<FH>) {
# my %data = /$format/gm; # 空行が Record Separator
# print map("$_:[$data{$_}]\n", sort keys %data), "---------\n";
# }
while (<FH>) {
/$format/ || next; # フォーマットに合わない行が Record Separator
my %data;
do { $data{$1} = $2 } while <FH> =~ //; # 改行が Field Separator
print map("$_:[$data{$_}]\n", sort keys %data), "---------\n";
}
__END__
参考: http://search.cpan.org/modlist/Option_Parameter_Config_Processing
0338nobodyさん
2006/01/04(水) 16:22:38ID:PpH7t0Dmプログラムってないかな?
0339nobodyさん
2006/01/04(水) 17:47:39ID:???>>324
【CGI】こんなCGI探してますver.19
http://pc8.2ch.net/test/read.cgi/hp/1134255607/
0340323
2006/01/04(水) 19:59:55ID:???すべて試してみて一番わかりやすいのを参考にさせていただきます。
本当にありがとうございました。
0341nobodyさん
2006/01/05(木) 04:32:22ID:+yKIo2wfこの本を見てて、cryptの暗号化のキー(第2引数ですかね?)は、2文字異常渡しても無視されますと書いてありました。
僕が、今手にして自分で解読してみてるスクリプトに以下のようなものがあったんですけど、(出所はちょっと忘れてしまいました)
$time=crypt($time,int(rand 100));
第2引数が100になることもあるということは、3文字だから無視されますよね?
これって、
$time=crypt($time,int(rand 99));
に書き換えた方がいいんですか?
0342nobodyさん
2006/01/05(木) 09:52:45ID:???>>162-辺りで出ているがrand 100は0以上100"未満"なのでint(rand 100)が100を取る事は無い。
しかし整数そのまま放りこむのはsaltの強度が落ちるからあまり良いとは言えないなぁ
因みにニ文字以上が切り捨てられるという仕様は暗号化した物の頭ニ文字はsaltなのでこうやって使う
$crypted eq crypt($pass, $crypted)
0343nobodyさん
2006/01/05(木) 10:00:36ID:???あ、無視の意味を勘違いしているようなので補足
無視されるのは余分な部分であって全体じゃないよ
abcdef -> a
100 -> 10
0344nobodyさん
2006/01/05(木) 10:02:43ID:???0346nobodyさん
2006/01/05(木) 17:26:03ID:+yKIo2wfレス感謝!
でも
abcdef -> a
の部分は
abcdef -> ab
じゃないの?2文字でしょ?
文字の場合は1字とかじゃないよね?
0348nobodyさん
2006/01/05(木) 18:23:39ID:+yKIo2wfうおぉおぉおぉおおぉぉ!!
自分でちゃんと理解してたーーー!!
ウレシーーーー!!
マジで嬉しい!
>>347さん、本当にありがとうね!
あなたのお陰で、また1つ理解できました。
この感動を今の俺みたいな人に分けてあげたい。
頑張ろっと。
0349nobodyさん
2006/01/05(木) 21:27:34ID:???> 頑張ろっと。
今時 Perl ができる人間なんて、腐る程いますよ。
0350nobodyさん
2006/01/05(木) 21:34:34ID:???0351nobodyさん
2006/01/05(木) 23:39:25ID:+yKIo2wfその腐った人の中に入りたいです!
>>350
初心者。。。?
んー、ごめん。
どういう意味だったのか分からなかったんだけど^^;
0353nobodyさん
2006/01/06(金) 00:41:22ID:???0354nobodyさん
2006/01/06(金) 02:51:26ID:???utf8フラグつける方法ってあるでしょうか。
http://www.kt.rim.or.jp/~kbk/perl-5.8/perlunicode585.html
上記サイトにFetch関数というラッパーが紹介されてましたが、2002年の記事なので
現在はもっとスマートな方法があるのでしょうか。
0356nobodyさん
2006/01/06(金) 04:00:45ID:iupFgDGkすみません^^;
出来る人間にと書けば良かったです!
ご指摘ありがとう!
ここの人たちは優しい人が多いんですね!
ここの住人になりたいです!
0357nobodyさん
2006/01/06(金) 04:50:15ID:???ありがとうございます。できたっぽいです。2日ググり続けました。
DBI->connectのオプションでpg_enable_utf8=>1で自動的にフラグがたつようです。
DBIのドキュメントにも見つけられなく、海外のどこの馬の骨とも分からない人の
ソースからパクッてきただけなので詳細はよく分かりません。詳しいサイトご存知
でしたら教えてください。
0358nobodyさん
2006/01/06(金) 05:35:08ID:???0359nobodyさん
2006/01/06(金) 05:51:05ID:???http://search.cpan.org/~dbdpg/DBD-Pg-1.43/Pg.pm
DBIのconnectの第四引数はDBDに渡されるのよ
各DBD固有のものはDBIのドキュメントをいくら読んでも載ってません
0360nobodyさん
2006/01/06(金) 08:04:41ID:???This attribute is experimental and may be subject to change.
とのことで、使ってる人も少ないんですね。
0361nobodyさん
2006/01/07(土) 00:20:22ID:???sysopenのモードを変数で渡すことはできませんか?
use Fcntl;
my @mode = (O_RDWR,O_CREAT);
sysopen(FH,"file",@mode); #1
sysopen(FH,"file",join('|',@mode)); #2
などとやってみたのですがどうにも渡りません。
直接定数を決め打ちしたり、定数のリストを渡すとうまくいくのですが、配列を渡すとなぜかだめなようです。
検索してみても決めうちの例しかでていませんし、
perldoc sysopenというのもないようで詰まってしまいました…。
0363nobodyさん
2006/01/07(土) 00:55:27ID:???「|」 はビット演算子のorだ。だから文字列でjoinは見当違い。
O_RDWRとかは定数。試しにprintしてみな。
そんな事も知らずにsysopenをどう使うのか疑問だ。
0364nobodyさん
2006/01/07(土) 01:16:56ID:???できました。どうもありがとう。
|がビット演算子というのを知りませんでした。
なんでこんな不思議な記号で区切るのか疑問でしたが、調べ方もわからなかったので為になりました。
リストで渡すと通ったのもO_RDONLYを使ったせいなようで、
展開されて「0256」になったせいで通ってしまったようです。
sysopenを使うのも、ただどこかのサイトで
「入出力を行うだけならばopenよりも安全だ」
というので盲目的に使ってしまっただけで深い意味はありません…。
0365nobodyさん
2006/01/07(土) 03:12:37ID:???Net::FTPを使用して、多数のファイルをアップロードするスクリプトを作りました。
255個目のファイルまでは正常にアップロードできるのですが
256個目のファイルをアップロードする所でputがエラーを返し(0を返す)、正常に送れません。。
(FTPソフトを使えば問題なくアップロードできる)
何か心当たりがあれば、よろしくお願いします。
use Net::FTP;
$ftp = Net::FTP -> new($ftp_server);
$ftp -> login($ftp_id, $ftp_pass);
foreach (@filelist) {
$ftp -> put($_);
}
$ftp -> quit;
0366356
2006/01/07(土) 03:25:30ID:hRPnI9VAコテハンにしようかなと思います。
何か名前を付けてくれませんか!!
0367nobodyさん
2006/01/07(土) 03:27:45ID:???0371nobodyさん
2006/01/07(土) 04:14:13ID:snASfRD40372366
2006/01/07(土) 04:57:39ID:hRPnI9VAちょっと凹み気味です。
あんましいぢめないで下さい!
0373nobodyさん
2006/01/07(土) 05:18:10ID:???http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Remove
この記事に
>複数の処理系の改行コードを想定しなければならない場合は、
>次のようにして文字列の最後の改行を削除します.
>s/\x0D?\x0A?$//;
とありますが、これを
s/\n$//;
としたらまずいですか?
0375nobodyさん
2006/01/07(土) 05:47:04ID:???詳しくは2つ上の「改行コードを統一する」
0377nobodyさん
2006/01/07(土) 12:34:39ID:???試してみたが上手く動いたぞ。ちなみに俺の環境は
ftp鯖: CentOS + vsftpd
ActivePerl5.8.7-build813 WindowsXP からアップロードする
ファイル数 512個 ファイル名は 1,2,3,....512で中身も1,2,3,...512
で、512個すべて問題なくうP可能
とりあえず出力がうざいが、
$ftp=Net::FTP->new($ftp_server, Debug => 1);
とでもしてみたらいいんでない?
0378365
2006/01/07(土) 14:31:54ID:???試していただきありがとうごます。
エラー出力を頼りに調べた所、PASVモードを有効にすれば直るかも
http://www.perlmonks.org/?node_id=137654
ということで
$ftp = Net::FTP -> new($SET{'ftp_server'}, Passive => 1);
と変更したところ、256個目以降のファイルも正常にアップロードすることができました。
お手数掛けましたー。
0379nobodyさん
2006/01/07(土) 18:44:49ID:???エラーと見なされることが発生したら、エラー処理用のサブルーチンに飛んで、
エラーメッセージを表示して終了するようにしています。
その際、dieみたいにどこでエラーが発生したかも表示したいので、
引数でエラー内容と呼び出し元のサブルーチン名を渡しています。
&error('必須項目が未記入', 'submit') if (〜);
sub error {
my ($msg, $where) = @_;
print "Content-type: text/html\n\n";
print "エラーが発生しました。$msg at $where\n";
exit;
}
こんな感じです。ただ、これだと&errorを書くときにいちいちサブルーチン名を
指定する必要があって、面倒です。
何か良い方法はないでしょうか。それとも何か根本的に考え方が間違ってますか?
0380nobodyさん
2006/01/07(土) 19:27:38ID:???http://perldoc.jp/docs/modules/CGI.pm-2.89/CGI/Carp.pod
0382nobodyさん
2006/01/07(土) 22:25:59ID:7MUFvifm<textarea name="comment1" cols="60" rows="10"></textarea>
という文字列が現れたらその文字列を
<textarea name="comment1" cols="60" rows="10">$comment1</textarea>
に置き換えてその行を出力するということを試みています (非該当行はそのまま出力)。
最単純に
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
とやってみましたが、「name=」を含めてその行のみのそれ以降の部分だけ出力されません (以降の行は出力されます)。
このとおり実行はされますが、エラー ログには「name は予約語となる可能性があります。あるいは、name の前にオペレータが抜けてはいませんか。」と残っています。
確かに、$name や $key などは perl で頻繁に使われる語ですが、上記のスクリプト内では $name を使っていませんし、それを使っているようなモジュールも明示的には使用していません。
また、「name=」自体は HTML のフォームに関する属性なので、これの名前を変更はできません。
ちなみに
$line =~ s|"comment1" cols="60" rows="10"></textarea>|"comment1" cols="60" rows="10">$comment1</textarea>|;
や
$line =~ s|<textarea \x6Eame="comment1" cols="60" rows="10"></textarea>|<textarea \x6Eame="comment1" cols="60" rows="10">$comment1</textarea>|;
もやってみましたが、まったく同じ結果に終わります。
推測するに、置き換え行自体に「name=」が現れたら NG のようです。
また、
if ($line =~ |^(.*)"comment1" cols="60" rows="10"></textarea>(.*)$|) {
$line = $1 . "\"comment1\" cols=\"60\" rows=\"10\">" . $comment1 . "</textarea>" . $2;
}
も NG です。
解決策をお願いします。
0383nobodyさん
2006/01/07(土) 22:35:23ID:7MUFvifmとしておいて
$line =~ s|<textarea $attr="comment1" cols="60" rows="10"></textarea>|<textarea $attr="comment1" cols="60" rows="10">$comment1</textarea>|;
としても駄目でした。
前投稿のとおり置き換え文字列には name= が入っていなくても駄目なので、結局、最終的にその行自体に name= があるとすべて駄目なようです。
完全に手詰まりです。
こうしておいて、、、
s/##comment1##/$comment1/;
じゃだめなのかなぁ。。。
もしくは%sにしておいて、、、
sprintf $html_temp,$comment1;
とかとか。
0386nobodyさん
2006/01/07(土) 22:44:54ID:???0387nobodyさん
2006/01/07(土) 22:45:28ID:???0389382-383
2006/01/07(土) 23:06:50ID:5axJGSRV駄目でした。置き換え文字列には含まれなくとも行自体に name= があると駄目なようです。
>>388
そのままです。
あとは、Perl のバージョンやパスが書いてあるだけです。
0390nobodyさん
2006/01/07(土) 23:14:21ID:???あと悪いことはいわないから周りのコード晒せ。
見た感じループ内の処理みたいだからそのループ全体を。
0391382-383
2006/01/07(土) 23:16:51ID:5axJGSRVopen(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html" . \n\n;
for ($i = 0; $i < @lines; $i++) {
$line = $line[$i];
#以下、前記のとおり
print $line;
}
exit 0;
0392382-383
2006/01/07(土) 23:17:57ID:5axJGSRV○ $lines[$i]
0393nobodyさん
2006/01/07(土) 23:18:37ID:???0394382-383
2006/01/07(土) 23:27:41ID:5axJGSRV0395nobodyさん
2006/01/07(土) 23:29:19ID:7SuLco6K最近真面目にそういうお馬鹿スクリプト書く初心者が増えてきたからねぇ…
0396382-383
2006/01/07(土) 23:31:06ID:5axJGSRV0397382-383
2006/01/07(土) 23:32:39ID:5axJGSRV0398nobodyさん
2006/01/07(土) 23:34:23ID:???「初心者なので」というセリフは大嫌いだが、>>391をそのまま実行すると
print "content-type: text/html" . \n\n; でエラー。当然だがね。
0399382-383
2006/01/07(土) 23:35:54ID:5axJGSRVopen(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $line[$i];
#以下、前記のとおり
print $line;
}
exit 0;
でも先の問題は解決されません。
0400382-383
2006/01/07(土) 23:36:41ID:5axJGSRV0401nobodyさん
2006/01/07(土) 23:37:43ID:???こっちでは再現しないけど。「前記の通り」とかじゃなくてフルに書いてみ?
あとPerlのバージョン含めた実行環境も。
0402382-383
2006/01/07(土) 23:41:59ID:5axJGSRV$comment1 = "";
open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $lines[$i];
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
print $line;
}
exit 0;
駄目。
#!/usr/local/bin/perl
$comment1 = "test";
open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $lines[$i];
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
print $line;
}
exit 0;
これも駄目です。
template.html の内容と印刷結果は載せなくても大丈夫ですか。
0403nobodyさん
2006/01/07(土) 23:42:28ID:???そうすれば直ぐに答えがかえってくるんだから。
0404382-383
2006/01/07(土) 23:44:11ID:5axJGSRVこれは perl, v5.6.1 built for i386-linux です
0405382-383
2006/01/07(土) 23:46:11ID:5axJGSRV>>402 に書いたのは全行です。
テストなので、これだけしか書いていません。
これだけしか書かないうちに先の不都合が見つかりました。
もっとも、最終的にやろうとしていることはありますが、それらはまだ書いていません。
この問題の解決が先なので。
0406nobodyさん
2006/01/07(土) 23:47:27ID:???0407382-383
2006/01/07(土) 23:48:07ID:5axJGSRV#!/usr/local/bin/perl
$comment1 = "";
open(TEMPLATE, "./template.html");
@lines = <TEMPLATE>;
close(TEMPLATE);
print "content-type: text/html\n\n";
for ($i = 0; $i < @lines; $i++) {
$line = $lines[$i];
$line =~ s|<textarea name="comment1" cols="60" rows="10"></textarea>|<textarea name="comment1" cols="60" rows="10">$comment1</textarea>|;
print $line;
}
exit 0;
0408nobodyさん
2006/01/07(土) 23:48:16ID:???前者も後者も正常に実行できている。ソースを見てもスクリプトの問題とは思えない。
エラーの出方から見てえらく特殊な環境で実行しているようにしか思えない。
perlバージョンだけでなく、OSのバージョンも。
0409382-383
2006/01/07(土) 23:50:31ID:5axJGSRV「雛形の」という意味ですか。
であれば、違います。
雛形で言えば、該当行の下には
</form>
</body>
</html>
などの行もあります。
0410nobodyさん
2006/01/07(土) 23:50:41ID:???コマンドラインで実行できないの?
0411382-383
2006/01/07(土) 23:56:08ID:5axJGSRV0414382-383
2006/01/07(土) 23:58:04ID:5axJGSRVRed Hat Linux 7.2 2.96-118.7.2
0415382-383
2006/01/08(日) 00:00:24ID:0I8ISceR日ごとに書庫化されています。
スクリプトを実行するたびに書庫にログが追加されています。
0416nobodyさん
2006/01/08(日) 00:01:40ID:???RedHat7.2+perl5.6.1で「コマンドライン実行」した結果は?
「name は予約語となる可能性があります。あるいは、name の前にオペレータが抜けてはいませんか。」
なんて表示が日本語で出てくるわけじゃないよな?
0417382-383
2006/01/08(日) 00:02:34ID:0I8ISceR必要なら言ってください。
0418382-383
2006/01/08(日) 00:03:30ID:0I8ISceRFAQ に「当サーバではコンソールの使用を認めておりません。」とあります。
参考になりますか。
0420382-383
2006/01/08(日) 00:05:19ID:0I8ISceRどういうことですか。
0421nobodyさん
2006/01/08(日) 00:10:14ID:???あと自作CGIはローカルに実行環境を持って、そこでテストしてからレン鯖に持っていくのが常識。
で、結論から言うと>>402のスクリプトに異常はない。これでエラーが出てるなら
perl以外の問題である非常に高い。レン鯖の名前を出せるようなら、親切な人が
検証してくれる可能性もあるが。
0422nobodyさん
2006/01/08(日) 00:10:29ID:???市ねってことでしょ。まさか自分のPCにPerlも入れてない?
0423nobodyさん
2006/01/08(日) 00:11:03ID:???0424nobodyさん
2006/01/08(日) 00:18:25ID:???0425nobodyさん
2006/01/08(日) 00:22:07ID:???初心者回答者は答えられない言い訳を質問者に転嫁することが多いですね
0426nobodyさん
2006/01/08(日) 00:22:27ID:???ですが何か?
0427nobodyさん
2006/01/08(日) 00:28:21ID:???0428nobodyさん
2006/01/08(日) 00:29:43ID:???0431nobodyさん
2006/01/08(日) 01:14:47ID:???0432nobodyさん
2006/01/08(日) 01:17:17ID:???■ このスレッドは過去ログ倉庫に格納されています