トップページphp
981コメント337KB

くだすれPerl(超初心者用)3

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん2009/03/31(火) 22:20:27ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/

関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0931nobodyさん2010/08/13(金) 17:19:56ID:???
失礼しました。スクリプト中のOsごとのスタイルシート振り分けが
影響していたようです。
検証有り難うございました。

確かにレガシーですが、永遠の日曜Web管理人の私などには
分かりやすいのです。
ただ、tableが多いのにサブルーチンで使い回ししまくりなので、
何処で閉じてるのかもう何がなんだか分かり難いのが最大の難点です。
0932☆忍者Perl☆ ◆M5ZWRnXOj6 2010/08/13(金) 17:27:14ID:LkLBXJmk
マカーがWeb系言語をやるのは運命wwwww

寄生虫のように脳味噌を取り付かれて、一定時期になったらweb言語をやりだすという

ハリガネムシに寄生されたカマキリみたいだねwwwwwwwwwwwww
0933nobodyさん2010/08/13(金) 17:29:06ID:v7edkYYK
日本語でおk
0934nobodyさん2010/08/14(土) 02:35:01ID:???
>>931
結局わかり辛いんじゃないのか・・・?
0935nobodyさん2010/08/14(土) 05:33:34ID:???
OOPで綺麗に書きなおせば
見辛いコードは保守性もないし
0936nobodyさん2010/08/19(木) 00:49:02ID:???
>>935
素人がOOPやっても保守しやすくなるとは限らん罠
それより先にやるべきことがある

一番やるべきなのはビューの分離
0937nobodyさん2010/08/19(木) 15:22:08ID:md+Wq55Q
CPANが使えない環境でMCryptをインストールしたくて、
winでダウンロードしたMCryptをlinuxにコピー。

makeすると
mcrypt.h: No such file or directory
といわれてしまいます。

google先生に聞いてもphpの例しか出てこず、、、
どういうことなんでしょうか?
0938nobodyさん2010/08/19(木) 16:19:15ID:???
libmcryptを入れればいいんじゃないかな
09399372010/08/19(木) 16:46:41ID:md+Wq55Q
>938

ありがとうございます。

今度はRPMパッケージのlibmcryptをインストール中にこけました。
error: Failed dependencied:
libmcrypt = 2.4.11 is needed by libmcrypt-devel-2.4.11-2.i586

調べてみます。
0940nobodyさん2010/08/19(木) 17:08:32ID:W8mNHQ1m
libmcrypt-devel-2.4.11-2.i586 が必要ってこと
0941nobodyさん2010/08/26(木) 16:54:36ID:???
こんな感じで ハッシュをソートするとします
foreach $no (sort keys %hash){ ・・・

$no の小さい順になるんで逆転したいのですが
どうしたらいいですか?
0942nobodyさん2010/08/26(木) 17:24:53ID:2u47Mbsa
reverse sort keys(%hash)
0943nobodyさん2010/08/26(木) 17:51:44ID:???
sort { $b <=> $a } keys %hash
sort { $b cmp $a } keys %hash
0944nobodyさん2010/08/26(木) 19:02:28ID:???
10abc
100abc
20abc

こうゆうデータがあるとき、先頭の数字で並べ替えたい時
どうやってソートしますか?
普通にソートすると

100abc
10abc
20abc

となりますが、希望する並べ替えは

10abc
20abc
100abc

です。
先頭の数字の配列と、文字列の配列に分断して並べ替えるのが妥当なのかな?と思ったけど、
分断した配列同士をどうやって紐付けるかで迷い、結局構造体っぽいハッシュにがっつり入れて並べ替えて対処してます。

もっとスマートに出来そうなのですが・・・
0945nobodyさん2010/08/26(木) 19:51:42ID:???
ソートに使う数字が先頭にある場合に限れば
 sort { int $a <=> int $b } @array
でいけるな。真っ当にやるなら
 sort { ($a =~ /^([0-9]+)/)[0] <=> ($b =~ /^([0-9]+)/)[0] } @array
とか。
0946nobodyさん2010/08/26(木) 20:00:51ID:???
あ〜、int は数字以外が来たらそこまであった数字を処理対象とするんでしたっけ?
恐ろしく簡単で、灯台もと暗しすぎて笑えてきたw

正規表現は意外とコストが高いので、int 使っていこうと思います。
thx!
09479452010/08/26(木) 20:35:40ID:???
ごめん、試してみたらintだとuse warningsで警告出るわ。正規表現にしといてくれ。
0948nobodyさん2010/08/26(木) 22:20:20ID:???
今試せる環境に居ないので試してないけど、

sort { ($a <=> $b } grep { /^([0-9]+)/)[0] } @array

は駄目かな?
0949nobodyさん2010/08/26(木) 23:41:34ID:???
コスト気にするなら、シュワルツ変換かシャチ泳ぎが定番。
map{ $_->[0] }
sort { $a->[1] <=> $b->[1] }
map{ [ $_, ( /^(\d+)/)[0] ] }
@array ;
0950nobodyさん2010/08/27(金) 19:12:21ID:RoA/6PjL
ソートの件、有り難うございました。

ところで、先頭に数字があるBBSのログをサーバ上で
他の目的用に整形し直した際に、
>>945
sort { int $a <=> int $b }
でソートとしてみました。

こういうの
100<>name<>mail<>sub・・・・
99<>name<>mail<>sub
98<>name<>mail<>sub

ブラウザで新ログを見ると綺麗にソートされています。
それをFTPでダウンロードしてみると崩れています。

そんな事ってあるのでしょうか?
私の勘違いでしょうか。
0951nobodyさん2010/08/27(金) 19:52:45ID:???
>>950
ブラウザで見てるってのは生ログ見てるの? 何かcgi通してるの?
後者なら不思議でもなんでもないのだが。
0952nobodyさん2010/09/09(木) 10:22:10ID:???
>>950
話は戻るんだがそういうデータならどうせパースするんだし

@data = sort { $a->[0] <=> $b->[0] } map { [split /<>/, $_] } @lines;

とかでよくないか?
0953nobodyさん2010/09/09(木) 17:38:07ID:mtEu4DDe
質問させてください。

Perl::DBIで下記のようにコーディングしています。

my $codes = '1,2,3,4,5';
my $sql = 'SELECT * FROM TEST WHERE testcode IN (?)';
my $sth = $dbh->prepare($sql);
$sth->execute( $codes );

実行すると実際に発行されるクエリーは
SELECT * FROM TEST WHERE testcode IN ("1,2,3,4,5")
のようになると思います。(VARCHAR扱いでバインドされるので)

次のように発行させたい場合はどのように記述すればいいのでしょうか?
SELECT * FROM TEST WHERE testcode IN (1,2,3,4,5)
0954nobodyさん2010/09/09(木) 17:50:35ID:???
試してないけど、こんなんじゃだめなのけ

my @codes = split /,/, '1,2,3,4,5';
my $sql = 'SELECT * FROM TEST WHERE testcode IN (' . join(',', ('?') x @codes) . ')';
my $sth = $dbh->prepare($sql);
$sth->execute(@codes);
09559532010/09/09(木) 22:32:41ID:mtEu4DDe
>>954

遅くなりました!
無事に動作しました。ありがとうございました。
0956nobodyさん2010/09/10(金) 10:36:15ID:dfQ9DvRu
Perlで指定した日時にイベントを起こす方法を模索しているのですが、
何か定番的なやり方がありましたら教えて下さい
検索のキーワードでも何でも結構ですので
09579562010/09/10(金) 10:58:46ID:???
現状考えているのは、while(1)でループを回しっぱなしにして
その中で常時localtime(time)を取得し、特定の日時になったら

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
if($hour == 起こしたい時 && $min == 起こしたい分 && $sec == 起こしたい秒) {
#起こしたいイベント
}

こんな感じでイベントを起こす、というやり方です
また、指定する日時はCSVファイルで複数行を別途保持しておく形になります
YYYY,MM,DD,hh,mm,ss…みたいな感じです
もし他にもっとスマートな方法があるようでしたら教えて下さい
0958nobodyさん2010/09/10(金) 11:12:12ID:???
cron
タスク
0959nobodyさん2010/09/10(金) 13:23:53ID:???
>>957
cronを使えない特別な理由があるとして、whileの中でsleep(目標日時 - 現在日時)とかすればいいんじゃね?
0960nobodyさん2010/10/07(木) 20:01:34ID:dy4xwK3O
とある雑誌でみたソースコードなんですがPerl初体験?なので困っています
perlの関数は引数にアクセスする際に$_->[0]で引数の値を取得できると
教わったんですが関数らしき処理はこのソースコードの前後に書かれておらず
困ってます。

あとforループの$tはどんな役割になるんでしょうか?

my $input_vec = { book => 29, '梅田望夫' => 27 ....};
my %sim;
for my %t(keys %input_vec) {
for(@{$index{$t}}) {
$sim{$_->[0]} += $input_vec->{$t} * $_->[1];
}
}
0961nobodyさん2010/10/07(木) 20:11:47ID:???
いや、そんな一部分だけ抜き出されても困る。
せめて何を目的とするコードなのかくらい書け。
0962nobodyさん2010/10/07(木) 20:21:13ID:dy4xwK3O
WEB+DB PressVol57のリコメンドエンジンを作るとういう記事の一部です

$input_vecにははてなブックマークのタグ数が代入されています。

実装 : ある記事を見たユーザにオススメの記事を推薦する機能

$indexははてなブックマークのタグとタグ数、記事のIDを元に
作られた転置インデックスです。

0963nobodyさん2010/10/07(木) 20:49:20ID:???
なんかわからんけどこれをやりたいの?
#!/usr/bin/perl

@array = ('a', 'b', 'c');
&func(\@array);
sub func{
foreach (@_) {
print $_->[0],": ",$_->[1],": ",$_->[2],"\n";
}
}
0964nobodyさん2010/10/09(土) 07:58:30ID:???
ttp://pgd.jp/cgiscript.html
ここのメールフォームのスクリプトを試していて、
textareaに入力した改行が確認画面で反映されないのですが、
どのような改造をすればよいでしょうか。
送信されたメールではちゃんと改行されてるので、確認画面を出力するところが問題になるとは思うのですが。。。
0965nobodyさん2010/10/09(土) 12:15:45ID:???
>>964
改行をbrタグに置換する
0966nobodyさん2010/10/09(土) 19:26:59ID:???
大雑把な質問なんですが、カレンダー型スケジュールなどで
平日のみ4つの配列を順に表示させる方法またはヒントが
あれば教えてください。
休日か平日かの判定は出来ています。

下のような感じです。
配列はA→B→C→Dの4つ。
10/04(月)→平日なので配列Aを表示
10/05(火)→平日なので配列Bを表示
10/06(水)→平日なので配列Cを表示
10/07(木)→平日なので配列Dを表示
10/08(金)→平日なので配列Aを表示
10/09(土)→休日なので表示しない
10/10(日)→休日なので表示しない
10/11(祝)→休日なので表示しない
10/12(火)→平日なので配列Bを表示
10/13(水)→平日なので配列Cを表示
0967nobody2010/10/09(土) 23:54:45ID:???
平日だけを要素にした配列を作って、その日が何番目の
要素かを調べて、(qw(A B C D))[$n % 4] でいいと思う。

0968nobodyさん2010/10/11(月) 06:28:12ID:???
&Jcode::convert(¥$_,'euc','utf8');

という行は¥$_をutf8からeucへ変換するということだと思うのですが、
¥$_ってどういう意味ですか?
0969nobodyさん2010/10/11(月) 06:33:14ID:???
リファレンス
参照渡し
関数の副作用
0970nobodyさん2010/10/11(月) 12:56:11ID:DYbljc5P
すみません。Perlの環境構築について質問がございます。
Win7+Apache+PerlでCGIを動かそうとしているのですが、Internal Server Error(500)が出てうまくいきません。

Apacheのerror.logをみると
[Mon Oct 11 12:41:43 2010] [error] [client 127.0.0.1] (OS 2)指定されたファイルが見つかりません。 : couldn't create child process: 720002: printenv.cgi
[Mon Oct 11 12:41:43 2010] [error] [client 127.0.0.1] (OS 2)指定されたファイルが見つかりません。 : couldn't spawn child process: C:/Program Files (x86)/Apache Software Foundation/Apache2.2/cgi-bin/printenv.cgi
と出てきます。

ググると、ソースの一行目の#!のPathの設定が正しくないとこのエラーが出るらしいのですが、
Pathは正しく設定してます・・・
#!c:/Perl64/bin/perl.exe

何か他に怪しいところとかありますでしょうか?
0971nobodyさん2010/10/11(月) 14:04:59ID:???
>>970
Windowsでexeの指定ってそれでいいの?
Linux環境でしか触ったことないからわからんけど
#!/Perl64/bin/perl
とか
#C:\\Perl64\bin\perl.exe
とかじゃね?

参考になりそうなURL
http://tep-pey.blogspot.com/2008/05/windowsapacheperl.html
0972nobody2010/10/11(月) 16:46:12ID:???
>>968

【質問】
&Jcode::convert(\$_,'euc','utf8');
という行は\$_をutf8からeucへ変換するということだと思うのですが、
\$_ってどういう意味ですか?

【回答】
&Jcode::convert(\$_,'euc','utf8');
という行は $_ をutf8からeucへ変換するということ

です。
0973nobody2010/10/11(月) 19:50:02ID:???
$_ = \$foo;
&Jcode::convert($_,'euc','utf8');

の場合は $_ をutf8からeucへ変換するということ

で・は・な・く・て

$foo をutf8からeucへ変換するということ

でっす!!!
0974nobodyさん2010/10/14(木) 03:11:24ID:???
最近になって覚えたワンライナーが面白くて仕方ありません。
searchという文字があった場合に行末にfooを付けたいのですが、
こんなふうにやってます。↓
perl -ne "print if ( /search/ )" input.txt > output1.txt
perl -ne "print if ( s/\n/foo\n/g )" output1.txt > output2.csv
2つのワンライナーを1つにするにはどうすれば良いのですか?
よろしくお願いします。
0975nobodyさん2010/10/14(木) 06:27:55ID:???
perl -ne "/search/ and s/\n/foo\n/g and print" input.txt
0976nobodyさん2010/10/14(木) 23:39:16ID:???
>>967
レス遅くなってすいません。

質問の仕方が悪かったです。
表示する方法ではなくて、「"今日"($year/$mon/$day)は"ある日"($tyear/$tmon/$tday)から何回目の平日か?」
を簡単にわかる方法があればと。。。

timelocal での差分 - 休日数でできました。
ありがとうございました。
09779742010/10/16(土) 00:38:31ID:???
>>975さん、ありがとうございます。
andで繋げていくのですね。
セミコロンで繋げるものとばかり思い込んでいました。

0978nobodyさん2010/10/16(土) 00:40:09ID:???
いや、意味違ぇーから…
0979nobodyさん2010/10/17(日) 23:52:01ID:???
フリーのデータベースを使っているのですが
ttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1242300167
の質問にある2番目の
<2>「YAHOO」という文字列を検索する際に「yahoo」と入力しても検索できるようにしたい
なのですが
大文字と小文字を区別しないでマッチさせるようにするにはどのように記述すればいいのでしょうか
0980nobodyさん2010/10/17(日) 23:58:49ID:???
if( $optlist_wk[$i] =~ /$switem/i ){ # 大文字&小文字の判別:無へ Y.Otake 04.08.17
既にcase-insensitiveになってる気がしますが
0981nobodyさん2010/10/18(月) 10:00:17ID:???
データベースに入れるときに大文字か小文字かに統一したデータも入れておいてそれを検索するか、
データベース検索時に正規表現を使うか
レス数が950を超えています。1000を超えると書き込みができなくなります。