Perl コーディング初心者質問コーナー Part37
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/08/22 01:41ID:???誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0357355
04/09/13 07:34:16ID:???あれ?使えた・・・・;
-が初めか最後の時にはクォートしなきゃいけなかったのか;
それが面倒であまり使われてないんですかね?それとも他にも何かの処理中に面倒なことが
起こる可能性があったりするんですか?
0358355
04/09/13 07:36:22ID:???0359nobodyさん
04/09/13 07:52:35ID:???0360nobodyさん
04/09/13 08:09:58ID:???文字列をクォートするのはどんな言語でも当たり前のことだろうに。
0361355
04/09/13 09:29:42ID:????
%form = ( a-a => 1 );
エラーになる。use strict環境下だからかもしれないけど。
>>360
通販サイトのCGIだから商品名、商品価格とか色々商品番号をキーとしたハッシュを作る時に
いちいちクォートを入れてると見づらいし、書きづらいorz
ハイフンなしでもいいがCSV形式に変換して落とす時にいちいちハイフンを追加するのもちょっと億劫orz
Perlって結構自由?ゆるい?からマルチバイトかメタ文字以外でクォートすることはないんだorz
だって面倒でしょ。JAVA畑の人は慣れてるかもしれないけどさ。
0362355
04/09/13 09:30:13ID:???の間違いね。
0363nobodyさん
04/09/13 09:33:33ID:aK+3swHZ「あなたのメアドは?」って聞かれたのですが、
これって何に使うのでしょうか?
0365nobodyさん
04/09/13 09:42:28ID:???>>364が言うように請求書が来るが、先払いも可能だよ。クレジット決済でやるのがまあ普通だね。
昔俺はメアドだけなら払わずに無視してもどこの誰だかわからないだろうと思っていたが、
IP+メアドで実は十分個人を特定できるようだ。(もちろん裁判所に申請して住所などの情報を調べる許可を得るみたいだが。)
0368nobodyさん
04/09/13 10:01:53ID:???バグレポートを送ったりそのバイナリをビルドした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;
}
}
ではうまくいきません。どの辺がおかしいかご教授願います。
0371nobodyさん
04/09/13 12:28:08ID:???0372nobodyさん
04/09/13 13:00:27ID:???そこから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:???12345677 てカンマだけを抜かした形で取得したいす
0375nobodyさん
04/09/13 13:06:15ID:???>>370の言うとおり。
if ($key eq 'log'){
$val =~ s/,//g;
$number = $val;
}
0378nobodyさん
04/09/13 13:53:22ID:???0379nobodyさん
04/09/13 14:45:23ID:Dm3Qguqcが数値かどうかを判定するいい方法Plz。
0380nobodyさん
04/09/13 14:48:19ID:???0381379
04/09/13 14:56:19ID:Dm3Qguqcその意味を理解するのに手間取ってしまいました。
if($a =~ /^\d+$/){
#数値
}
ですね、ありがとうございました。
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:???foreach (@vals){
if($_ eq $_-0){
print "$_ = Number\n";
}
}
どう?
0388nobodyさん
04/09/13 16:42:01ID:???0390nobodyさん
04/09/13 16:51:18ID:???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:???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.
0393nobodyさん
04/09/13 17:34:07ID:nbuBgplMクッキーやファイルを使わないでする方法は無いですか?
0394nobodyさん
04/09/13 17:49:54ID:???スレ違い
http://pc5.2ch.net/test/read.cgi/php/1086715675/l50
0396nobodyさん
04/09/13 19:55:34ID:???0397nobodyさん
04/09/13 20:01:22ID:UGDBY8bjm/^[-+]?\d+(\.\d+)?$/
0398nobodyさん
04/09/13 20:17:50ID:???0399nobodyさん
04/09/13 21:08:13ID:ZFdPbvGg何十回も関数リファレンスや講座サイトを見比べても、どこが悪いのかがわかりません。
ちなみに、下記のコードの結果、$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:???-1になってるならforeachが一度も処理されてないってことだろ。
foreach前に
print @st_d;
でも加えて確認してみ?
0402nobodyさん
04/09/13 21:39:15ID:???考えてみたらそうですね。
エラーメッセージが出ないので大丈夫と先入観を持ってました。(ちなみに、ファイル名を変えて、エラーが出るのは確認しました。)
ちなみに@st_dは無表示なので、1〜3行内に間違いがありそうです。
レベル低すぎる質問って自覚したので精進して出直して、ここにお世話にならないように頑張ります。
失礼しました。
0404nobodyさん
04/09/13 21:51:51ID:???本当にわかっていてこうしているのか甚だ疑問なんだが
0405nobodyさん
04/09/13 21:57:42ID:???いちいち$iとか使わないで、
push @c_status, ほげほげ
とやる方がらくちんだよ。最後の$cs_xも、@c_statusの
大きさで読み込んだ行数わかるから冗長。
0406nobodyさん
04/09/13 21:58:08ID:???改変前のコピーを取っておいたフォルダで試してました。
本気で申し訳ありません。
>>404
それは後のサブルーチンで、$c_status[$i][$j]みたいなかんじで使おうと思って。
何か他にいい方法があれば教えていただけますか?
0408nobodyさん
04/09/14 05:51:54ID:???英文と違ってスペースで区切られていないので、どこからどこまでが
単語か判断できないのですが…
0409学生のときは語学屋でした
04/09/14 06:17:42ID:???「あの犬ちゃうちゃうちゃう?」
「ちゃうちゃうちゃう、ちゃうちゃうちゃう!」
「えー、ちゃうちゃうちゃう?ちゃうちゃうちゃうん?」
「ちゃうちゃうちゃうんって、ちゃうちゃうちゃうんとちゃうん?」
「ちゃうちゃうちゃうんとちゃうんって、ちゃうちゃうちゃうんな?」
分節してみてください。
人間が「どう分節するか」を定義できなければ、プログラムは分節できませんよ。
便利なモジュール等があるかどうかはともかくとして。
0410nobodyさん
04/09/14 06:20:04ID:???ググってすぐ出たのはこのあたり。
ttp://kakasi.namazu.org/
ttp://chasen.naist.jp/hiki/ChaSen/
もしくは...「漢字を含む2文字以上」の全てのパターンを網羅するとか。
ハッシュだとファイルサイズの十数倍食いそう。
0411nobodyさん
04/09/14 06:58:37ID:???0413nobodyさん
04/09/14 15:39:19ID:NAYEHf5jtest.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";
}
---
すいませんがお願いします
0416413
04/09/14 15:57:35ID:NAYEHf5jelseif ($mode eq "") { &index; }
としても、サブルーチンの最後にexit;つけても駄目でした。
前者ではindexも表示されなくなってしまいました。
0417nobodyさん
04/09/14 16:02:26ID:???0419413
04/09/14 16:09:01ID:NAYEHf5j見ればいい場所を教えてください
0420nobodyさん
04/09/14 16:24:05ID:???indexだけで「Content-Type:」〜「</HTML>」までprintしてるんでしょ?
ヘッダーとかを別のサブルーチンにしてないならindex内で分岐しなきゃ。
0421nobodyさん
04/09/14 16:30:19ID:???0422413
04/09/14 16:45:28ID:NAYEHf5jすいません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>タグの行はさっき付け足しました。
0424nobodyさん
04/09/14 17:12:57ID:???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:???なんだりゃ・・・
0428413
04/09/14 17:36:16ID:NAYEHf5j>>425
いずれも駄目なのですが・・・(TT)なぜでしょう!?
後者は
require 'cgi-lib.pl';
の行は削除してコピペしました(エラーが・・)
0429nobodyさん
04/09/14 17:40:57ID:???紛らわしいので念のため言っておくと
>print "Content-Type: text/html\n\n"; #次に一行開けなけりゃだめ
># ここに空行を作るんじゃなくて ~~改行2個で空行ができてる
>>428
ちょっと確認
クエリ無ければindexを表示するのはわかったけど、
mode=viewならindex+"this is a view"?
それとも"this is a view"だけ表示?
0431nobodyさん
04/09/14 17:54:55ID:???>
ワロタ
0432nobodyさん
04/09/14 17:58:23ID:???0434413
04/09/14 18:03:13ID:NAYEHf5j>mode=viewならindex+"this is a view"?
>それとも"this is a view"だけ表示?
this is a viewだけ表示です。
ページを切り替えるような感じで。
0435413
04/09/14 18:11:36ID:???いくつもやりましたがとりあえず駄目その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:???0437nobodyさん
04/09/14 18:14:42ID:???0440nobodyさん
04/09/14 18:18:27ID:???$|=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);
0441413
04/09/14 18:36:18ID:NAYEHf5jエラーが出ます。
require 'cgi-lib.pl';
&ReadParse(\%in);
これをコメントアウトするとエラーは出ませんが、動作変わりません。
cgi-lib.plの記述は必要なのでしょうか?
参考にしてるフリーCGIではどれも使われて無いので・・・
なんか長くなってすいません。
0442nobodyさん
04/09/14 18:45:09ID:???その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:???知らなかったらぐぐれ
0444nobodyさん
04/09/14 18:46:14ID:???$_GETとかに勝手に入ってくれるけど、perlは自分でしないとだめだよ
require "./cgi-lib.pl";
&ReadParse(*in);
$hoge = "$in{'hoge'}";
0445440
04/09/14 18:46:39ID:???いい加減にしろよ?w
ttp://cgi-lib.berkeley.edu/
ttp://www.futomi.com/lecture/form/cgilib.html
0446440
04/09/14 18:48:42ID:???$|=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);
0447413
04/09/14 19:02:05ID:NAYEHf5j442, 446で出来ました・・・!!
仰る通りクエリというのが解ってませんでした。
説明とリンクありがとうございました。
勉強します。
お手数おかけしました。><
0449nobodyさん
04/09/14 19:43:21ID:???0450nobodyさん
04/09/14 19:45:48ID:???0451nobodyさん
04/09/14 19:49:06ID:???0452nobodyさん
04/09/14 20:13:40ID:???0453nobodyさん
04/09/14 20:14:58ID:???0455nobodyさん
04/09/14 20:39:44ID:???0456nobodyさん
04/09/14 20:56:40ID:???■ このスレッドは過去ログ倉庫に格納されています