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/
0302nobodyさん
2009/03/26(木) 01:34:45ID:???http://ja.wikipedia.org/wiki/Hello_world
まず画面上に "Hello, world!"、と表示することから始めるんだ。
0303nobodyさん
2009/03/26(木) 11:24:01ID:???さっそくどこかで使ってやろう
0304nobodyさん
2009/03/26(木) 12:07:44ID:???シャチ泳ぎの方が何かと好きだけど、覚えとこ。
実際にはそこまで処理時間にシビアな仕事はしてないけどw
0305nobodyさん
2009/03/26(木) 14:19:19ID:???0306nobodyさん
2009/03/26(木) 15:38:08ID:???AのサーバーにあるCGIから
BのサーバーにあるCGIへPOSTする方法を探しています。
HTMLのformタグのmethod=postと同じことをCGIで実行出来ないでしょうか?
0307nobodyさん
2009/03/26(木) 15:49:55ID:???あるいはJavaScriptでブラウザにPOSTさせるとか
というのは嘘で、無理だから諦めろ
0308nobodyさん
2009/03/26(木) 16:00:49ID:???ご返答ありがとうございます。
よそのサーバーのCGIに処理を実行させるのは危ないなぁとも考えていましたが、無理でしたか。
同一のサーバーでしたら可能でしょうか?
0309nobodyさん
2009/03/26(木) 17:29:37ID:???0310nobodyさん
2009/03/26(木) 23:43:53ID:???0312nobodyさん
2009/03/27(金) 01:22:46ID:???やり方書いてあるんだから。
0313nobodyさん
2009/03/27(金) 07:22:34ID:???http://www.seshop.com/detail.asp?pid=6160
『10日でおぼえる Perl /CGI入門教室 第2版 』2005/9/5発売。
を購入しようと思っています。
この書籍が出た時点のバージョンのPerlをWindowz Vistaで
動かすことは可能でしょうか?バクがでたりエラーなどは大丈夫でしょうか?
これからPerlを勉強するので詳しいことはわかりません。
なお、PHP関連の書籍に付録で付いていたXAMPP1.6.5はインストール済みで
少なくともVistaで動作確認済みとPHPの書籍にありました。
どなたか回答よろしくお願いいたします。
0314nobodyさん
2009/03/27(金) 08:24:05ID:???そんなのが出たのか。
0315nobodyさん
2009/03/27(金) 09:14:42ID:???VistaならActivePerl 5.8.8を入れておけば問題ない
0318nobodyさん
2009/03/27(金) 20:16:13ID:???ほんっとの初心者は Apache、PHP、MySQL それぞれを個別に入れれ
0319nobodyさん
2009/03/27(金) 21:58:01ID:???例のoverload絡みのバグへの対応は他ディストリより糞遅かったけど
0320nobodyさん
2009/03/28(土) 00:42:44ID:mucWI58Rある文字列UTF-8を、指定の文字数で分割し、配列に格納したいと思います
例)UTF-8の文字列を5文字ずつ分けたいと思い↓のコードを書きました
$string = "民主党支持団体=jichiro,山口組、ブラクカイドウ、韓国民潭";
@output = $string =~ m/.{5/g;
print $_, "\n" foreach @output;
↑の結果は↓のようにしたいのですが、今のままだと途中で文字化けをしてしまいます
--------------
民主党支持
団体=ji
chiro
,山口組、
ブラクカ
イドウ、
韓国民潭
--------------
文字化けをしないようにする方法を教えてください
0321nobodyさん
2009/03/28(土) 00:53:26ID:???use Encode;
$string = decode('utf-8', $string);
my @output = $string =~ m/.{5}/g;
print encode('utf-8',$_), "\n" foreach @output;
% perl 2ch.pl
民主党支持
団体=ji
chiro
,山口組、
ブラクカイ
ドウ、韓国
0322nobodyさん
2009/03/28(土) 01:03:13ID:???use utf8;
を宣言して、スクリプトをutf8で保存すればよいのでは?
正規表現の{5の後に}が抜けている
さらに、{5}では、最後の5文字未満が拾えない
そこで
@output = $string =~ m/.{1,5}/g;
とすればok
0323nobodyさん
2009/03/29(日) 14:40:26ID:???モノクロ2階調で描かれたpsdファイルを読み込んで保存すると
ぐちゃぐちゃに壊れたような画像になってしまいます。
上手く変換する方法は無いでしょうか。
$image->Read("in.psd");
$image->Write("out.jpg");
0324nobodyさん
2009/03/29(日) 21:07:47ID:???http://www.imagemagick.org/script/formats.php
とりあえず、最新バージョンは対応はしてみてるようだから、
perlじゃなくて、command lineからためしてみたら。
0325nobodyさん
2009/03/29(日) 22:55:28ID:???最新バージョンの 6.5.0-9 をDLして試してみましたが、
変わりませんでした。
ImageMagickの質問ってこのスレでいいんでしょうかね?
CG板とかUNIX板は違いそうだし。
0326nobodyさん
2009/03/29(日) 23:40:56ID:???ImageMagickはコマンドラインで提供されてるから、
perlをそもそも使わないで試したらってことです。
まず、psd,jpgサポートしてるか調べる
identify -list format
この辺ためす
http://www.imagemagick.org/script/command-line-tools.php
このへんで動くのに、perlだと動かない場合はここで良いいと思うけど、
そもそも動かない場合は、perl関係ない。
0327nobodyさん
2009/03/30(月) 00:10:07ID:???そもそも動きませんでした。
スレ違いなのでどこかに移動しようと思います。
・・・どこに移動するのがいいでしょうか?
0328nobodyさん
2009/03/30(月) 11:49:19ID:???software板にでも行きゃいいんじゃねえの。
0329nobodyさん
2009/03/30(月) 19:04:34ID:???0330nobodyさん
2009/03/30(月) 20:35:52ID:???0331nobodyさん
2009/03/31(火) 16:12:44ID:???sub TransGender {
my $sth = $dbh->prepare('SELECT id, name, sex FROM Person;');
$statusHandle->execute;
while(my @row = $statusHandle->fetchrow_array) {
my ($id, $name, $sex) = @row;
$sex = ($sex eq 'male') ? 'female' : 'male';
my $updh = $dbh->prepare('UPDATE Person WHERE id=? SET sex=?;');
$updh->execute($id, $sex);
}
}
以下の警告が出て更新出来なかった。
DBD::SQLite::st execute failed: database table is locked(1) at dbdimp.c
この場合まずIDを問い合わせて配列に格納し、
今度はIDから一つ一つデータを問い合わせて$sth->finish()した後に更新するの?
なんか定石みたいなのってありますかね。
0332nobodyさん
2009/03/31(火) 16:35:28ID:???同じく初心者の視点から思ったことを
この場合(全員が同時に性転換する場合)に限っては、sexテーブルを切り分ければ解決じゃないか?
あとSQL文最後のセミコロンは要らなかった記憶がある
excuteしたあとの動作うんぬんについては上級者に任せます
0333nobodyさん
2009/03/31(火) 16:55:11ID:???ごめん、コード例がまずかった。
後出しで申し訳ないけど、実際には全員が性転換するとは限りません。
舐めて逐一更新したいとき、どういう流れで作るべきなのかを聞きたかった。
prepareのセミコロンが要らないってのは了解。
0334nobodyさん
2009/03/31(火) 17:17:50ID:???なら
update person set sex='男' where sex='女' and...
update person set sex='女' where sex='男' and...
みたいに2つSQL文を発行すれば?
他に読み出してから行う処理がなくて済むなら速いと思う
0335nobodyさん
2009/04/01(水) 11:55:36ID:???もういいです。ありがとうございました。
0336nobodyさん
2009/04/01(水) 16:46:55ID:???$word2 = '検出文字';
print "Content-Type:text/html\n\n";
if($word2 =~ /$word/ig) {
print "out";
} else {
print "safe";
}
掲示板のスパム対策でうまく動かない部分があったので上のようなプログラムで試したところ、
実行すると「out」が出力されてしまいます。
「チソコ」だと「safe」が出力されます。
どうすればよいでしょうか?
0337336
2009/04/01(水) 17:08:31ID:???if($word2 =~ /\Q$word\E/) {
で解決しました。
0338nobodyさん
2009/04/01(水) 20:37:02ID:+q6m3hR8CatalystでDBIx::Class使って pagerやろうとしたのです
my $rs = $c->model(..)->search({}, {page =>1, rows=>10});
$c->stash->{data} = $rs;
.tt にて
[% SET pager = data.pager %]
[% INCLUDE pager.tt %]
で、data.pagerを参照するところで
Can't create pager for non-paged
と言われて困ってます。
どなたか助けて頂けませんか?
0339nobodyさん
2009/04/01(水) 21:01:56ID:???0340nobodyさん
2009/04/02(木) 04:32:48ID:???↓の書き方で問題ないでしょうか?
my @TARGET = grep (/hoge/, @hogehoge);
if ($#TARGET) {
# エラー
}
0341nobodyさん
2009/04/02(木) 05:02:24ID:???そのコードなら、grepにヒットするのが1個もない時も動いちゃうよ。
1個の時のみなにかしたいなら、
if( scalar(@TARGET)==1 )
とかにしたほうがよいんでない。?
0342nobodyさん
2009/04/02(木) 05:20:44ID:???ヒットするのが1個もないときの$#TARGETは-1になると思うんですが、どうでしょう?
$#TARGETが未定義値を返す場合があったりすると困りますが・・
0344nobodyさん
2009/04/02(木) 05:34:02ID:???自分が書くなら、
1個の時のみなにかしたい
→ if( scalar(@TARGET)==1 )
1個以外の時になにかしかい
→ unless( scalar(@TARGET)==1 )
みたいにするかな。
じゃないと、大分たって後から見直したり、
誰か他人に見てもらったりする時わかりにくじゃん。
0345nobodyさん
2009/04/04(土) 18:14:39ID:???普通に個数数えるべきだと思うが
0346nobodyさん
2009/04/04(土) 20:48:24ID:???http://search.cpan.org/dist/perl-5.10.0/pod/perlsyn.pod#Truth_and_Falsehood________
> The number 0, the strings '0' and '', the empty list (), and undef are all false in a boolean context.
0347クレクレコボラー
2009/04/06(月) 21:20:03ID:IJNdmC5qこれは、変数iが何だったらって意味?
0348nobodyさん
2009/04/06(月) 21:23:51ID:???0349クレクレコボラー
2009/04/06(月) 21:25:01ID:IJNdmC5q0350nobodyさん
2009/04/06(月) 21:54:57ID:???0351クレクレコボラー
2009/04/06(月) 22:10:12ID:IJNdmC5q0352クレクレコボラー
2009/04/06(月) 22:13:51ID:IJNdmC5qi = a-zA-Z0-9_だったらって事だよね。
0353クレクレコボラー
2009/04/06(月) 22:16:57ID:IJNdmC5q何年やっても。
俺が馬鹿なだけか。w
0354クレクレコボラー
2009/04/06(月) 23:08:51ID:IJNdmC5qこの検索文字列「蜿悶j螟悶@」
「取り外し」と入力しているみたいなんだけど、文字化けしてしまう。
以下のようなソースを入れて、ほとんどがきちんとした文字に変換
されるんだけど、変換されないものもわずかにある。
(自分の名前も名字と名前の間にブランクを入れないと文字化けする。
名字と名前の間にブランクを入れると、なぜかきちんと変換される。)
use Encode;
use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /;
$guess = Encode::Guess::guess_encoding($a2);
if (ref $guess && $guess->name ne 'shiftjis') {
Encode::from_to($a2, $guess->name, 'shiftjis');
}
elseのときに、どのようなソースを書けばいい?
全部きちんとした文字列に変換したいです。
つーか、仕事がないので自宅警備員やってるんだけど、COBOLの仕事
くれくれー。
0355nobodyさん
2009/04/07(火) 00:12:40ID:???0356クレクレコボラー
2009/04/07(火) 01:58:46ID:YZyHfBtrうん。それ理解出来たから。
それよりCOBOLの仕事探してんだけど。紹介してくれくれー。
出来なかったら
>>354の質問に答えてくれくれー。
0357nobodyさん
2009/04/07(火) 10:01:01ID:???いまどきはutf8のことも多いのでguessの候補に入れるといいと思うが、
utf8とeucは文字コードのよく使われる部分がもろに重なっているので
誤判定が多いのが悩みどころだな。eucは1文字2バイト、utf8は3バイト
なので6の倍数バイトでなければ区別がつくんだが、6の倍数バイトの
ときは辞書か出現確率テーブルでも用意してひくしかないんじゃない
かな。
0358nobodyさん
2009/04/07(火) 21:56:59ID:???0359nobodyさん
2009/04/07(火) 22:22:56ID:???そんなふうに考えていた時期が僕にもありました。二週間くらい。
0360nobodyさん
2009/04/08(水) 18:43:51ID:???0361nobodyさん
2009/04/08(水) 21:41:46ID:???0362nobodyさん
2009/04/14(火) 17:42:33ID:???具体的には、この形式のDLLに対して(LimeChat用のDLLです。参考まで)
>extern "C" __declspec(dllexport)
>void __cdecl Function(const char* Input, char* Output);
下記の形でいけるかなと思ったのですが、失敗しました。(perl510.dllの不正終了)
>use Win32::API;
>my $API = new Win32::API("samplel.dll","libset",[P,P],N);
>$buffer=0;
>$input ="hogehoge";
>$API->Call(\$input,\$buffer);
>print $buffer;
ご存知の方いらっしゃいましたら、何かアドバイス戴ければと
0363nobodyさん
2009/04/14(火) 18:57:46ID:???$buffer = "\x00" x 0xffffffff;
0364nobodyさん
2009/04/25(土) 20:26:28ID:???どんな書き方になる?
ユーザが二人ログインするのを待ってゲーム開始、みたいな感じなんだけど
0365nobodyさん
2009/04/26(日) 18:39:33ID:???WebカメラつないでSkypeが一番現実的だ
0366nobodyさん
2009/04/26(日) 21:54:51ID:3axQaGr1(perlはActivePerlではなくXAMPPのperlアドオンです。)
ローカルディレクトリ
D:\video\2009-04-01\00:00_ニュース&スポーツ_.mpg
D:\video\2009-04-01\00:10_衆議院予算委員会 〜 衆議院第一予算室から 〜_.mpg
D:\video\2009-04-01\02:00_世界遺産 〜アテネ〜_.mpg
...以下続く
D:\video\2009-04-02\00:00_ニュース&スポーツ_.mpg
...このように日付ディレクトリが続く
ファイル名を見てわかるとおり、ぶっちゃけNHKの録画ファイルです。
このローカルディレクトリにあるファイル名(ディレクトリ付)をFile::Find::Ruleで取得して
split /\\/,$_;
$file = pop(@_);
split /_/,$file;
$name = $_[1];
等の処理をして、
$file : 「00:10_衆議院予算委員会 〜 衆議院第一予算室から 〜.mpg」
$name : 「衆議院予算委員会 〜 衆議院第一予算室から 〜」を
MySQLにSJISで登録したいのですが、全角「〜」や全角スペースなどで、文字化けが起こってできません。
・UTF-8に変換すればいいのでしょうか?
・SJISでの文字化けはどのようにしたら回避できますか?
0367nobodyさん
2009/04/26(日) 22:46:55ID:???どうしてもSJISのままでってことならSQLエスケープするとか
0368nobodyさん
2009/04/27(月) 02:18:16ID:???Windows上では、"SJIS"ではなくて"cp932"でMySQLの文字コード指定してみ。
けど、DBで管理するんなら、日本語(マャ泣`バイト)使うのは、ファイルのタグとゆうかDB上での
説明としてだけにして、実際のファイル(パス)名はシングルバイトだけにするのが無難。
(上でもやってるように、局と日付、放送時間にするとか)
0369nobodyさん
2009/04/27(月) 08:43:15ID:???ありがとうございます。
MySQLはPHPmyadminで管理しているので、なるべく平文で入力したいと思っています。
ファイル管理と実際のファイル名を別にすることも考えたのですが、
DLNAでファイルそのものをLAN内配信しているので、日本語ファイル名を使いたいのです。
そもそも、\もしくは/のディレクトリ符号と、SJIS文字が一行に入っているのが悪いのでしょうか。。。
PHPmyadmin上のcp932の指定を勉強してきます。。。
0370nobodyさん
2009/05/01(金) 04:37:55ID:???正規表現について質問です
掲示板等の本文で特定の文字があった場合正規表現でリンクを生成したいんですが
(#a#検索文字#/a#)
携帯の場合検索文字にスペースがあった場合スペース以降が無視されてしまうので
URLエンコードをしようと思っています。
そこで質問ですが、$1に入っている「検索文字」をURLエンコードするにはどうしたら
いいのでしょうか?
$text =~ s/#a#(.*?)#\/a#/<a href=\"s.cgi\?word=$1\">$1<\/a>/g;
今現在はこのようにしています。
このword=$1の$1部分だけURLエンコードがしたいんです。
よろしくお願いします。
0371nobodyさん
2009/05/01(金) 10:43:26ID:???0372371
2009/05/01(金) 10:54:17ID:???0373nobodyさん
2009/05/01(金) 19:16:23ID:???動作確認しました。
ありがとうございます。
…正規表現ってこういう書き方も出来るんですね
勉強になりました
まぁ今は理解してない部分もあるんで調べてみようと思います。
0374nobodyさん
2009/05/02(土) 05:07:16ID:sYtZpFZzどなたか間違っている箇所がわかれば教えてくださいませ。
------------------------------------
txt形式のデータに
119
110
049
025
のように数字が並んでいます。
これを@datalistに開くことまではできました。
やりたいことは、この中から$eraseに該当する数字だけは消し、
あとの数字はそのまま残す、という処理です。
for ( my $k = 0 ; $k < @datalist ; $k++ ) {
if ( $datalist[$k] ne $erase ) {
$newlist[$k] = $datalist[$k];
}
}
で、@newlistを再び元のログtxtに書き込む。
------------------------------------
というような感じで行けないかと思ったんですが、処理し終わったログtxtを開くと、
元のまんまの数字が並んでいてまったくかわっていません。
ftpで見ると、ログそのものは更新されているので、
一度スクリプトがログを開いてはいるみたいなのですが…。
どうかよろしくおねがいします!
chomp @datalist;
@newlist = grep $erase != $_, @datalist;
改行が含まれていそうね♪
0376nobodyさん
2009/05/02(土) 10:31:24ID:???push(@newlist, $datalist[$k]);に換えないといけないんじゃないかな?
前後の処理がよくわからないし、もっと効率のいい方法あるとは思うけど・・
0377nobodyさん
2009/05/02(土) 12:08:08ID:???0378nobodyさん
2009/05/02(土) 12:44:54ID:???0379374
2009/05/02(土) 12:47:26ID:???ありがとうございます
そのとおりやってみたら、見事に$erase以外がログに書き込まれていました。
おっしゃる通り、改行が含まれていたせいみたいです。
しかし、修正されたログにも同じように数字ごとに改行を含んでおきたいのですが、
この処理だと
119049025
のように改行なしで一気に書かれてしまいました。
そこで、元の自分の書いたものに>>376さんのアドバイスで修正を加え
chomp @datalist;
for ( my $k = 0 ; $k < @datalist ; $k++ ) {
if ( $datalist[$k] ne $erase ) {
push(@newlist, "$datalist[$k]\n");
}
}
としてみると、一応、望み通りの結果を出すことができました。
二晩くらい悩みまくったので、とても助かりました。
ほんとうにありがとうございました。
grepを使った方法は今まで使ったことが無くて、一行で処理できる
美しいコードに感激したので、もしよろしければ自分の書いた方法以外で
同じ結果の出せる(改行含む)書き方があれば教えてやってください。
0382nobodyさん
2009/05/02(土) 17:09:01ID:???0383nobodyさん
2009/05/02(土) 17:44:55ID:???0384nobodyさん
2009/05/02(土) 18:10:31ID:???0385384
2009/05/02(土) 18:15:58ID:???0386374
2009/05/02(土) 18:37:39ID:???map { s/^\Q$erasedat\E\n$//; } @datalist;
で希望通りに処理されるのを確認できました。
mapとかgrepというのを使いこなせば、いま自分の書いてる現行のスクリプトで
改善できるところがすごく多そうなので、ちょっと勉強してみます。。
ほんとに助かりました。親切にありがとうございました
0387374
2009/05/02(土) 18:39:02ID:???0388nobodyさん
2009/05/02(土) 19:51:16ID:???0389nobodyさん
2009/05/02(土) 21:04:48ID:???0391nobodyさん
2009/05/05(火) 04:15:46ID:???0392nobodyさん
2009/05/05(火) 10:06:17ID:???0393nobodyさん
2009/05/05(火) 13:43:50ID:???0394nobodyさん
2009/05/05(火) 14:21:29ID:???0395nobodyさん
2009/05/06(水) 01:57:30ID:???0396nobodyさん
2009/05/06(水) 08:18:31ID:???LWP::UserAgent を使って取得したいんですが、
リンクを幾つかたどっていく必要があります。
cookie は何とかなったんですが、
1つ前の html ファイルにあるパラメータを取得して POST メソッド時に引き渡すところの
解析に手を焼いています。
# パラメータ名は判っているので現在は文字列検索で取得しています。
a href などではなく、POST メソッドのパラメータも解析してくれる
便利なパッケージって無いでしょうか
0397nobodyさん
2009/05/06(水) 11:03:19ID:???&sub (@hoge);
ではダメなんでしょうか?
この記述で渡して、受け取ったサブルーチン側でログに書きだしたら
各行に空白が入るようになってしまったんですが。。。
0398nobodyさん
2009/05/06(水) 11:35:46ID:???0399nobodyさん
2009/05/06(水) 11:50:51ID:Ms7+WRwlもともとの値がちゃんと期待通りの値か確認してみ
他の可能性としては
my(@args);
としてるだけで
@args = @_;
みたいにするの忘れててサブルーチン側でちゃんと受け取ってないとか
0400nobodyさん
2009/05/06(水) 13:42:27ID:???HTML::Form(LWPの付属モジュール)
WWW::Mechanize(LWPのスーパークラス的なモジュール)
■ このスレッドは過去ログ倉庫に格納されています