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

【Perl】初心者コーナーPart11

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/03/27 12:53ID:wAXxxOxP
 
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

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

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

過去ログ、その他の役立ち情報は>>2-10を見よう。
0459nobodyさん02/04/13 20:19ID:???
>>452
($kekka = $moto) =~ s/foo/bar/g;
0460nobodyさん02/04/14 03:22ID:???
>うるせえんだよボケが!!!!!!!!!!!
これ、はやってんだ、漏れも使お、
へへへ、まんこ
0461nobodyさん02/04/14 10:17ID:V1/8ijC1
こんにちは、
さっそく質問なのですが、
スカラーに入れた(入った)文字列をスカラー名にする方法ってあるのでしょうか?

$a = "test";
$b = "value";

として

$test = "value";

というようなことなのですが
よろしくお願いいたします。
0462${$a}02/04/14 10:38ID:???
>>461
せめてこのスレくらい最初から読んでくれ。
0463nobodyさん02/04/14 10:40ID:V1/8ijC1
ひぃーごめんなさい。
046446102/04/14 10:42ID:V1/8ijC1
でも本当に助かりました。
ありがとうございました。
0465TOM ◆98SA9XcM 02/04/14 12:23ID:Gksq2mQe
open(LOAD,"mona.dat");
@mona1 = <LOAD>;
close(LOAD);

foreach (@mona1) {
($yakin,$hiroyuki) = split(/<>/);
if($yakin eq $FORM{'yakin'}) {
(?)
next;
}
}

え〜と、(?)の部分で、現在処理中の配列を、削除したいわけです。
ようは、配列をforeachで読んでいって、$yakinと、
送信されてきた(フォームから投稿されてきた)
$FORM{'yakin'}が一致した場合、現在処理している配列を削除したいわけです。
(?)の部分に、なんと入れたらいいのか、よろしくです
0466nobodyさん02/04/14 12:32ID:???
>>465
undef $array{$yakin};
とか?
0467nobodyさん02/04/14 12:45ID:???
foreach (@mona1) {
($yakin,$hiroyuki) = split(/<>/);
if($yakin eq $FORM{'yakin'}) {
$_ = '';
next;
}
}
@mona1 = grep /\S/, @mona1;

でいいかな? なんか無駄が多そうだが。
0468TOM ◆98SA9XcM 02/04/14 12:53ID:Gksq2mQe
thank!っす。
これで、海へ行けるぞー!
0469nobodyさん02/04/14 12:55ID:???
配列を二つ受け取り、その各要素ごとの和を格納した配列を返す
サブルーチンはどのように書けばいいのでしょうか?
0470初心者02/04/14 12:58ID:GNKyG6Nl
こちとら超初心者です。質問させてください。
Apacheっていうソフトを入れて、Webサーバっつーの立てて
そこでPerlをデバッグしてみてるんですが、簡単なSSIのアクセスカウンタが動いてくれません。
HTMLで「あなたは人目のお客様です」とだけ表示されます。
エラーログには何も書いてないし、DOSプロンプトでチェックしてもSyntax OKって出るだけっす。
カウンタの数字を保存するファイルのパーミッションの問題なのかな〜とか思ってるのですが、
Apache上のファイルのパーミッションを変える方法がわからんです。
昨日はじめたばっかしなので質問の意味がさっぱりかもしれませんが、よろしくです。
0471nobodyさん02/04/14 12:59ID:???
>>465
splice使え。
0472nobodyさん02/04/14 13:12ID:???
>>470
カウンタを格納するファイルのパーミッションを、nobodyさんでも
書き込めるように汁。
047347002/04/14 13:32ID:S6NECtrZ
>>472
c:\public_htmlにファイルを置いてやっているのですが、
いろいろ調べてみてもFTP転送時のパーミッション変更方法しか載ってなかったです。
格納ファイルのプロパティでアーカイブやら読み取り専用やら(Win98SE)、いろいろ変えてみたんですが
結果は変わらず。自分のPCなのにFTP転送とか出来るんでしょうか?
説明下手でごめんなさい。
0474TOM ◆98SA9XcM 02/04/14 13:45ID:Gt4aB1lk
自分を初心者と認めるなら、ApacheよりAnHTTPdがいいよ。
KEN○さんのページでわかりやすく解説載ってたし。
ttp://www.kent-web.com
0475_gunzip02/04/14 13:47ID:???
>>469 こんなかんじ

#!/usr/bin/perl -w

use strict;
our($a, $b);

sub mapup (& \@ \@)
    #(code_ref $code, array_ref $_a, array_ref $_b)
{
    my($code, $_a, $_b) = @_;
    my @retval;
    my $max_index = (@$_a < @$_b) ? @$_a : @$_b;
    
    for (my $i = 0; $i < $max_index; $i++) {
        local($a, $b) = ($_a->[$i], $_b->[$i]);
        push @retval, $code->();
    }
    return @retval;
}

my @a = (1, 2, 3);
my @b = (0, 8, 7);
my @c = qw[ G C A T ];
my @d = qw[ C G T A ];

my @sum = mapup { $a + $b } @a, @b; # (1, 10, 10)
my @pro = mapup { $a * $b } @a, @b; # (0, 16, 21)
my @bigger = mapup { $a > $b ? $a : $b } @a, @b; # (1, 8, 7)
my @concat = mapup { $a . "-" . $b } @c, @d; # (G-C,C-G,A-T,T-A)
0476nobodyさん02/04/14 13:53ID:IPbdNQdj
imgboard v1.22 R6ってIP隠せないんですか?
丸見えなんですが。
0477nobodyさん02/04/14 14:06ID:???
>>476

> いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。
>
> 1:自分はこう言う事がしたい。
> 2:それでこんな風にやってみたが・・・
> 3:それだとこんなエラーが出て上手く行かなかった。
>
> 1と3が無いと誰も答えられないよ、良い回答は良い質問から。
> 一緒に勉強しましょう。
0478nobodyさん02/04/14 14:07ID:???
>>476
で、ここ。

スクリプト改造工房 Part4
http://pc.2ch.net/test/read.cgi/php/1012839651/
047947202/04/14 14:11ID:???
>>473
あぁぁ、Windowsならパーミッションは関係なさそう。
SSIの場合は、
1.apacheの設定ファイル(httpd.conf)でSSI(Server-parsed HTML)が
有効になってるか確認。
  AddType text/html .shtml
  AddHandler server-parsed .shtml
こんなかんじ。
2.SSIを使うhtmlファイルの拡張子が .shtml になってるか確認。

あとは、>>474に従うのもありかと。
048047002/04/14 14:13ID:S6NECtrZ
>>474
ありがとうございました。本を買って入ってたのがApacheだったので、それを使ってました。
さっそくAnHTTPdを入れて勉強してみようと思います。
048147002/04/14 14:15ID:7rjAl4Ry
>>479
丁寧にありがとうございます!
shtmlにはしてあるんですが、httpd.confをも一回チェックしてきます。

みなさん、親切で泣けてきました。(今回2Ch初書きこみ)
048247002/04/14 17:23ID:???
結局いろいろやってみた結果、ソースのflockという関数をコメントアウトしたら
カウンタが動作しました。HTTPdソフトのせいじゃなかったみたいです。
いろいろありがとうございました。
0483nobodyさん02/04/14 18:32ID:lEj2Ud3E
$line =~ s/田中雅夫/田中さん/g;
$line =~ s/椎名林檎/林 檎/g;
$line =~ s/志村けん/バカ殿/g;

上のようなのをハッシュにしてまとめて処理させることできませんか?
%xx = ( "田中雅夫", "田中さん", "椎名林檎", "林 檎" ,"志村けん", "バカ殿");
$nkeys = keys %xx;
$value = values %xx;
$line =~ s/$nkeys/$value/g;
自分ではこんな感じかな?とか思ったんですが…無理でした。
ご教授お願いします。。既出だったらすいません(^^;
0484nobodyさん02/04/14 18:48ID:???
>483
$nkeysと$valueをprintしてみてなにが入ってるか見てみるとダメな理由はわかると思う。
どうするのが正しいのか俺にはわからないけど。
$line =~ s/(.+)/$xx{"$_"}/g;だとkeysの一致がされないしなぁ・・・。
0485nobodyさん02/04/14 19:02ID:???
$hoge = join "|", keys %xx;
$line =~ s/($hoge)/$xx{$1}/g;
こんなんでいいか?
0486nobodyさん02/04/14 19:36ID:???
>475
_gunzipタンひさしぶり〜
048746902/04/14 19:40ID:???
>>475
スクリプトが意味不明です。初心者ですか?
0488nobodyさん02/04/14 19:51ID:???
>>487
ネタはやめれ。
0489nobodyさん02/04/14 20:01ID:???
>488
ネタじゃないと思うよ。
理解できない負け惜しみ厨だとおもう。
そういう漏れも全然理解できてないので逝ってくる...
049046902/04/14 20:04ID:???
まっぷっぷ意味不明age
0491nobodyさん02/04/14 20:06ID:???
open(IN, "datafile.txt");
while($line = <IN>) {
chomp($line);
%xx = ( "田中雅夫", "田中さん", "椎名林檎", "林 檎" ,"志村けん", "バカ殿");
#$nkeys = keys %xx;
#$value = values %xx;
#$line =~ s/$nkeys/$value/g;
$hoge = join "|", keys %xx;
$line =~ s/($hoge)/$xx{$1}/g;
print <<EOL;
$line
EOL
}

これで試してみたんですが無理でした(^^;
0492nobodyさん02/04/14 20:32ID:???
>491
俺のところではそれでいけるけど、datafileの中身はどうなってるの?
あとPerlのバージョンは?
0493TOM ◆98SA9XcM 02/04/14 20:36ID:CWCI/F1H
もーいっこ質問、お願いです。

変数$nanashiに、
あ<>い<>う<>え<>お<>
と入ってるのですが、
この$nanashiを、
@giko = ("あ","い","う","え","お");
のように、配列に出来ますか?
0494nobodyさん02/04/14 20:39ID:???
@giko = split(/<>/, $nanashi);
0495TOM ◆98SA9XcM 02/04/14 20:44ID:CWCI/F1H
ほ〜
ありがとん
0496nobodyさん02/04/14 20:45ID:???
とりあえず>>469は帰って良いよ。
プロトタイプでも勉強してきな。
0497nobodyさん02/04/14 20:46ID:???
datafileは

<table>
<tr>
<td>田中雅夫</td>
<td>田中さん</td>
</tr>
<tr>
<td>椎名林檎</td>
<td>林 檎</td>
</tr>
<tr>
<td>志村けん</td>
<td>バカ殿</td>
</tr>
</table>

環境はWINにactiveperl522e入れてます。
flockとか使うとエラー出たりするし、
そういう違いなんかなぁ…
049846902/04/14 20:50ID:???
496 = gunzip = 初心者
決定!ばーか

0499nobodyさん02/04/14 20:52ID:???
(´-`).。oO(ちょっと遅れた春だねぇ…)
0500nobodyさん02/04/14 20:52ID:???
>497
やっぱり俺のところでは普通に変換される。
Win2kにanhttpd+ActivePerl-5.6.0.616。

flockはWin95やWin98じゃ使えないんじゃなかったっけ?
0501nobodyさん02/04/14 20:59ID:???
522でも行くとは思うが・・・・・
630あたり入れない?
050249702/04/14 21:02ID:???
>500
はい、そうみたいです。
他の違いとかは全く分からない状態で…
勉強不足ですいません(^^;
ActivePerlもけっこう前に入れたものだし、
新しいのinstallしてみよっかな。
とりあえず、ありがとうございました〜
0503nobodyさん02/04/14 21:06ID:???
あー、データファイルとperlスクリプトで文字コードが違うとかやってない?
両方EUCで書くこと。
050449702/04/14 21:08ID:???
あーほんとんにごめん(^^;
きちんと実行しました!!
申し訳ない…鬱だ。。
ほんとにありがとう…4日くらいハマってました(汁
050549702/04/14 21:17ID:???
原因はなぜか分からないんですが、
ハッシュの中に
"太宰啓介", "太 宰"
を入れてて、
これを抜いたら動きました。。
0506nobodyさん02/04/14 22:07ID:???
啓の2バイト目が“[”だから動かない。
$hoge = "\Q". join("\E|\Q", keys %xx) . "\E";
0507nobodyさん02/04/14 22:15ID:???
$hoge = join "|", map{ quotemeta } keys %fuga;
の方が見栄えは良いな。
いや、>>506の方が多分効率良いけど。
050846902/04/14 22:26ID:???
469>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>475
050950602/04/14 22:34ID:???
スマソ>>507の方法じゃないと駄目だ。
"\Q" . "[\E" と "\Q[\E"は等価じゃない。
0510rain02/04/14 22:37ID:sltXes8x
えっと、プログラム板では板違いという事でこっち来ました。
PERLのCGIを実行させようとすると何故かダウンロードを始めてしまいます。
どうなってるのでしょう?
0511nobodyさん02/04/14 22:40ID:???
>510
99% Content-typeの問題。
0512rain02/04/14 22:46ID:sltXes8x
print "Content-type: text/plain\n\n";
に何か問題があるのでしょうか?
051349702/04/14 22:49ID:???
>>507
おー!動いた!ありがと〜

>啓の2バイト目が“[”だから動かない。
ふむふむ…もうついていけないレベルです(^^;

$hoge = "\Q". join("\E|\Q", keys %xx) . "\E";
$hoge = join "|", map{ quotemeta } keys %fuga;
これがどんなことしてるのか、
じっくり勉強してみます。
0514nobodyさん02/04/14 22:57ID:???
>512
1:\nを\r\nにしてみる。
2:それをスクリプトの3行目に置いてみる。
0515rain02/04/14 23:00ID:sltXes8x
駄目みたいです・・・。
やっぱり変わらずダウンロードを開始します・・・。
何が原因なんでしょう?
0516nobodyさん02/04/14 23:02ID:???
>515
環境を明記した上でスクリプトの拡張子を.txtにしてアプして。
0517rain02/04/14 23:06ID:sltXes8x
アプるほど大きくないんで乗せますね。
環境はapacheの1.3です。他に必要な環境情報ありますか?
------
#!D:/program/perl/bin/perl

print "Content-type: text/plain\r\n\n";
print "Hello Perl !";

------
0518nobodyさん02/04/14 23:10ID:???
>>515
httpdがApacheなら、httpd.confに
AddHandler cgi-script .cgi .pl
って書いてあるかどうかかくに〜ん。
0519rain02/04/14 23:15ID:sltXes8x
書いてありますねぇ・・・。
0520nobodyさん02/04/14 23:19ID:???
>517
\r\n\nとはどういう了見だ?
0521rain02/04/14 23:23ID:sltXes8x
あれ?こうしろって事じゃなかったんですか?はっ!もしかしてとんでもない勘違い!?
0522nobodyさん02/04/14 23:25ID:???
ふつー、
\n\n
だね。
0523rain02/04/14 23:26ID:sltXes8x
あ、でもそれでもやったんですよ。
はぁ・・今日は諦めようかな・・・。
0524nobodyさん02/04/14 23:26ID:???
\r\n\r\nだろ、やるなら。
それと、Apacheって適当に入れただけだとExecCGIが効いてなかったような。
0525rain02/04/14 23:30ID:sltXes8x
そうなんですか?まだ勉強不足で・・・。
それと、ExecCGIもちゃんと修正しました。
0526nobodyさん02/04/14 23:31ID:???
>>524
そなの?
それってDOSだとCRCRLFCRCRLFにならない?
もしかしてActivePerlなら、ならないのか・・・
0527nobodyさん02/04/14 23:32ID:???
「ソースがダウンロードされる」のか「実行結果がダウンロードされる」のか。
0528rain02/04/14 23:34ID:sltXes8x
.cgiがダウンロードされてしまいます。
0529nobodyさん02/04/14 23:34ID:???
>>525
ちなみに、ダウンロードされるファイルの中身は、どんなんなの?
Hello Perl!
だけが書いてあるのなら、httpdはOKで、Contenet-type があやしい。

cgiスクリプトがまるまる入っているのなら、httpdの設定があやしい。
0530nobodyさん02/04/14 23:35ID:rKBAHNDF
つまらん質問でスマソ
123456byteをメガ単位にするときって
何で割るの?1000?・・・
0531nobodyさん02/04/14 23:36ID:???
>>530
もちろん、1024^2で割る。
0532nobodyさん02/04/14 23:37ID:???
>>530 1048576
0533nobodyさん02/04/14 23:37ID:???
2**10 * 2**10で割りなされ。
0534nobodyさん02/04/14 23:41ID:???
> perl -e "print 1024^2"
1026
>
0535nobodyさん02/04/14 23:47ID:rKBAHNDF
つまり、1Mbyteは1024^2 = 1048576byteという事なのか!
スマソ。
0536nobodyさん02/04/14 23:53ID:???
>>510
じぶんもずっとそれ。完璧に諦めている。
UA側の問題と理解しているが、理由に納得はしていない。
0537nobodyさん02/04/14 23:54ID:???
>521
>514を見て「片方だけ変えればいい」という発想できるのは驚き。
その発想力は俺の予想を越えてた。
0538nobodyさん02/04/14 23:57ID:???
>517
UnixかWinか。
あと>529の問いにも答えれ。
0539rain02/04/15 00:09ID:8o4u1f33
ほーい。WINで、CGIがダウンロードされます。
0540nobodyさん02/04/15 00:12ID:???
>>539
その答えがDQNだっつーの。
054153602/04/15 00:17ID:???
自分直ってた。原因がよく分からんままだ。
0542nobodyさん02/04/15 00:18ID:???
【もう】【だめぽ】
0543nobodyさん02/04/15 00:19ID:???
>539
悪いがここはPerlの初心者スレなんだ。
人生の初心者は幼稚園にでも行ってくれ。
0544nobodyさん02/04/15 00:22ID:???
>>539
「ほーい。WINで、CGIスクリプトがそのままダウンロードされます。」
ね。
つーことは、httpd が、そのスクリプトをCGIだと思ってないのよ。
httpdを再起動してだめなら、apache板へ行ったほうがいいかも。

Apacheの設定を教えてください
http://pc.2ch.net/test/read.cgi/php/1003772635/

もちろん、あちらのスレのログをまず見てガイシュツじゃないか確認しよう。
054546902/04/15 00:32ID:???
答えろ。厨房ばっかりだなここは。

0546nobodyさん02/04/15 00:42ID:???
もちろん来年高校受験ですが、何か?
0547nobodyさん02/04/15 00:52ID:???
厨房ばっかりなのがわかったのにまだ聞くの?
それって自分が厨房以下って言ってるのと同じだと思うんだがなぁ。

次回は是非もう少し頭のよさそうな煽りをお願いいたします。
054846902/04/15 01:06ID:???
こたえろおろろろろろろろろろろろろろろろろろろろろろろろろr
0549nobodyさん02/04/15 01:15ID:???
どうか教えてください。

2次元配列で、列の最大インデックス値を求める効率的な方法がわかりません。
自分でなんとか書いてみて、もっとよい方法がありそうな気がしていますが
どうしても思いつきません。よろしくお願いします。

;# $data[行][列] の例
for ($[ .. $#data){
$#{$data[$_]}> $MAX_COL and $MAX_COL= $#{$data[$_]};
}
0550nobodyさん02/04/15 01:20ID:???
>>549
それで十分使えるやろ。Perlってことを忘れるなよ。
数値計算等の効率を重視するならCとかにしろって。
0551nobodyさん02/04/15 01:38ID:???
>>548
>>476の何が不満なんだ?
#our($a, $b);
てして、最後のほうに
print join(",",@sum),"\n";
とか書けば、動くと思うけど。
055255102/04/15 01:39ID:???
イタイ。>>475だった。
055354902/04/15 01:53ID:???
>550
了解しまっ!
055446902/04/15 02:03ID:???
475みたいなコード書く奴は死んでください。理解できません。
0555nobodyさん02/04/15 02:07ID:???
>554
理解したいなら他人に聞いてもしょうがない。
自分で勉強するしか。
>2-4のサイトの中には親切に色々教えてくれる所もあるだろう。

理解するよりも利用したいなら>475のソースをそのまま使えばいい。
055654902/04/15 02:13ID:???
>554
確かに、プロトタイプや複数処理に対応しているところは一見、知ってそうだが
効率の悪い書き方が目立つね。でも、これを理解できないの? どこがわからないの?

0557nobodyさん02/04/15 02:16ID:???
>>556
>>475の効率の悪いとこって、どのへん?
055854902/04/15 02:30ID:???
>557
ループカウンタ $i なんか使う必要ないし、return も遅くなるし、
ループ内で local 宣言を逐一行なってるようなとこかな?
■ このスレッドは過去ログ倉庫に格納されています