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

【Perl】初心者コーナーPart9

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。01/12/28 23:21ID:SPLRvqQi
いらっしゃーい、Perlのコーディングで困ってる人のスレです。

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

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/

過去ログ、その他の役立ち情報は>>2-10を見よう。
0331名無しさん@お腹いっぱい。02/01/22 10:36ID:???
>>330
http://pc.2ch.net/test/read.cgi/php/1003132904/l50
0332名無しさん@お腹いっぱい。02/01/23 04:57ID:sT5Qn28R
すみません。質問なんですが、
htmlファイル内の&を%44になおすプログラムを作っていて
以下のとおりやってはみたもののうまくいきません。
#!/usr/local/bib/perl

while(<stdin>){
s/&;/%44;/;
print;
}

どうしても置き換えてくれません。
教えてください。
0333名無しさん@お腹いっぱい。02/01/23 05:16ID:???
>>332
Perlへのパス
stdinからデータが読み込まれているか
検索・置換する文字列
を確認してみてわ
033433202/01/23 07:16ID:sT5Qn28R
>333
遅れてすみません
333さんがおっしゃられるところは確認しました。
自分で気になっているところは
test→test1みたいな普通の文字の置き換えはできるのですが
&とか%がはいっているとまったく駄目なのです。
どうしたら解決できるかわからなくて。。。
0335名無しさん@お腹いっぱい。02/01/23 09:25ID:fLlnsoLj
>>334 ほい。 

#!/usr/local/bin/perl

while(<stdin>){
s/&/%44/g;
print;
}
0336名無しさん@お腹いっぱい。02/01/23 19:47ID:SS/bYptO
メール件名をMIMEエンコードしようと思い、
CGIファイルと同ディレクトリに「mimew.pl」
http://www.cc.rim.or.jp/~ikuta/mime_pls/index.html を設置して、
CGI内のメールのヘッダ情報記述部分で
$mimew = './mimew.pl';
require $mimew;
$subject = "[カタログ請求]";
$subject2 = &mimeencode($subject);
open (SENDMAIL, "| $nkf | $sendmail -t -n") || die;
print SENDMAIL "To: $recieve\n";
print SENDMAIL "Bcc: $bcc\n";
print SENDMAIL "From: $mail\n";
print SENDMAIL "Reply-To: $mail\n";
print SENDMAIL "Subject: $subject2\n";
print SENDMAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
print SENDMAIL "Content-Transfer-Encoding: 7bit\n\n";
上記のようにしたのですが、エンコードされません。
お助け。。。
0337名無しさん@お腹いっぱい。02/01/23 20:15ID:???
>>336 
$nkf = '/usr/local/bin/nkf';
$sendmail = '/usr/sbin/sendmail';
$mimew = '/フルパス書いてちょ〜/mimew.pl';

でどうよ。

0338ちょっとおしえて ごめんね02/01/23 20:48ID:FEde7HEx
http://money.2ch.net/test/read.cgi/build/1011774209/23 が言ってる
掲示板一覧ってどこから入るの?
0339名無しさん@お腹いっぱい。02/01/23 21:30ID:Pj40bVNf
http://www16.big.or.jp/~plustic/0range/JAPANESE/dustbox/404.html
の404のエラーの例として、.htaccessにて404.cgiを表示させてますよね。

この404.cgiの中で、ユーザーが打ち込んだURLを表示させてるんですが、
これってPerlでどう書いたらいいんでしょうか?
034033202/01/23 21:37ID:sT5Qn28R
333 335>
貴重なアドバイスありがとうございました。
解決しました。
あらためてありがとうございます。
0341名無しさん@お腹いっぱい。02/01/23 22:30ID:RVBh2RNr
1:自分はこう言う事がしたい。
テキストカウンタを作っている。
CGI自体はhtmlでなくテキストだけを吐いて、
イメージカウンタと同じような感じに
html内に挿入するようにしたい。

2:それでこんな風にやってみたが・・・
Content-typeをtext/htmlにしたままimgで貼ってみたけど

3:それだとこんなエラーが出て上手く行かなかった。
ペケが出るだけで無理だった。
0342名無しさん@お腹いっぱい。02/01/23 22:34ID:6XVla5oi
フォームメールcgiに手をくわえてます。
htmlフォームから送信ボタンを押すとcgiを呼んで確認で内容を一覧表示させてます。
そのあとにブラウザの戻るボタンを押したとき、htmlフォームに戻りますが、それまで
入力していた内容が消えてしまいます。元のcgiではブラウザの戻るボタンで戻っても
フォームに入力されていた内容は消えなかったんです。
この違いはどういった原因が考えられるでしょうか?
034334202/01/23 22:44ID:6XVla5oi
あれ?今度は戻るボタン押して戻ったらフォームに入力した値が出てた・・
CGIの影響じゃないのかな・・ この現象誰か知りませんか?

>>341
ペケが出るって事は画像へのリンクがうまくいってないんじゃないかな?
034434102/01/23 22:58ID:RVBh2RNr
>>343
いや、画像でなくテキストを挿入したいんですが
コンテントタイプの吐きかたとhtml側の呼び出し方がわからなくて
とりあえずimgで貼ってみただけです。。
CGIが画像を吐いてないので当たり前といえば当たり前なんですが。。

>フォーム
戻るボタンは単にブラウザが自分の履歴を表示しているんだから
この場合呼び出されてないCGIは関係ないと思います。
というか、どんな風に手を加えたらおかしくなったかを書くと吉と思われ。
0345名無しさん@お腹いっぱい。02/01/23 23:05ID:???
>>341
一般にはSSIやフレームが使われる。
034633602/01/23 23:07ID:7DXRWN8l
>>337
ありがとうございます。

今外出中なんで明日にでも試してみます。
034734102/01/23 23:16ID:RVBh2RNr
>>345
有り難うございます。
過去にフレームで画面をちっちゃく切り取って
そこにhtmlで吐いたカウントを放り込んでいたんですが、
それをやめたくていろいろ試しているので
SSIの方を調べてみようと思います。
0348名無しさん@お腹いっぱい。02/01/24 00:12ID:gcEosdJo
配列の中にある数字を指定した部分だけ検索したいんですが、

for ($no = 0; $no <9; ++$no){
@suuji = (1,2,3,4,5,6,7,8,9,10);
@kekka = grep /$no/, @suuji;
print "@kekka\n";
}

を実行すると、
10
1 10
2
3
4
5
6
7
8

と、10まで出てきてしまうんですが、
1から9までのみ出すようにするにはどうすればいいんでしょうか?
0349名無しさん@お腹いっぱい。02/01/24 00:15ID:???
for ($no = 0; $no <9; ++$no){
@suuji = (1,2,3,4,5,6,7,8,9,10);
@kekka = grep /^$no$/, @suuji;
print "@kekka\n";
}

誰でも思いつく一番簡単な変更はこれだわな。
0350ブロックで使うとお手軽だにゃん02/01/24 00:23ID:???
my @ary = qw(1 3 4 5 8 9 11 14 19);
my $max = 10;
my $min = 3;
my @result = grep{$_ > $min && $_ < $max}@ary;
print @result;
0351名無しさん@お腹いっぱい。02/01/24 00:32ID:???
print join "\n", grep { /^\d$/ } @hoge
0352名無しさん@お腹いっぱい。02/01/24 00:34ID:???
>>349-351
ありがとうございました。なんとか出来そうです。
正規表現だけで出来たんですね…。もっと本をよく読みます。
035335202/01/24 05:00ID:???
出来ない…

1 あいうえお
2 かきくけこ

というようなものが、配列に100個ほど入っているとして、
右の番号を指定して、その部分だけ左のものと一緒に取り出したいんですが…。

上のやりかただと、どうやっても出来なくて…。

このままじゃ気になって寝られない…でも寝ないと死ぬので寝よう…
0354名無しさん@お腹いっぱい。02/01/24 08:11ID:nUVwgo4z
>353
デリミタを使う。
1<>あいうえお
2<>かきくけこ
・
・
・
とする。
これを配列に読み込んで、、たとえば、@linesに読み込んだとしたら、
foreach (@lines) {
 ($number,$text) = split(/<>/,$_);
 if ($number eq "目的の番号") {
  print "番号は$numです。内容は$textです\n";
 }
}
こんなかんじになるわけ。
0355名無しさん@お腹いっぱい。02/01/24 09:08ID:???
FAQだと思うのですが
LinuxにPerlがインストールされているかどうかを
確認するには簡単にはどうするのでしょうか。

そのperlのVersionも表示させれると
うれしいのです。

よろしくサンクスコ
0356名無しさん@お腹いっぱい。02/01/24 09:12ID:nUVwgo4z
>355
コマンドラインから、
perl -V
0357名無しさん@お腹いっぱい。02/01/24 09:19ID:???
ありがとうございます。m(._.)m ペコッ
035833602/01/24 10:49ID:ENGsaylW
>open (SENDMAIL, "| $nkf | $sendmail -t -n") || die;
上記の部分を以下の様にすると、無事エンコード処理されました。
open (SENDMAIL, "| $sendmail -t -n") || die; #$nkfを外しました

結果的に解決はしたのですが、何が悪かったのかが分かっていません。
そもそも上記の箇所はいつもメール作成部分の定型的に使用していたの
で、nkfがどんな役割を果たしているのか、なぜnkfが絡むとエンコードさ
れなかったのかがわかっていません。
(ちなみにnkfは冒頭で $nkf = "/usr/bin/nkf -j"; と定義しています)

何が悪かったのでしょうか?
0359名無しさん@お腹いっぱい。02/01/24 11:11ID:LyCCkAYD
@EXPORT, @INC は何を意味して名前を付けたのかわかるのですが
@ISAって何の略なのでしょう?
0360名無しさん@お腹いっぱい。02/01/24 11:26ID:???
@EXPORTはそのまんま。
@INCはIncludeかねぇ。
@ISAはISAバスしか思いつかない・・・。
0361名無しさん@お腹いっぱい。02/01/24 11:44ID:???
is a と読めば良いでしょう
0362名無しさん@お腹いっぱい。02/01/24 11:45ID:???
>>361
なるほど。
0363名無しさん@お腹いっぱい。02/01/24 11:46ID:???
>>361
継承元と。
へぇ。
0364Technetium@1000ゲト ◆gZEJGdGE 02/01/24 12:57ID:???
困っているわけではないのですが、ちょっと質問です。
IPの桁を
「0.0.0.0」→「 0. 0. 0. 0」
こんな風にそろえるプログラムを作ってみたんです。
で、この桁をそろえる部分でどれくらいのロスがあるのかなと思って、2種類のプログラムを組んで試してみました。

プログラム「い」
($ipa , $ipb , $ipc , $ipd) = split(/\./, $remoteadd);
if ($ipa < 10) { $ipa = " $ipa"; }
elsif ($ipa < 100) { $ipa = " $ipa"; }
if ($ipb < 10) { $ipb = " $ipb"; }
elsif ($ipb < 100) { $ipb = " $ipb"; }
if ($ipc < 10) { $ipc = " $ipc"; }
elsif ($ipc < 100) { $ipc = " $ipc"; }
if ($ipd < 10) { $ipd = " $ipd"; }
elsif ($ipd < 100) { $ipd = " $ipd"; }
$ipadd = "$ipa\.$ipb\.$ipc\.$ipd";

プログラム「ろ」
@ip = split /\./, $remoteadd;
if ($ip[0] < 10) { $ip[0] = " $ip[0]"; }
elsif ($ip[0] < 100) { $ip[0] = " $ip[0]"; }
if ($ip[1] < 10) { $ip[1] = " $ip[1]"; }
elsif ($ip[1] < 100) { $ip[1] = " $ip[1]"; }
if ($ip[2] < 10) { $ip[2] = " $ip[2]"; }
elsif ($ip[2] < 100) { $ip[2] = " $ip[2]"; }
if ($ip[3] < 10) { $ip[3] = " $ip[3]"; }
elsif ($ip[3] < 100) { $ip[3] = " $ip[3]"; }
$ipadd = "$ip[0]\.$ip[1]\.$ip[2]\.$ip[3]";

この二つを、

while (--$kurikaesi){
}

の中に入れて1000000回(爆)繰り返してベンチマークした結果、プログラム「ろ」の方が約1秒も速いという結果を得ました。
速いのはいいんです。それはいいんですが、なぜ配列を使っただけで処理速度が上がったのかがわかりません。
これはなぜなのでしょう?
0365名無しさん@お腹いっぱい。02/01/24 14:49ID:???
>>364
sprintfとかじゃだめなんでしょうか?
0366配列02/01/24 15:36ID:RS3bsnfp
しつもーん
(1)配列をある文字列で検索して、その配列の番号を調べる。
(2)配列の任意の位置に要素を代入(追加)する
(3)配列をCSVデータ(カンマ割りテキスト)に変換する。

上の事をforeachなんかを使って配列の要素をグルグル一個一個
調べて実現する事は出来るんだけど・・・もっと効率的なやり
方があるような気がしてならない・・・。

(2)はつまり
@ary[0]="A";@ary[1]="C";@ary[2]="D";を、いかにして
@ary[0]="A";@ary[1]="B";@ary[2]="C";@ary[3]="D";
にするかって事なんだけど・・・簡単?
0367名無しさん@お腹いっぱい。02/01/24 15:40ID:???
>366
@ary = (@ary[0 .. 1] , $newdata , @ary[2 .. $#ary]);
とかいう方法は?
0368名無しさん@お腹いっぱい。02/01/24 15:49ID:???
>>366
とりあえず(2)だけ
splice @hoge, 1, 0, 'B';
0369名無しさん@お腹いっぱい。02/01/24 15:51ID:???
続けて(3)
こういうことかな?
join ',', @hoge;
0370名無しさん@お腹いっぱい。02/01/24 15:53ID:nUVwgo4z
(1)は普通、ぐるぐる回すしかない。
0371配列02/01/24 15:53ID:RS3bsnfp
>>367
なるほどぉ、そういう風にするのかぁ。
できました、できました。ありがとうございます。

>>368
あっ、こんなやり方も・・・これから試してみます。
ありがとうございます。

>>369
そんなに簡単に・・・試してみます。
0372配列02/01/24 15:59ID:RS3bsnfp
すごい!!>>369>>368できました。なんて簡単なんだ!

(1)はやはりグログロ回すしかないんですね。
0373名無しさん@お腹いっぱい。02/01/24 16:03ID:???
(1)はこんなのいかが?
my @hoge = qw(hoge fuga foo bar);
my $i;
print join " ", map { $_->[0] } grep { $_->[1] =~ /f/ } map { [ $i++, $_ ] } @hoge;
#=> 1 2
0374名無しさん@お腹いっぱい。02/01/24 16:10ID:???
でもBenchmarkとったらforで回した方が早いな。
インデント崩れるかな。

use Benchmark;

timethese(10000, {
A => sub {
my @hoge = qw(hoge fuga foo bar);
my $i;
my @res = map { $_->[0] } grep { $_->[1] =~ /f/ } map { [ $i++, $_ ] } @hoge;
},
B => sub {
my @hoge = qw(hoge fuga foo bar);
my @res;
for (my $i = 0; $i <= $#hoge; $i++) {
$hoge[$i] =~ /f/ or next;
push @res, $i;
}
},
});
0375名無しさん@お腹いっぱい。02/01/24 16:12ID:nUVwgo4z
foreachで回すのが一番早そうな予感・・・・・・・
0376配列02/01/24 16:13ID:RS3bsnfp
>>373
スゴ!ここまでになると僕には記号の羅列にしか見えませんが
出来ました。

う=ん。perlは深すぎる。
0377名無しさん@お腹いっぱい。02/01/24 17:37ID:???
>う=ん
めっちゃなごんだ
037835202/01/25 00:02ID:???
>>354
えと、これを実行したところ、
($number,$text) = split(/<>/,$_);
の行でエラーが出ました…。
何か変えないといけないんでしょうか…。
0379名無しさん@お腹いっぱい。02/01/25 00:06ID:???
>378
まさか全角スペースそのままでコピペとかしてないよな?
0380名無しさん@お腹いっぱい。02/01/25 00:17ID:PBLVziZQ
>379
それだな・・・・

>378
インデント使えないから全角スペースはいってます。
半角スペースに直して下さい。
038135202/01/25 01:47ID:???
あ…全角になってました…。
半角にしてやったらうまく動きました。
今度こそ…。

ありがとうございました。
0382配列02/01/25 12:07ID:IeC8qMZZ
...と、和ませついでに聞いてみる。

僕のような初心者がもう一歩踏み出す為の本ってなんかお
勧めありますか?

あと、思うのは英語がわかれば、プログラム言語の収得の
時間は半分くらいに短縮できるんじゃないだろうか?文献
もイパーイあるし、そもそも構文が英語だし、その点日本人っ
てかなり不利な様な・・。

関係ないけど今、Apacheの設定してんだけど、もう、この
コメントがスラスラ読めたらどんなに楽だろう・・・と・・・
ふ=。
0383名無しさん@お腹いっぱい。02/01/25 12:51ID:???
>>382
そんな君の為に http://www.scripts-lab.co.jp/qa/whatsmind.html
0384名無しさん@お腹いっぱい。02/01/25 13:40ID:r3/rqZp3
↑
絶対に、わかりずらいぞ。
日本語記述プログラム
0385名無しさん@お腹いっぱい。02/01/25 14:55ID:eF69uSNx
open(FILE, "<$FilePath");
while (read FILE, $_, 1024) {
  unless ($Count % $DivSize) {
   $FCount = sprintf("%04d", ++$FCount);
   open(OUT, ">${FileName}_$FCount$AddExt");
   binmode(OUT);
  }
  print OUT $_;
  $Count++;
}

これは $DivSize に 500 とか指定して指定KB単位で
ファイルを分割する(昔DOSで使っていたkitcutみたいな)のですが、
Active Perl for Linuxでは期待通りに動くのに
Active Perl for Win32(Win98SE)では失敗します。

直接の原因は読み込むファイルに"0x1A"があると
そこで処理が終了してしまうようですが、
なぜそうなるのかは分かりません。
Windows系OSでも正常に動かすにはどうすればよいのでしょうか?
0386名無しさん@お腹いっぱい。02/01/25 15:08ID:79BxtF4T
ハッシュの値に配列を登録することはできるのでしょうか?

my @array;
my @some_array = (1, 2, 3);
%hash = {'key' => @array};
for (@some_array){
 push $hash{key} $_;
}
print $hash{key}[0]; #出力は「1」

となるようにしたいのですが、「push $hash{key} $_;」ここで
compilation errorが出てしまいます。

希望通りの結果を出すにはどのようにすればよいのでしょう?
0387 ◆wfMSpsRY 02/01/25 15:15ID:???
my @some_array = (1, 2, 3);
my %hash = ("key" => \@some_array);
print $hash{"key"}[0];
0388■■■■■02/01/25 17:52ID:xsDEBfwk
#!/usr/local/bin/perl -w
↑の-wはどういう意味なのでしょうか?
0389名無しさん@お腹いっぱい。02/01/25 17:57ID:???
>>388 検索しろやボケ(w ←の"w"と同じ。
0390名無しさん@お腹いっぱい。02/01/25 18:02ID:???
ちなみに
#!/usr/local/bin/perl -プ

にすると警告メッセージの文体がうざくなります
0391名無しさん@お腹いっぱい。02/01/25 18:03ID:/7cgUOJj
>388
ワーニングのwだよ。
0392■■■■■02/01/25 18:07ID:xsDEBfwk
どんなキーワードで検索するのですか?
マジ質問なんですが。-wはキーワードにならないもので。
0393名無しさん@お腹いっぱい。02/01/25 18:08ID:???
がんぼれ

http://www.google.com/search?hl=ja&q=perl+%83X%83C%83b%83%60+w&lr=
0394■■■■■02/01/25 18:08ID:xsDEBfwk
なるほど、「スイッチ」ですか。ありがとうございます。
0395名無しさん@お腹いっぱい。02/01/25 18:17ID:???
正直 man perl / perldoc perl ぐらい見ろやボケ と言いたい。タダの教えて厨じゃん。
0396名無しさん@お腹いっぱい。02/01/25 18:21ID:???
マターソ光線  しびび(以下略
0397名無しさん@お腹いっぱい。02/01/25 18:28ID:S6WZ3j03
ユーザーに一時的にユニークなIDを付加したいのですが、
何か定石になっている方法等はないでしょうか。
0398親切な人02/01/25 18:42ID:???

ヤフーオークションで、幻の人気商品、発見!!!

今は無き「コピーガードキャンセラー」↓
http://page5.auctions.yahoo.co.jp/jp/auction/e5843828

ヤフーオークション内では、現在、このオークション
の話題で、持ちきりです。
0399名無しさん@お腹いっぱい。02/01/25 18:52ID:???
>397
$$
0400名無しさん@お腹いっぱい。02/01/25 18:52ID:???
400
0401名無しさん@お腹いっぱい。02/01/25 20:53ID:???
>>385
これは、0x1A(=^Z)がDOSでEOFだったという歴史的経緯によるもの。
純粋に入力をバイナリとして扱うには、FILEについても
openの直後にbinmode(FILE)とすることで解決するはず。
0402名無しさん@お腹いっぱい。02/01/25 21:24ID:Y6CV5/iR
>>399
やはり$$が定石なのですね。
ありがとうございました。
0403名無しさん@お腹いっぱい。02/01/25 21:56ID:79BxtF4T
自作のPerlモジュールを@INCのパスに
置かずに、使用する方法はあるのでしょうか?
0404名無しさん@お腹いっぱい。02/01/25 22:02ID:/7cgUOJj
>403
use lib
0405名無しさん@お腹いっぱい。02/01/25 22:05ID:???
>403
ていうか、モジュール自作できるのに、そのモジュールの使い方がわからないなんて事あり得るのだろうか?
040640302/01/25 22:36ID:79BxtF4T
ゴメンよ、お馬鹿で。でもあり得るんだよ、実際ココにいるから。

で、
use lib '/path/to/my_module_dir';
を加えたら、とりあえず動いたんだけど、
use lib 'ディレクトリパス';
とすれば @INC にここで指定した'ディレクトリパス'が
加わったのと同様と考えていいのですか?
0407名無しさん@お腹いっぱい。02/01/25 22:57ID:???
use lib "/path/to/dir";
print @INC;

で分かるだろが。自分で調べろヤ。
0408名無しさん@お腹いっぱい。02/01/25 23:02ID:???
マターソ光線  しびび(以下略
0409名無しさん@お腹いっぱい。02/01/25 23:10ID:XMaI9lFd
>>401
ありがとうございます。
入力側もバイナリモードにすることにより期待通りに動きました。
出力に関しては以前引っかかったことがあったので
気にしていたのですが入力も、とは・・・やられました。
0410名無しさん@お腹いっぱい。02/01/25 23:39ID:???
>マターソ光線  しびび(以下略
これって教えて君を増やす為なの?
0411名無しさん@お腹いっぱい。02/01/26 00:51ID:OfzJhL7v
SSHでログインして「use benchmark;」を使ってベンチマークをするのは出来たんですが
これって、ブラウザからは出来ないんですか?500エラーになるんですが…。
結果の数値を表示させるにはどうしたら良いでしょう?
0412名無しさん@お腹いっぱい。02/01/26 02:20ID:WUMSdJPW
jisコードの数字(ISO2022-JPの文字列ではなくて、文字をあらわす
文字コード、例えば「あ(2422)」の2422という数字)
をEUCの文字に変換して出力するにはどうしたらよいのでしょうか?
print &convert(2422);
(表示)
あ
見たいな感じにしたいんですが・・・。
0413agege02/01/26 03:19ID:???
> 411
use benchmark; ⇒ use Benchmark;
0414名無しさん@お腹いっぱい。02/01/26 16:03ID:???
>>412
packを使ってみ
0415名無しさん@お腹いっぱい。02/01/26 18:44ID:4vbo6FDe
質問なのですが

Perlで、配列を一つのスクリプト内で何度も再利用することで、
その都度、別の名前の配列を複数作る場合に比べて
メモリ消費は低減できるのでしょうか?
0416ループに関して02/01/27 23:58ID:y07CruPJ
formからpostで受け取ったデータを
ハッシュにして…ってところ何ですけど。

require './cgi-lib.pl';
&ReadParse(*form);

$A1="$form{'A1'}";
$B1="$form{'B1'}";
$A2="$form{'A2'}";
$B2="$form{'B2'}";
$A3="$form{'A3'}";
$B3="$form{'B3'}";
・
・
・
$A50="$form{'A50'}";
$B50="$form{'B50'}";

っていう感じにしたいんです。
まあ「動く」ってだけなら気合いで書けば問題ないんですけど、
ループとか使ってきれいに書く方法を教えていただきたいのです。

どうもループは苦手でして。。。よろしくお願いします。
0417名無しさん@お腹いっぱい。02/01/28 00:45ID:i9Ky8+Ox
>416
while (($key,$value) = each(%form)) {
    $$key = $value;
}
なんのためにこんな事をするんだろう?・・・・
0418うんこ02/01/28 07:44ID:???
>>414
情報ありがと。漏れの検索が甘かったです。すんません。
0419http://nara.cool.ne.jp/mituto02/01/28 15:08ID:Ye799Ifr
3月24日〜27日に立命館大学BKCに田中洸人氏が来ます。
http://210.172.69.179/jps_search_02au
http://nara.cool.ne.jp/mituto
0420 02/01/28 15:19ID:???
うんこ発見!!!
0421名無しさん@お腹いっぱい。02/01/28 15:29ID:???
>420
いいようんこ見つけたくらいでいちいち騒がなくて。
小学生じゃあるまいし。
0422うんこ02/01/28 16:35ID:???
あーあ、みつかっちまった。(誰に?!)
厨房だからっていじめないでおくれよ。
頑張ってプログラミングしてます。
0423名無しさん@お腹いっぱい。02/01/29 00:28ID:4QGFGOvy
以下のようなtest.plを作って実行すると
config.txt did not return a true value at test.pl line 4.
と言われてしまいます。しかも
print "$board\n";以下が表示されません。
どうしたものでしょうか。

config.txtに
$board = "文字列01";
$dir = "文字列02";
$limit = "文字列03";
$down = "文字列04";
を書き込んでいます。


======test.plの内容======
#!/usr/bin/perl -w

if ($#ARGV < "0") { print "[ERROR]\tUsage: perl test.pl config.txt\n"; exit; }
if (-e $ARGV[0]) { require ($ARGV[0]); }
if (!defined($board) || !defined($dir) || !defined($limit) || !defined($down)) {
print "[ERROR]\n";
exit;
}

print "$board\n";
print "$dir\n";
print "$limit\n";
print "$down\n";
0424名無しさん@お腹いっぱい。02/01/29 00:34ID:kF9Gt4SC
>423
config.txtのお尻に
1;
と書いてみる。
0425名無しさん@お腹いっぱい。02/01/29 01:05ID:aDiD5uGU
my $sentence = '今日は29日だ。01:05分';

if ($sentence =~ /([\d]+)/) {
$sentence .= "\n・$1";
}

print $sentence;

この結果
> 今日は29日だ。01:45分
> ・29
が出力されますけど、
いくつ含まれているか判らない数字列を全部取り出して、
それを全部後ろにくっつけて、
> 今日は29日だ。01:05分
> ・29
> ・01
> ・05
と出すにはどうすればいいでしょう。
0426名無しさん@お腹いっぱい。02/01/29 01:11ID:???
while($sentence =~ s/([\d]+)//) {
$sentence .= "\n・$1";
}

間違えると無限ループになるから注意。
0427名無しさん@お腹いっぱい。02/01/29 01:14ID:???
tu-ka,自分で間違ってるじゃん。

$sentence2 = $sentence;
while($sentence =~ s/([\d]+)//) {
$sentence2 .= "\n・$1";
}
0428 ◆7P5EE/DI 02/01/29 01:19ID:???
my @number = $sentence =~ /\d+/g;
$sentence .= join "\n", '', map { '・' . $_ } @number if @number > 0;
0429名無しさん@お腹いっぱい。02/01/29 01:23ID:qEiE9m0V
"20020129012155"という文字を
$yyyy = "2002";
$mm = "01";
$dd = "29";
$h = "01";
$m = "21";
$s = "55";
こうしたいんですが、スマートなやり方はないでしょうか?
今は
@date = split //,$date;
for (1..4) {$yyyy .= shift @date;} for (1..2) { $mm .= shift @date;}
こんなのを書いてるんですがいかんせん汚い・・・
0430 ◆7P5EE/DI 02/01/29 01:32ID:???
/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/

あんま奇麗じゃないか
■ このスレッドは過去ログ倉庫に格納されています