Perlコーディング初心者質問スレ Part 59
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/02/16(月) 11:42:29ID:gvPTpodw【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0542nobodyさん
2009/05/23(土) 20:28:09ID:???0543nobodyさん
2009/05/23(土) 20:36:10ID:???0544nobodyさん
2009/05/23(土) 21:58:57ID:???やあ、弾先生のブログは読んでるかい?
いささか古いけど、Jcode.pmの代わりに使うぐらいなら丁度いいかもね。
http://blog.livedoor.jp/dankogai/archives/51031595.html
あとは、マニュアルを読んでほしい。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html
http://www.kt.rim.or.jp/~kbk/perl-5.8/encode.html
http://www.kt.rim.or.jp/~kbk/perl-5.8/open.html
http://www.kt.rim.or.jp/~kbk/perl-5.8/guess.html
0545nobodyさん
2009/05/24(日) 03:43:48ID:51A7n5Gq年の第何週という情報からその週が何月何日から何月何日かを求めたいのですが、
わかりません。 どうやって求めたらいいでしょう。
例えば、2009年第2週という情報からその週の初めの日である1/5
その週の最後の日である1/11を算出したいのですが・・(週は月曜始まり)
なかなか探しても見つかりません。
localtime,POSIXあたりを使ってできませんかね?
どなたかわかる方いましたらよろしくお願いします。
0546nobodyさん
2009/05/24(日) 04:01:51ID:???0547nobodyさん
2009/05/24(日) 14:21:03ID:???二次元配列の特定要素をjoinしたいんですが、
ベタに回して代入する以外の方法で、そういうことって可能でしょうか?
my $result;
my @array = (["id1", "name1"], ["id2", "name2"], ["id3", "name3"], ["id4", "name4"], ["id5", "name5"]);
#「,」でjoin後
$result ⇒ "id1,id2,id3,id4,id5"
0548nobodyさん
2009/05/24(日) 14:41:40ID:???0549nobodyさん
2009/05/24(日) 14:53:03ID:???ありがとうございます!
冷静に考えれば、内部的にはどっちにしろ回すんですね…
とりあえず下記のようにだいぶすっきりしました。
-------
my @aNotIn;
foreach (@$rItem) {
push @aNotIn, $$_{id};
}
$sNotIn = "AND (id NOT IN(".(join ',', @aNotIn)."))";
-------
↓
-------
$sNotIn = "AND (id NOT IN(".(join(',', (map($$_{id}, @$rItem))))."))";
-------
0550nobodyさん
2009/05/27(水) 18:17:04ID:???検索される文字が変数$moziに入っており
$mozi='ARTRYI';
検索キーワードが配列の一要素に入っている状態です
$keyword[0]='y'
$keyword[0]のyが$moziのYにマッチすればOKです
index関数ではindex($content,$keyword)とやっても大文字小文字が区別できないので-1が返されてしまいます。
正規表現でoptionのiを使う場合も変数展開できず失敗します。optionのeを使うことも考えましたが、これも置換のときのみに使えるようなので、マッチングでは使えません。
$mozi =~ /$keyword[0]/i
何かよい方法はないでしょうか
0551nobodyさん
2009/05/27(水) 18:24:55ID:???でよさそうな。
0552nobodyさん
2009/05/27(水) 18:30:36ID:???use strict;
use warnings;
printf "result:%d\n",index2('ARTRYI' , 'y');
sub index2 {$_[0] =~ /$_[1]/i ? length($`) : -1}
0553nobodyさん
2009/05/27(水) 18:33:50ID:???0554nobodyさん
2009/05/27(水) 22:42:22ID:???use warnings;
my $mozi = 'ARTRYI';
my @keyword = qw(y);
print ("position:", index(uc $mozi, uc $keyword[0]), "\n");
print ("position:", index(lc $mozi, lc $keyword[0]), "\n");
print (($mozi =~ /(?=$keyword[0])/gi ? ("position:", pos($mozi)) : "no match"), "\n");
0555nobodyさん
2009/05/28(木) 10:34:19ID:???>>379
>>386
の者なんですが、また質問させてください。
map { s/^\Q$erase\E\n$//; } @datalist;
の処理によって該当箇所は問題なく消去できているのですが、
「リストの最初の行だけが2度書き込まれる」という現象が起きているみたいなのです。
1240
985
766
みたいなリストから、1240を消した時、1240が消えている代わりに
985
766
766
のように最初の行が2度重なっている、という感じです。
何か考えられるミスはありますでしょうか。
0556nobodyさん
2009/05/28(木) 10:54:29ID:???0557555
2009/05/28(木) 11:05:47ID:???失礼しました。
0558nobodyさん
2009/05/28(木) 12:52:03ID:???もっと質問の仕方を学んでください
0559nobodyさん
2009/05/28(木) 13:13:18ID:???0560nobodyさん
2009/05/28(木) 15:45:21ID:???話はそれからだ
0561nobodyさん
2009/05/28(木) 20:50:21ID:IiL6Ub9rmacbook で ActivePerlする方法お願いします
0562nobodyさん
2009/05/28(木) 21:22:06ID:???ダウソしたら勝手にマウントするんで
ActivePerl-5.10.pkg
をダボクリク。
0563nobodyさん
2009/05/28(木) 22:53:03ID:???0564nobodyさん
2009/05/29(金) 02:01:40ID:???0565nobodyさん
2009/05/29(金) 02:57:59ID:???0566nobodyさん
2009/05/29(金) 17:59:48ID:???useとrequireどちらで読み込ませればいいのでしょうか?
今一違いがよくわかりません。
0567nobodyさん
2009/05/29(金) 18:09:51ID:???0568nobodyさん
2009/05/29(金) 18:20:24ID:???コードにエラーがあった場合、
Software error: ほげほげ
という出力がブラウザに出てしまうのですが、
これを抑制してInternal Server Error等を返すようするにはどうしたらよいのでしょうか。
0569nobodyさん
2009/05/29(金) 18:33:00ID:???0570568
2009/05/29(金) 18:38:59ID:???参考にしていた入門記事の
use CGI::Carp qw(fatalsToBrowser);
をのせいだったみたいです
お手数をおかけしました。
0571nobodyさん
2009/06/05(金) 03:14:34ID:N+0uLK7Z、HP上のある特定のテーブル(枠内)に画像をUPしたり、コメントを記入
できるようにしようとしております。枠は例えば一列を(名前・画像・
コメント)としてそれぞれの会員へ割り当てます。あくまでもその枠は、
割り当てられたメンバーしか入力と更新ができない仕組みにしたいと思いま
す。画面としては、HP枠テーブル内に設置されている「更新ボタン」を押す
→パスワード入力画面(認証)→画像UP/コメント記載入力フォーム→HPに
画像UP/コメント修正反映。という形です。パスワードは、会員それぞれが
違うPWをもっていて、他人の入力可能枠に入力をしようとしてもパスワード
が合わない限り、画像UP/コメント入力ができない形です。全般的に初心者と
いうこともあり、教えていただければ助かりますが、特に行き詰っているの
が
1.会員ごとにPWを割り振り、上記のように更新場所を分けた場合、認証
CGIは会員ごとそれぞれに作成する必要があるのでしょうか。それとも、こ
のPWで認証された会員はこの場所の更新を許可させるというような設定
はできるのでしょうか。
2.フォームで入力したデータを既存のhtml形式のhpに更新処理をする
ことは可能なのでしょうか。フォームで入力したデータを
掲示板(cgi)に書き込む事はできるようですが、htmlのテーブル(枠)に
書き込む事はできるのでしょうか。
3.フォーム(cgi)で入力したデータを指定した場所へ書き込むにはどう
したらよろしいのでしょうか。指定の方法はどうやればよろしいのでしょう
か
以上です。
0572nobodyさん
2009/06/05(金) 05:00:07ID:???複数ユーザーで使える画廊のようなページですかね
まだバイトの身なので見当違いなことを言ってるかもしれませんがアドバイスを。。。
1はCGI2つで実現できると思います。
例えば、画廊ページをhtmlで作り、認証フォームページ表示CGIを作り、実際の処理を認証CGIでするとします
画廊ページからは更新をクリックしたときに、認証フォームページ表示CGIに枠IDを渡します
認証フォームページ表示CGIでは、ユーザーID、ユーザーパスワードなど必要事項を入力する欄とともに、
このcgiに渡された枠IDを hidden 属性で渡せるフォームを出力します
これで3も解決です
認証CGI側ではあらかじめ枠IDとユーザーID・ユーザーパスワードを関連付けたデータを持っておき、
(多分選択肢はデータベースに入れるか他のファイルに書いておくかcgiに直書きかくらい)
フォームから渡ってきたデータと照合します
2の画像の更新については、画廊ページの雛形をまず用意しておき、(画像の入るところなどには{Image}のような仮の文字列を入れておく)
認証CGI側で読み込み本来の画像のurlなどに置換して出力します
こんな感じでいけるかと
こんな説明で分かりますかね?
0573nobodyさん
2009/06/05(金) 17:20:18ID:N+0uLK7Zのイメージはあっております。私が素人のため、ぱっと読んだだけでは、
よく分かりませんが、hidden属性等キーワードをいくつかいただきましたので、
少し、やり方などを調べてみます。また、分からないことがありましたらよろしく
お願いします。
0574nobodyさん
2009/06/06(土) 16:54:15ID:???\t区切りにして保存したdatファイルからデータを読み込む際に
foreachでハッシュに入れて$example{$hoge}{$huga}で読み込めばいいのか、
foreach+正規表現使ってdatから1行だけ抜き出すのがいいのか、どちらがいいやり方なのでしょうか。
0575nobodyさん
2009/06/06(土) 16:59:43ID:???0578nobodyさん
2009/06/06(土) 18:43:32ID:???grep って foreach みたいにメモリにがっつり読み込むの?
それとも While みたいに逐一読みに行ってくれるの?
0579nobodyさん
2009/06/06(土) 18:49:55ID:???0580nobodyさん
2009/06/06(土) 18:55:37ID:???0582nobodyさん
2009/06/06(土) 19:10:32ID:???フィルタみたいなものだから、がっつりメモリ取るよ。
つか、Perlは基本的に何でもリスト展開してから動くように出来てる。
foreachの昇順の範囲演算子は最適化されるけど。
0583nobodyさん
2009/06/07(日) 00:15:37ID:???端折りすぎた感のある文を読み取ってくれてありがとう
やっぱそうなってるんですね。
数メガならだいじょうだろうけど、十数メガ〜数十メガの TSV を扱うにあたって考えてるとこだったので。
やっぱ DB にプッシュしろってとこかな ^^;
0586nobodyさん
2009/06/07(日) 02:47:53ID:???鯖屋が気づいてないだけって可能性もあるな
美味しくいただいちゃいましょう
0587nobodyさん
2009/06/07(日) 13:52:57ID:???やりたいことは、@before = ('a', 'b', 'c')とう配列があったときに、
”この配列の要素”をkey、”その配列要素の場所”をvaluとしてハッシュを作ることです。
今はmapの外に$iを用意して下記の様にしています。
my @before = ('a', 'b', 'c');
my $i=-1;
my @after = map { ++$i => $_ } @before;
この$iを使わずに実現する方法があったら教えて欲しいです。
この$iがとれない様であれば、forでやった方がキレイかなと思ってしまいます。
0588nobodyさん
2009/06/07(日) 13:54:15ID:???× @after
○ %after
0589nobodyさん
2009/06/07(日) 14:03:51ID:???0593nobodyさん
2009/06/07(日) 15:09:57ID:???$after{$_} = $before[$_] for 0 .. $#before;
0594nobodyさん
2009/06/07(日) 16:38:29ID:???forwardメソッドで呼ばれるメソッドに
引数を渡す際に複数の変数を渡したいと思っています。
このときqw/$a $b/と書くと変数展開されませんし、
qq/$a $b/と書くと渡される値が"$aの中身 $bの中身"という1つの変数になってしまいます。
これを$a,$bそれぞれの値として渡すにはどのようにすればよろしいでしょうか?
0595nobodyさん
2009/06/07(日) 23:16:10ID:???sub foo : Private {
my $c = shift;
my $args = shift;
my $a = $args->[0];
my $b = $args->[1];
}
????
}
0596nobodyさん
2009/06/07(日) 23:23:24ID:???Test とか Class とかが知りたいです。
0597594
2009/06/07(日) 23:53:56ID:???その方法でうまくいきました。
ありがとうございました。
いろいろな形を試してみて、
( 'foo', [$a],[$b] )の形で動いたので
とりあえずこの方法でやっていこうかと思っていました。
0598nobodyさん
2009/06/08(月) 00:08:41ID:???そのまんま、cpanをby-moduleで見るのじゃあかんの?
ttp://www.cpan.org/modules/by-module/
それともこういう話?
ttp://d.hatena.ne.jp/yappo/20081010/1223630386
0599nobodyさん
2009/06/08(月) 00:39:27ID:???cpan.orgの方のページで解決しました。そんな便利なところがあると知りませんでしたorz
ありがとうございました。
0600nobodyさん
2009/06/08(月) 20:56:10ID:???例えば以下のようなハッシュの配列をソートしたいのですが、
my @member = (
{ 'name' => 'SUZUKI', 'point' => 80, 'pref' => 'TOKYO', 'flag' => '1'},
{ 'name' => 'TANAKA', 'point' => 100, 'pref' => 'OSAKA', 'flag' => '1' },
{ 'name' => 'SATOH', 'point' => 100, 'pref' => 'TOKYO', 'flag' => '0' },
);
1.ハッシュの'name'の値の昇順で配列をソートするにはどうすればよいでしょうか?
2.ハッシュの'flag'の昇順・'pref'の昇順で配列をソートするにはどうすればよいでしょうか?
3.ハッシュの'pref'の昇順・'point'の降順で配列をソートするにはどうすればよいでしょうか?
よろしくお願いします。
0601nobodyさん
2009/06/08(月) 21:13:22ID:???@member= sort{$a->{flag}<=>$b->{flag} || $a->{pref}cmp$b->{pref}}@member;
@member= sort{$a->{pref}cmp$b->{pref} || $b->{point}<=>$a->{point}}@member;
簡単な宿題だな
0603nobodyさん
2009/06/10(水) 20:00:53ID:???なぜかPerlのオートフラッシュが有効にならなくなってしまいました。
Debianをetchからlennyに変更したのでバージョン関係の
問題のような気もするのですが解決策が見つかりません…
何かご存じの方がいたら教えてください。
環境は下記のような感じです。
Debian/lenny Apache/2.2.9 mod_perl/2.0.4 Perl/v5.10.0
よろしくお願いします。
0604nobodyさん
2009/06/11(木) 04:02:08ID:???アップロードできる形式はgif、png、jpegで、
アップロードすると(ユーザーID).gifのような名前になります。
アイコンを更新する場合、アップロード前に
古いアイコンを削除する必要があるので、以下のように書きました。
opendir DIR, "./icon" || die("directory open error");
my @icons = readdir DIR;
@icons = grep $_ =~ /$id/, @icons;
closedir DIR || die("directory close error");
foreach my $icon (@icons) {
unlink "./icon/" . $icon;
}
ところが、これを実行したところ、プログラムがそこで止まってしまいます。
エラー等は吐かずにただ止まってしまうので、原因が分かりません。
$idとマッチするファイル名を@iconsに集めるまでは上手くいっているようなので
foreach以降に問題があるようですが、解決策がどうしても見つかりません。
どこに問題があるかご存知の方がいましたら、ご教示ください。
よろしくお願いします。
0605nobodyさん
2009/06/11(木) 08:20:11ID:???opendir DIR, "./icon" || die("directory open error");
while (my $icon = readdir DIR) {
unlink "./icon/" . $icon or die $! if /^$id\.(?:gif|png|jpe?g$)/i;
}
closedir DIR || die("directory close error");
ユーザー増えると遅くなるからディレクトリなめるやり方は良くないよ
0606nobodyさん
2009/06/11(木) 09:00:08ID:???メモリ使用量の問題はあるが。
opendir DIR, "./icon" || die("directory open error"); これと
opendir(DIR, "./icon" || die("directory open error")); これは
等価なので、括弧使って優先順位を変えるか、優先順位の低いorを使う。
あと、複数ファイルをまとめて消した方がサーバに優しいと思われ。
0607nobodyさん
2009/06/11(木) 10:11:35ID:???closedirに失敗してエラーで止まっているに100カノッサ。
実行時のカレントディレクトリの位置が期待したところと違うか
パーミッション関係かどっちかあたりかな。
0608nobodyさん
2009/06/11(木) 11:59:18ID:???書き直してて気が付いたことを。
ID の割り当てがどうなってるかわかりませんが、例えば ID が 60 って人がファイルをアップしたとしますよね?
600 の人も 6000 の人も 160 の人もファイルが上書きされたり、消されたりするので、そのマッチの仕方はやめた方がいいです。
またユーザーアイコンが1つしか無さそうなので、-e でファイルの有無を確認してから作業したほうがいいかと思います。
0610nobodyさん
2009/06/11(木) 12:17:45ID:???0612nobodyさん
2009/06/11(木) 12:19:39ID:???my $newicon; # ここに既に新しいファイルデータが入ってるとする
my $newfext; # 新しいファイルの拡張子
my $userid = 60;
# ファイル検索
my $userfname = '';
foreach (@fext){ $userfname = "./icon/$userid.$_" if -e "./icon/$userid.$_" }
# 仮出力
if(open(OUTFH, '>', "./tmp/$userfname.tmp")){
binmode OUFH;
print OUTFH $newicon;
close(OUTFH);
# 移動
move("./tmp/$userfname.tmp", "$userid.$newfext");
}
こんな感じか
0613nobodyさん
2009/06/11(木) 13:07:23ID:???その名前を $userid / 100 とかにするのも、運用回避としてはアリか。
0614nobodyさん
2009/06/11(木) 13:36:13ID:???my $complete = unlink(map{ "./icon/$id.$_" } qw(gif png jpg jpeg));
こんなでもいけるだろうけど。
0615604
2009/06/11(木) 14:30:45ID:???>>606さんのご指摘を受け、上記部分以外も含め open および close まわりは
すべて or に修正いたしました。
また、IDですが、アルファベット3文字+数字5文字の固定長にしており
ID発行時に重複もチェックしておりますので、
>>608さんのご指摘のようなIDマッチの重複はありません。
それでもまだ止まるので、もう少し止まる箇所を絞り込んでみたのですが、
どうもunlinkで止まっているようです。
unlinkで止まる原因にはどういったものが考えられますでしょうか。
0616nobodyさん
2009/06/11(木) 15:49:34ID:???0617nobodyさん
2009/06/11(木) 15:50:59ID:???「そんなにユーザー居ないし」でスクリプト組むのはやめたほうがいいですよ
0618nobodyさん
2009/06/11(木) 16:21:44ID:???だけにして実行するとかrm $fileでコマンドラインから
は消えるのかとかして原因の切り分けしろよ。
止まるなんて抽象的な表現じゃ分かんないだろ
0619nobodyさん
2009/06/11(木) 17:33:08ID:???読み込んだファイルの'key'という文字が出てくる次の行から
アウトプットさせたいんだが、うまくいかないです。
$flag = 0;
while($line = <IN1>){
chomp $line;
if($line =~ m/^key/){
$flag = 1;
print OUT1 $flag;
}
}
while($line){
if($flag == 1){
print OUT1 "$line\n";
}
}
みたいな感じで書いてみたんですが
if($line =~ m/key/)が認めらんねぇ、みたいなこと言われました。
どうしたらうまくいくか、教えてください。
0620nobodyさん
2009/06/11(木) 17:50:32ID:???0621nobodyさん
2009/06/11(木) 17:56:42ID:???while(my $line = <IN1>){
print OUT1 $line if $flag;
$flag = 1 if $line =~ /key/;
}
試してないけど、これでおk
0622nobodyさん
2009/06/11(木) 18:05:02ID:???行の終わりに全角スペースが入ってたから、それが原因だと思う。
全角スペースを可視化できるエディタを使うといいよ。
0624619
2009/06/11(木) 18:16:41ID:???皆、ありがとうございます。
>>621さんのプログラムで早速やってみたところ、なぜか
print OUT1 $line if $flag;
の行におかしなものがあるぜ、と言われて、動いてくれませんでした。
考えられる原因としては、何があるでしょうか?
unlinkがうまく動かなかったので、、、
unlink $file;
で済ませられるところを、、、
unlink $file unless -f $file;
と描いた記憶が蘇りました。
OS由来の変な誤動作とかかもしれないですね。
あと、単純にdiskがあやうすかも。
smartmontools等で確認するのも良いかも。
0628nobodyさん
2009/06/11(木) 20:10:41ID:???unlinkは、inodeの削除でつよ
> unlink $file unless -f $file;
ファイルが無いならunlinkって・・・
0629nobodyさん
2009/06/11(木) 20:23:23ID:???unlink $file if -e $file;
って書きたかったわけじゃなくて?
0631nobodyさん
2009/06/11(木) 21:56:39ID:???ネットワークドライブだったり不良セクタが発生してたりという事が多い。
0632604
2009/06/12(金) 02:45:55ID:???抽象的とのことですが、実際、CGIにフォームを送信するとそこから進まなくなってしまい
ブラウザを閉じるまで画面遷移も一切無く、エラー画面もログも表示されないという
文字通り「止まる」としか表現しようがない状態だったのです。
切り分け不足だったのはひとえに自分の力不足です。
その後、unlink $file or die $!;に記述を修正して実行したところ
以下のようなログが表示されました。
[error] [client ::1] Operation not permitted at huga line 122., referer: hoge
122行目はやはりunlink $file or die $!;です。
Operation not permittedを調べてみましたが、実行権に関するエラーのようですね。
もう少し実行権まわりを検証してみて、まだ動かないようでしたら
またお知恵を借りにくるかもしれません。勉強になりました。ありがとうございます。
0634nobodyさん
2009/06/12(金) 08:22:59ID:???unlink "./icon/" . $icon or die $!
って書いてあるじゃん。力不足とかいう話じゃなくて姿勢の問題。
他にもいっぱいアドバイス貰ってるのに相手に失礼だろ。
0635nobodyさん
2009/06/12(金) 11:12:28ID:???作成日時を変更することは出来ますか?
0636nobodyさん
2009/06/12(金) 11:19:41ID:???i領域書き換えないといけないわけだし
0637nobodyさん
2009/06/12(金) 11:38:04ID:???タイムスタンプ変更ソフトだと一括変更が多くて、
拡張子で分けたり条件で時刻だけ変更したり出来ないので
Perlでやりたいと思ったのですが残念です。
0638nobodyさん
2009/06/12(金) 11:43:59ID:???0639nobodyさん
2009/06/12(金) 13:20:19ID:???http://search.cpan.org/~wyant/Win32API-File-Time-0.006/lib/Win32API/File/Time.pm
0640604
2009/06/12(金) 14:18:45ID:???ごめんなさい。
>>605さんの発言を見て、
初めてunlink "./icon/" . $icon or die $!を試すことに気づきました。
それでやってみて初めてエラーログに表示されたので、
他の方のアドバイスもすべて見て参考にしつつ
自力でもなんとかしないと逆に失礼だと思って>>632のように書いたのです。
書き方等、不快にさせてしまって本当に申し訳ないです。ごめんなさい。
0641nobodyさん
2009/06/12(金) 16:46:11ID:???Windowsなので、>>639さんのリンクで解決しました!
ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています