トップページ⇒php
1001コメント309KB

Perl コーディング初心者質問コーナー Part37

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/08/22 01:41ID:???
Perlのコーディングで困ってる人のスレです。
誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
035735504/09/13 07:34:16ID:???
>>356
あれ?使えた・・・・;
-が初めか最後の時にはクォートしなきゃいけなかったのか;
それが面倒であまり使われてないんですかね?それとも他にも何かの処理中に面倒なことが
起こる可能性があったりするんですか?
035835504/09/13 07:36:22ID:???
a-aもクォートがいるのか・・・・orz
0359nobodyさん04/09/13 07:52:35ID:???
クォートがいるのではなくクォートがなくても動くと言った方が正しいと思うが。
0360nobodyさん04/09/13 08:09:58ID:???
なんでクォートごときでそんなにへこむんだよ。
文字列をクォートするのはどんな言語でも当たり前のことだろうに。
036135504/09/13 09:29:42ID:???
>>359
?
%form = ( a-a => 1 );
エラーになる。use strict環境下だからかもしれないけど。
>>360
通販サイトのCGIだから商品名、商品価格とか色々商品番号をキーとしたハッシュを作る時に
いちいちクォートを入れてると見づらいし、書きづらいorz
ハイフンなしでもいいがCSV形式に変換して落とす時にいちいちハイフンを追加するのもちょっと億劫orz

Perlって結構自由?ゆるい?からマルチバイトかメタ文字以外でクォートすることはないんだorz
だって面倒でしょ。JAVA畑の人は慣れてるかもしれないけどさ。
036235504/09/13 09:30:13ID:???
my %form = ( a-a => 1 );
の間違いね。
0363nobodyさん04/09/13 09:33:33ID:aK+3swHZ
Perl5.8.5をソースからインストールしようとしたとき、
「あなたのメアドは?」って聞かれたのですが、
これって何に使うのでしょうか?
0364nobodyさん04/09/13 09:40:05ID:???
>>363
請求書を送るために
0365nobodyさん04/09/13 09:42:28ID:???
>>363
>>364が言うように請求書が来るが、先払いも可能だよ。クレジット決済でやるのがまあ普通だね。
昔俺はメアドだけなら払わずに無視してもどこの誰だかわからないだろうと思っていたが、
IP+メアドで実は十分個人を特定できるようだ。(もちろん裁判所に申請して住所などの情報を調べる許可を得るみたいだが。)
0366nobodyさん04/09/13 09:49:56ID:???
>>365
たかが86.00$なんだから素直に払えよボケ。
0367nobodyさん04/09/13 09:57:23ID:???
>>361
細かいことを気にしないなら

my %form = qw{
a-a 1
b-b 2
};

とか。

0368nobodyさん04/09/13 10:01:53ID:???
>>363
バグレポートを送ったりそのバイナリをビルドしたPerl管理者に連絡を取りたかったりした時とか。
Perlが勝手にそのアドレスを使うことはない。(アプリが勝手に使うことはあるかもしれないが)
気になるなら[email protected]にでもしておけ。

>>364-366 悪質な冗談はやめとけ
0369nobodyさん04/09/13 11:45:33ID:???
データから、カンマを取り除いた数値のみを切り出したいんですけど

if ($key eq 'log'){
$val =~ s/\,//;
if ($val =~ m/[0-9,]{1,10}/){
$number = $val;
}
}

ではうまくいきません。どの辺がおかしいかご教授願います。
0370nobodyさん04/09/13 11:48:54ID:???
>>369
$val =~ s/\,//;
にgオプションつけるとか?
0371nobodyさん04/09/13 12:28:08ID:???
ダメです カンマの前しか取得されません・・・
0372nobodyさん04/09/13 13:00:27ID:???
元のデータは123245,6789,4567,みたいなの?
そこから123245と6789と4567を別々に取り出したいの?
それとも12324567894567て続けて?
0373nobodyさん04/09/13 13:01:37ID:???
こんな感じか?

my $val = "datadata1,234,567datadata....,456,789";
my @tmp = $val =~ /(\d{1,3}(?:,\d{3})*)/g;
foreach (@tmp){
$_ =~ s/,//g;
print "$_\n";
}
0374nobodyさん04/09/13 13:02:42ID:???
XXXX:1234,5677 みたいな形で
12345677 てカンマだけを抜かした形で取得したいす
0375nobodyさん04/09/13 13:06:15ID:???
じゃあね。
>>370の言うとおり。
if ($key eq 'log'){
$val =~ s/,//g;
$number = $val;
}
0376nobodyさん04/09/13 13:06:27ID:???
>>368
>>>364-366 悪質な冗談はやめとけ
^^
0377nobodyさん04/09/13 13:20:51ID:???
>>363-366>>368
スレ違い
0378nobodyさん04/09/13 13:53:22ID:???
意見のすれ違いがおおいね・・・。
0379nobodyさん04/09/13 14:45:23ID:Dm3Qguqc
$a
が数値かどうかを判定するいい方法Plz。
0380nobodyさん04/09/13 14:48:19ID:???
$a =~ /^\d+$/
038137904/09/13 14:56:19ID:Dm3Qguqc
>380
その意味を理解するのに手間取ってしまいました。
if($a =~ /^\d+$/){
#数値
}
ですね、ありがとうございました。
0382nobodyさん04/09/13 15:04:53ID:???
>>380-381
$aが負の場合にうまくいかんと思うが。
0383nobodyさん04/09/13 15:07:36ID:???
>>380-381
$aが小数点ついてる場合にうまくいかんと思うが。
0384nobodyさん04/09/13 15:18:42ID:???
>>382-383
うまくいく例を教えたれや
0385nobodyさん04/09/13 15:23:13ID:???
>>384
それが分かったらワテも苦労せん
0386nobodyさん04/09/13 15:43:56ID:???
コレでいけるんでないかな
http://www.mamiyami.com/document/perl_cookbook_2nd_edition/0596003137_perlckbk2-chp-2-sect-1.html
0387nobodyさん04/09/13 16:22:04ID:???
my @vals = qw/5.88 -50 300 s51 51s/;

foreach (@vals){
if($_ eq $_-0){
print "$_ = Number\n";
}
}

どう?
0388nobodyさん04/09/13 16:42:01ID:???
警告を気にしない場合にはいいんじゃないの?
0389nobodyさん04/09/13 16:46:28ID:???
>>388
警告でます?
0390nobodyさん04/09/13 16:51:18ID:???
>>361
bare word として許されるのは [A-Za-z]\w* にマッチする文字列のみ。
これに加え単項演算子としての - を bare word の頭に付ける事ができる。

<q cite="http://perldoc.com/perl5.8.4/pod/perlop.html#Symbolic-Unary-Operators">
Otherwise, if the string starts with a plus or minus,
a string starting with the opposite sign is returned.
One effect of these rules is that -bareword is equivalent
to "-bareword".
</q>

=> 演算子は左辺の (- が頭に付くものも含めた) *bare word を*
クォートしてくれるが、何でもかんでも文字列リテラルにしてくれる
わけではない。
0391nobodyさん04/09/13 17:02:59ID:???
>>388
use warningsすると出る。

Argument "s51" isn't numeric in subtraction (-) at numberp.pl line 6.
Argument "51s" isn't numeric in subtraction (-) at numberp.pl line 6.
0392nobodyさん04/09/13 17:06:02ID:???
>>390 =~ s/\[A-Za-z\]/[A-Z_a-z]/;
0393nobodyさん04/09/13 17:34:07ID:nbuBgplM
ショッピングカートで現在のカゴの中身を表示するのに、
クッキーやファイルを使わないでする方法は無いですか?
0394nobodyさん04/09/13 17:49:54ID:???
>>393
スレ違い
http://pc5.2ch.net/test/read.cgi/php/1086715675/l50
0395nobodyさん04/09/13 17:54:31ID:???
>>393
コーディングと関係ないじゃんかよ
0396nobodyさん04/09/13 19:55:34ID:???
m/^[-+]?\d+(.\d+)?$/
0397nobodyさん04/09/13 20:01:22ID:UGDBY8bj
訂正
m/^[-+]?\d+(\.\d+)?$/
0398nobodyさん04/09/13 20:17:50ID:???
n進数や指数付きの数値はどうすんのよ?
0399nobodyさん04/09/13 21:08:13ID:ZFdPbvGg
外部からのdatファイルを読み込むサブルーチンが働きません。
何十回も関数リファレンスや講座サイトを見比べても、どこが悪いのかがわかりません。
ちなみに、下記のコードの結果、$cs_xの値が-1になりました。$st_ffで出るパスは正しいです。
もしよろしければ教えて頂きたいなと思います。

sub st{
    open(IN,"$st_ff") || &error("stファイルが見つかりません"); # $st_ff はstファイルの位置(相対パス)
    @st_d = <IN>;
    close(IN);
    $i=0;
    foreach (@st_d){
        ($name,$c_no,$hp,$lov,$his,$age) = split(/<>/);
        $c_status[$i] = [$name,$c_no,$hp,$lov,$his,$age];
        $i++;
    }
    $i--;
    $cs_x = $i; # $cs_xは元データ(st)の行数を出す・チェック用
}
0400nobodyさん04/09/13 21:13:27ID:???
数値のマッチングも満足にできないおまいらって・・・・・カコイイね。
0401nobodyさん04/09/13 21:17:01ID:???
>>399
-1になってるならforeachが一度も処理されてないってことだろ。
foreach前に
print @st_d;
でも加えて確認してみ?
0402nobodyさん04/09/13 21:39:15ID:???
>>401
考えてみたらそうですね。
エラーメッセージが出ないので大丈夫と先入観を持ってました。(ちなみに、ファイル名を変えて、エラーが出るのは確認しました。)
ちなみに@st_dは無表示なので、1〜3行内に間違いがありそうです。
レベル低すぎる質問って自覚したので精進して出直して、ここにお世話にならないように頑張ります。
失礼しました。
0403nobodyさん04/09/13 21:47:46ID:???
>>402
俺の環境では動いたぞ
全然問題無い
しいて言うならchompしとけってくらいかな
0404nobodyさん04/09/13 21:51:51ID:???
$c_status[$i] = [$name,$c_no,$hp,$lov,$his,$age];

本当にわかっていてこうしているのか甚だ疑問なんだが
0405nobodyさん04/09/13 21:57:42ID:???
>>399
いちいち$iとか使わないで、

push @c_status, ほげほげ

とやる方がらくちんだよ。最後の$cs_xも、@c_statusの
大きさで読み込んだ行数わかるから冗長。

0406nobodyさん04/09/13 21:58:08ID:???
えっと、テストするファイルを間違えたみたいでした。
改変前のコピーを取っておいたフォルダで試してました。
本気で申し訳ありません。

>>404
それは後のサブルーチンで、$c_status[$i][$j]みたいなかんじで使おうと思って。
何か他にいい方法があれば教えていただけますか?
0407nobodyさん04/09/14 03:26:57ID:???
>>406
オブジェクト指向
0408nobodyさん04/09/14 05:51:54ID:???
日本語文の中から最頻出単語を選ぶにはどうしたら良いのでしょうか。
英文と違ってスペースで区切られていないので、どこからどこまでが
単語か判断できないのですが…
0409学生のときは語学屋でした04/09/14 06:17:42ID:???
>>408
「あの犬ちゃうちゃうちゃう?」
「ちゃうちゃうちゃう、ちゃうちゃうちゃう!」
「えー、ちゃうちゃうちゃう?ちゃうちゃうちゃうん?」
「ちゃうちゃうちゃうんって、ちゃうちゃうちゃうんとちゃうん?」
「ちゃうちゃうちゃうんとちゃうんって、ちゃうちゃうちゃうんな?」

分節してみてください。
人間が「どう分節するか」を定義できなければ、プログラムは分節できませんよ。

便利なモジュール等があるかどうかはともかくとして。
0410nobodyさん04/09/14 06:20:04ID:???
>>408
ググってすぐ出たのはこのあたり。
ttp://kakasi.namazu.org/
ttp://chasen.naist.jp/hiki/ChaSen/

もしくは...「漢字を含む2文字以上」の全てのパターンを網羅するとか。
ハッシュだとファイルサイズの十数倍食いそう。
0411nobodyさん04/09/14 06:58:37ID:???
ちゃうちゃうちゃうちゃうちゃう・・・?_?
0412nobodyさん04/09/14 07:04:12ID:???
>>408
ぱんつくったよ

分節してみてください。
0413nobodyさん04/09/14 15:39:19ID:NAYEHf5j
初級質問失礼します
test.cgiというCGIで、?mode=viewの時viewのサブルーチンに
切り替えたいのですが、リンクを押してもindexの部分が表示されます
---
$mode = $in{'mode'};
if ($mode eq "view") { &view; }
&index;
sub index {
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
}
sub view {
print "this is a view\n";
}
---
すいませんがお願いします
0414nobodyさん04/09/14 15:40:56ID:???
>>413
当たり前だ
よく見てみろ
0415nobodyさん04/09/14 15:48:22ID:???
>>413
exitするかmodeに何もなかったらindexと設定
0416413 04/09/14 15:57:35ID:NAYEHf5j
>>415
elseif ($mode eq "") { &index; }
としても、サブルーチンの最後にexit;つけても駄目でした。
前者ではindexも表示されなくなってしまいました。
0417nobodyさん04/09/14 16:02:26ID:???
釣りお疲れさん
0418nobodyさん04/09/14 16:07:03ID:???
>>416
当たり前だ
よく見てみろ
041941304/09/14 16:09:01ID:NAYEHf5j
>>418
見ればいい場所を教えてください
0420nobodyさん04/09/14 16:24:05ID:???
>>419
indexだけで「Content-Type:」〜「</HTML>」までprintしてるんでしょ?
ヘッダーとかを別のサブルーチンにしてないならindex内で分岐しなきゃ。
0421nobodyさん04/09/14 16:30:19ID:???
elseif
042241304/09/14 16:45:28ID:NAYEHf5j
>>420
すいませんindex内で分岐の意味が・・・。
sub index {
$mode = $in{'mode'};
if ($mode eq "view") { &view; }
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
}
こういうことじゃないですよね?動きません(TT)
CGIは
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
print "<html><body>\n";
〜
print "</body></html>\n";
です。<html></html>タグの行はさっき付け足しました。
0423413 04/09/14 16:46:11ID:???
>>421
elsifでした。でも動かず・・・
0424nobodyさん04/09/14 17:12:57ID:???
$mode = $in{'mode'};
if ($mode eq "view") { &view; }
&index;
sub index {
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
}
sub view {
print "this is a view\n";
exit; #←★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
}
0425nobodyさん04/09/14 17:14:37ID:???
釣りじゃなかったの?こうしたら?

#!/usr/bin/perl
require 'cgi-lib.pl';
$mode = $in{'mode'};
if ($mode eq "view") { &view; }
elsif ($mode eq "") { &index; }
sub index {
print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ

print "<html><body>\n";
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
print "</body></html>\n";
}
sub view {
print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ

print "<html><body>\n";
print "this is a view\n";
print "</body></html>\n";
}
0426nobodyさん04/09/14 17:21:46ID:???
おい、どうなんだ?
最初、elsifがないからいつもindexが実行されてた。
次に、だめだったのは、content-type出力しなかったから。
というお粗松くんじゃないのか?
0427nobodyさん04/09/14 17:35:55ID:???
>#次に一行開けなけりゃだめ
なんだりゃ・・・
042841304/09/14 17:36:16ID:NAYEHf5j
>>424
>>425
いずれも駄目なのですが・・・(TT)なぜでしょう!?
後者は
require 'cgi-lib.pl';
の行は削除してコピペしました(エラーが・・)
0429nobodyさん04/09/14 17:40:57ID:???
>>425
紛らわしいので念のため言っておくと
>print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ
># ここに空行を作るんじゃなくて  ~~改行2個で空行ができてる

>>428
ちょっと確認
クエリ無ければindexを表示するのはわかったけど、
mode=viewならindex+"this is a view"?
それとも"this is a view"だけ表示?
0430nobodyさん04/09/14 17:43:53ID:???
>>428
ちょっと確認
mode=hogeなら?
0431nobodyさん04/09/14 17:54:55ID:???
>print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ
>
ワロタ
0432nobodyさん04/09/14 17:58:23ID:???
ソース全体晒せやヴォケ
0433nobodyさん04/09/14 17:59:19ID:???
>>430
「次に一行開けなけりゃだめ」と出力されます
043441304/09/14 18:03:13ID:NAYEHf5j
>>429
>mode=viewならindex+"this is a view"?
>それとも"this is a view"だけ表示?

this is a viewだけ表示です。
ページを切り替えるような感じで。
043541304/09/14 18:11:36ID:???
>>432
いくつもやりましたがとりあえず駄目その1です(test.cgi)

#!/usr/bin/perl
$mode = $in{'mode'};
if ($mode eq "view") { &view; }
elsif ($mode eq "") { &index; }
sub index {
print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ

print "<html><body>\n";
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
print "</body></html>\n";
}
sub view {
print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ

print "<html><body>\n";
print "this is a view\n";
print "</body></html>\n";
}
0436nobodyさん04/09/14 18:14:25ID:???
$inはどこの世界からやってきたのでしょう(メルヘン
0437nobodyさん04/09/14 18:14:42ID:???
Content-typeはPerlのパスの下に書いたら?2回書くのマンドクセ
0438nobodyさん04/09/14 18:16:32ID:???
>>436
コリン星からやってきたのです
0439nobodyさん04/09/14 18:16:42ID:???
>>435
フォームデコードは?
0440nobodyさん04/09/14 18:18:27ID:???
#!/usr/bin/perl
$|=1;
print "Content-Type: text/html\n\n";
require 'cgi-lib.pl';
&ReadParse(\%in);
if($in{'mode'} eq 'view'){ &view();}
&index();
sub index {
print "<html><body>\n";
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
print "</body></html>\n";
}
sub view {
print "<html><body>\n";
print "this is a view\n";
print "</body></html>\n";
exit(0);
}
exit(0);
044141304/09/14 18:36:18ID:NAYEHf5j
>>440
エラーが出ます。

require 'cgi-lib.pl';
&ReadParse(\%in);

これをコメントアウトするとエラーは出ませんが、動作変わりません。
cgi-lib.plの記述は必要なのでしょうか?
参考にしてるフリーCGIではどれも使われて無いので・・・
なんか長くなってすいません。
0442nobodyさん04/09/14 18:45:09ID:???
>>441
その2行で?mode=viewというクエリを変数に格納している。
PHPだといきなり変数に入ってるから惜しいと言えば惜しいのかも。
「クエリ GET POST」あたりでググって勉強したほうがいい。

#! /usr/bin/perl
print "Content-Type: text/html\n\n<HTML><BODY>";
if($ENV{'QUERY_STRING'} eq "view"){
print "this is a view";
}else{
print "<A href=\"test.cgi?view\">view</A>";
}
print "</BODY></HTML>";
0443nobodyさん04/09/14 18:45:30ID:???
つーか、お前はcgi-lib.plって何か知ってるか?
知らなかったらぐぐれ
0444nobodyさん04/09/14 18:46:14ID:???
PHPは
$_GETとかに勝手に入ってくれるけど、perlは自分でしないとだめだよ

require "./cgi-lib.pl";

&ReadParse(*in);
$hoge = "$in{'hoge'}";
044544004/09/14 18:46:39ID:???
>>441
いい加減にしろよ?w
ttp://cgi-lib.berkeley.edu/
ttp://www.futomi.com/lecture/form/cgilib.html
044644004/09/14 18:48:42ID:???
#!/usr/bin/perl
$|=1;
print "Content-Type: text/html\n\n";
($dust, $in{'mode'}) = split(/=/, $ENV{'QUERY_STRING'}, 2);
if($in{'mode'} eq 'view'){ &view();}
&index();
sub index {
print "<html><body>\n";
print "<a href=\"test.cgi?mode=view\">テスト</a>\n";
print "</body></html>\n";
}
sub view {
print "<html><body>\n";
print "this is a view\n";
print "</body></html>\n";
exit(0);
}
exit(0);
044741304/09/14 19:02:05ID:NAYEHf5j
>>442-446
442, 446で出来ました・・・!!
仰る通りクエリというのが解ってませんでした。
説明とリンクありがとうございました。
勉強します。
お手数おかけしました。><
0448nobodyさん04/09/14 19:39:03ID:???
>>447
cgi-lib.plにパスが通ってなかっただけだろ。
0449nobodyさん04/09/14 19:43:21ID:???
cgi-lib.plすら入れてなかったりして
0450nobodyさん04/09/14 19:45:48ID:???
今の時代にcgi-lib.plかよ
0451nobodyさん04/09/14 19:49:06ID:???
CGIもぢゅるとかダサい
0452nobodyさん04/09/14 20:13:40ID:???
クエリも理解してないお子様にはcgi-lib.plがお似合いだ
0453nobodyさん04/09/14 20:14:58ID:???
理解してなかったらもじゅる使わない方がいいと思うのだけども
0454nobodyさん04/09/14 20:25:49ID:???
>>452
理解して使ってる俺はお子様ですかそうですか。
0455nobodyさん04/09/14 20:39:44ID:???
mainルーチンで decode() とかやってる方がまぬけ
0456nobodyさん04/09/14 20:56:40ID:???
まぬけのinルーチン
■ このスレッドは過去ログ倉庫に格納されています