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/
0487nobodyさん
2009/05/19(火) 21:15:24ID:???@flies = `ls -tr`;(古い順)
0488nobodyさん
2009/05/19(火) 21:20:16ID:???use strict;
use File::stat;
opendir(DIR, "./") or die;
my @file = readdir(DIR);
closedir(DIR);
my @new = ();
for (@file) {
my $fi = stat($_);
push @new, {name=>$_, mtime=>$fi->mtime};
}
@new = sort { $a->{mtime} <=> $b->{mtime} } @new;
あとは@newが順番は更新日時順でハッシュの配列になってるから。
0489nobodyさん
2009/05/19(火) 21:22:11ID:???..
↑これ消さないと
0490nobodyさん
2009/05/19(火) 21:26:11ID:???まずこれが理解できるようになってから、自分で消してもらうってことで。
0491nobodyさん
2009/05/19(火) 21:28:16ID:???0492nobodyさん
2009/05/19(火) 21:30:22ID:???俺map嫌いなんだよ
0493nobodyさん
2009/05/19(火) 21:36:48ID:???opendir(IN, $dir);
@files= map{$_->[0]}sort{$a->[1]<=>$b->[1]}map{[$_,(stat("$dir/$_"))[9]]}grep(-f"$dir/$_", readdir(IN));
closedir(IN);
0494更新日時でソート
2009/05/19(火) 21:49:48ID:???0495nobodyさん
2009/05/19(火) 21:52:56ID:???0496nobodyさん
2009/05/19(火) 23:18:27ID:???0497nobodyさん
2009/05/19(火) 23:28:19ID:???0498nobodyさん
2009/05/20(水) 00:12:40ID:???0499nobodyさん
2009/05/20(水) 00:15:44ID:???0500nobodyさん
2009/05/20(水) 00:21:19ID:???とか?
でもこれはopendir+readdirだな
なんかのモジュール使うとかだと、結局はopenのラップだしなぁ
>>496
答えは?
0502nobodyさん
2009/05/20(水) 01:06:52ID:???opendirは相変わらず2引数だなぁ
0503nobodyさん
2009/05/20(水) 01:15:45ID:???ファイルハンドルはグローバルだから使うべからず(STDINとかの例外を除く)
>502の言うように3引数でmyつけて使うべし
0504nobodyさん
2009/05/20(水) 01:28:30ID:???俺は古いのでいいや、なんか混乱しそうだし
0505nobodyさん
2009/05/20(水) 01:33:39ID:???入出力に文字コード絡みの指定をしない時は、相変わらず2引数使ってることが多いかな。
けど、使い捨ての短いスクリプト書く時は、文字コード絡みがあっても、ついつい、
open(my $f,"$file_name");
binmode($f,":encoding(cp932)");
とかやっちゃうことも多い。
0506nobodyさん
2009/05/20(水) 01:36:09ID:???逆に不思議だ
0507nobodyさん
2009/05/20(水) 01:39:23ID:???何のことだろって思って調べたんだが、こんな感じであってる?
0508nobodyさん
2009/05/20(水) 01:48:12ID:???0509nobodyさん
2009/05/20(水) 02:03:59ID:???0510nobodyさん
2009/05/20(水) 13:51:48ID:???$hog にblessされたハッシュが入っているのか、テキストが入っているのか、
数値が入っているのかを利用する前に知りたい状況です。
0511510
2009/05/20(水) 13:52:55ID:???○blessされたハッシュのリファレンス
0514nobodyさん
2009/05/20(水) 20:33:00ID:???やりたいことは、"「で始まって」って終わる文字列"を置換したいです。
例えば、"「あ」「い」"を"「★」「★」"に置換したのです。
下記のように記述すると、多分2バイトコードである為、うまくいく場合と行かない場合が
あります。どのように記述すればよいか教えてください。
$data =~ s/「[^「」]*」/「★」/gi;
0515nobodyさん
2009/05/20(水) 20:40:54ID:???0517nobodyさん
2009/05/20(水) 22:23:39ID:???# 例えば入力がCP932(≒Shift JIS)なら……
# foo.pl (UTF-8で保存すること)
use strict;
use warnings;
use utf8;
use Encode;
my $encoding = find_encoding('cp932');
my $data = $encoding->decode(shift);
$data =~ s{
(?<= 「 )
( .+? )
(?= 」 )
}{★}xmsg;
print $encoding->encode($data);
__END__
入力
perl foo.pl 「あ」「い」「ほげほげ」
出力
「★」「★」「★」
まああれだ、正規表現を通さなくても、
入れるときデコード、出すときエンコードの癖を付けような
0518nobodyさん
2009/05/21(木) 01:23:27ID:???{★}xmsg;
を
{'★' x length($1)}xmsge;
にする感じで。
0519nobodyさん
2009/05/21(木) 02:45:24ID:???0521nobodyさん
2009/05/21(木) 15:48:56ID:???>>517氏の言うように、入出力時に変換するのが基本だから、
どこから読み込んで、どこに出力して、入力、出力、スクリプトそれぞれの
文字コードの情報があると、回答も得られやすいと思う。
古いPerlの場合、CPANからモジュールを突っ込んで使うか、
自分でガリガリ正規表現を書くことになる。
質問に条件をつければ、答えてくれる奇特な人がいるかもしれない。
全て文字コードCP932(日本語Windows環境)と仮定して、
ファイルから読んで、標準出力に出力する場合。
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);
open(my $fh, "foo.txt") or die $!;
my $data = join('', readline($fh));
close($fh);
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;
0522514
2009/05/21(木) 16:41:46ID:???文字コードはShift_JISです。
具体的に説明します。
以下のコードを実行すると
2番目の「」の部分が置換されないのです。
プログラムを始めたばかりの未熟ですみません。
$data = "あ「い」う「ニ世、三世」え";
$data =~ s/「(?:[^」]+)」/「★」/g;
print $data;
exit(0);
0523nobodyさん
2009/05/21(木) 16:42:15ID:???0524nobodyさん
2009/05/21(木) 19:18:34ID:???$data =~ s/「.+?」/「★」/g;
print $data;
v(★0★)v
0525nobodyさん
2009/05/21(木) 21:18:35ID:???0527nobodyさん
2009/05/21(木) 22:17:03ID:???0528nobodyさん
2009/05/21(木) 22:37:14ID:???ttp://www.kt.rim.or.jp/~kbk/regex/regex.html#PERL
0529nobodyさん
2009/05/21(木) 22:58:52ID:???0530nobodyさん
2009/05/22(金) 12:59:45ID:???use strict;
use warnings;
use encoding qw(cp932);
use open qw(:encoding(cp932) :std);
my $data = "あ「い」う「ニ世、三世」え";
$data =~ s/「.+?」/「★」/g;
print $data;
exit;
[^x]+より.+?の方が速いは、衝撃的。
0532nobodyさん
2009/05/22(金) 13:20:16ID:???左から
+ . ?
0533nobodyさん
2009/05/22(金) 15:52:26ID:???0534nobodyさん
2009/05/22(金) 16:25:07ID:???> +? +と同様ですが、マッチングがものぐさ(non-greedy)に行われる点が異なります。
とあるが、ものぐさと言われてもわけが分からんだろうな。
greedyが「貪欲な」という意味になるので、non-greedyなら「慎ましく」あたりが該当するのではないか。
だが、慎ましくと言われてもなお意味不明なことだろう。
しかし同時に、分からない者は置いてけぼりで構わないという高潔さも感じたことだろう。
正規表現を覗くものは、正規表現からも覗かれているのだ。
0535nobodyさん
2009/05/22(金) 19:12:35ID:???何故原文も翻訳もそんなあいまいな表現をしたがるんだ
0536nobodyさん
2009/05/22(金) 21:15:21ID:???0537nobodyさん
2009/05/22(金) 23:04:55ID:???最短マッチとかで、十分知られてると思うんだが
0538nobodyさん
2009/05/22(金) 23:47:28ID:???0539nobodyさん
2009/05/23(土) 03:20:57ID:???0540nobodyさん
2009/05/23(土) 09:02:31ID:???ちなみにlazyと表す場合もあるらしい。'ものぐさ'はこっちから来てるようだね。
0541nobodyさん
2009/05/23(土) 19:55:34ID:???―を別のもの変えれば動くので、―に問題があるようです
\―にしてもできません
$cha =~ s/―/ /g;
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:???鯖屋が気づいてないだけって可能性もあるな
美味しくいただいちゃいましょう
■ このスレッドは過去ログ倉庫に格納されています