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

【Perl】初心者コーナー Part13

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

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

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

CGIの質問は【CGIだけど、なんか質問ある? part 6】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0587nobodyさん02/07/04 10:27ID:???
>>586

line 4 ...
0588nobodyさん02/07/04 10:29ID:???
>>583
HTTP_REFERER
0589578=58302/07/04 13:21ID:???
>>582
i-modeではJavaScriptが使えないんです

>>584
漏れのスキルでは妥当な線ですね

>>588
なんだか使えそうな・・・それ調べてみます

みなさん有難うございます
0590nobodyさん02/07/04 13:43ID:???
いやだからi-modeとかJ-SkyWebは基本的にHTTP_REFERER吐かないってば。
吐く端末もあるけど少数だし。Ezwebはやろうと思えば出来たような気が
しないでもない。携帯端末で普通にREFERER吐くのはドットiだけだった
と思う。
0591578=583 =58902/07/04 14:30ID:???
>>590
なるほど、HTTP_REFERERも無理ですか、
「バックボタンで戻ってください」と書く方向にします。
0592nobodyさん02/07/04 14:33ID:???
>>591
やりかたあるじゃねーか。気づけよ!
0593nobodyさん02/07/04 14:35ID:???
>>585-586
おれだったら3番目を選びます。
しかし>>587が気になる。なんだろう…。そういや"..."演算子ってあるのよね。
0594nobodyさん02/07/04 19:27ID:???
>>593
..演算子はありますが、...はなんだろう?
>>597
>line 4 ...
意味が読めないよ。
0595nobodyさん02/07/04 19:38ID:???
>>594
そこまでわかっててなぜ気づかない?
059658502/07/04 20:34ID:???
>>587
すいませんがもっと詳しく書いていただけると
ありがたいです。

>>592
この中では3番目が一番効率よさそうですが
人のソースのもろコピペになってしまうので
あんまり使いたく有りません

別の方法があったらぜひ教えてください
0597nobodyさん02/07/04 21:18ID:???
>>596
こんなのはどうすか。586の最後のやつと同じだけど、ややすっきり。

my @arrays = (\@top, \@middle, \@bottom);
my $i = 0;
while (<FH>) {
  $i++ if /<!---->/;
  push @{$arrays[$i]}, $_;
}
0598japh ◆J.5V8ta6 02/07/04 21:42ID:???
>>596
笑った。
別の方法を教えてもらっても、ソースのもろコピペには変わりないんじゃないのか?

0599nobodyさん02/07/04 21:42ID:gX+umWUs
$name が りんごなら$imgにappleを入れたいのですが、これであってますか?

if ($name eq "りんご") {$img = apple ;}
0600nobodyさん02/07/04 21:46ID:zS7n4jKK
>>599
if ($name eq "りんご") {$img = "apple" ;}
0601nobodyさん02/07/04 21:58ID:gX+umWUs
>>600
ありがとうございました。
060258502/07/04 22:05ID:???
>>598
同じことをするプログラムで
処理まで一緒だとパクリになるので
別の方法は無いかと思って

同じカテゴリーのプログラムが
少ないので同じものを使うと
すぐ分かってしまいます
この処理のやり方が肝になっているので
060358502/07/04 22:12ID:???
>>597
だいぶスマートに出来ていますね
ありがとうございます
0604nobodyさん02/07/04 22:16ID:???
>>602
書き方変えても処理同じにするんだからきみの嫌うパクリになるんじゃないか?

パクリが嫌ならソースを教えてもらう前に自分で勉強しろ。
0605nobodyさん02/07/04 22:37ID:ru7/Ktro
データをhtml化してログに残すやり方を教えて下さい。
すみません、うまく説明できないのですが宜しくお願いします。
0606nobodyさん02/07/04 22:38ID:???
データを読み込んで、HTMLを付加して、ファイルに出力。
060758502/07/04 22:49ID:???
>>604
603は考えて下さった御礼という意味です
ちなみに私は
出てくるものは同じでも、実装方法がちがったら良いのじゃないか
と思っています。
全く同じものを作っても面白みが無いので、+αはしますが
(商業関係は別です特許が絡んでくるし)




0608nobodyさん02/07/04 22:52ID:???
>パクリが嫌ならソースを教えてもらう前に自分で勉強しろ。

>>604 の勝ち
0609nobodyさん02/07/04 22:53ID:gX+umWUs
秀丸などの改行を取りたいのですが、どうやって取ったらいいのでしょうか?
0610nobodyさん02/07/04 22:55ID:???
秀丸の改行ってなんだ?
0611nobodyさん02/07/04 22:56ID:gX+umWUs
秀丸だったら文の最後の↓です。
0612nobodyさん02/07/04 22:57ID:GRf17RXg
<A HREF="$url">$url</A> と
<A HREF="tel:$tel">$tel</A> があるんですが、

Phone to機能のない方だけに、cgiをくっつけたいんですが、

$myd = "http://www.○○○.co.jp/";
if ($myd =~ /<A HREF=\"/) {
$myd =~ s/(\<A HREF=\")(tel:)/moji($1.$2)/eg;
}
moji($1.$2) {
if (!$2) {
$myd =~ s/(\<A HREF=\")/$1test0701_2.cgi?$query/ g;
}
}
print $myd;


うまく切り分けられません 泣)
0613nobodyさん02/07/04 23:01ID:???
>秀丸だったら文の最後の↓

Ans ↓の前にカーソルを移動させ[Delete]キーで改行が外れます
0614nobodyさん02/07/04 23:02ID:gX+umWUs
>>613
そうじゃなくて、プログラムの中で実行したいのですが・・・。
0615nobodyさん02/07/04 23:07ID:???
>>614 質問の仕方をまず覚えれ

秀丸などの → テキストファイルの


0616nobodyさん02/07/04 23:08ID:gX+umWUs
>>615
すみません
0617nobodyさん02/07/04 23:13ID:???
>> 616 s/\n//
0618nobodyさん02/07/04 23:14ID:???
>>617
改行が全部なくならないか?
0619nobodyさん02/07/04 23:18ID:gX+umWUs
$nameが千葉か神奈川か東京ってこれでいいんですか?

if ($name eq "千葉" or "神奈川" or "東京")
0620578=583 =58902/07/04 23:19ID:???
>>592
すみません、気付けません(鬱
教えて下さい
0621nobodyさん02/07/04 23:19ID:???
if (($name eq "千葉") or ($name eq "神奈川") or ($name eq "東京"))
0622nobodyさん02/07/04 23:23ID:gX+umWUs
>>621
何度もすみません。ありがとうございました。
0623nobodyさん02/07/04 23:27ID:???
マウスが乗ると音が鳴るタグを教えてもらえませんか
0624nobodyさん02/07/04 23:29ID:???
>>623
スレ違いだとは思わないか?
0625nobodyさん02/07/04 23:30ID:???
>>623
http://pc.2ch.net/test/read.cgi/php/1019487717/87-
0626nobodyさん02/07/04 23:46ID:???
>>623
+ JavaScript の質問用スレッド vol.10 +
http://pc.2ch.net/test/read.cgi/hp/1022077876/l50
「何」にマウスが乗ると音がなるのかも言って聞いてみて・・・
「タグ」と言っている時点で怒られる怖れもあるから
1>>をよく読んでから質問してね。
0627nobodyさん02/07/05 01:00ID:???
>>619
もう解決してるみたいだけど、orと||の優先順位に違いを考慮して
if ($name eq "千葉" || "神奈川" || "東京")
こうだと大丈夫だと思うよ。
0628nobodyさん02/07/05 01:59ID:???
>>627
それはだめだろ
0629nobodyさん02/07/05 03:08ID:???
>>628
試した上で言ってるの?
0630nobodyさん02/07/05 03:44ID:???
>>627=629?
Perlを理解していない典型だね。
0631 ◆qXAQxUxI 02/07/05 03:56ID:???
>>627

ヴァカ
063262902/07/05 04:12ID:???
すまん、>>627と書いたつもりが>>628になっていた。
0633長文02/07/05 06:14ID:xwCvs6jw
1:自分はこう言う事がしたい。
フォルダの中に、
「番号」「単語」「単語の解説」の入ったデータファイルがいくつかあります。
そのデータファイルをまとめる親データを作りたいです。
親データには、
単語に対応する番号を単語を辞書的にソートしたものを入れたいです。

具体的には
ファイル1→01 モナー 「オマエモナー」
ファイル2→02 ギコ 「逝ってよし」
ファイル3→03 ジサクジエン 「イイ!」
親データ→02 03 01

みたいな感じです。分かりづらいでしょうか、、

長文すぎたようなので分割します;
0634長文202/07/05 06:15ID:xwCvs6jw
2:それでこんな風にやってみたが・・・
$cufld = './';
opendir(DIR, $cufld) or die;
@file1 = sort readdir(DIR);
closedir(DIR);
で、フォルダの中のファイルをリストアップして

foreach (@files) {
で、ファイルをひとつひとつ開いて
open(IN,"$_");
$data = <IN>;
close (IN);
($ind,$word) = split(/\t/, $data);
push (@word , $word);
$NO{$word} = $ind;
}
foreach (sort { $a cmp $b } @word){
print "$NO{$_}\t";
}
という風に出力したかったんですが、

3:それだとこんなエラーが出て上手く行かなかった。
なんだかopendir〜の所で止まってしまいます。
ディレクトリのパーミッションは777にしてるんですが
他にこうやった方が、とか根本的にここが間違ってる、とか
いうところがあったら指摘お願いします。
0635nobodyさん02/07/05 06:21ID:???
>>634
@file1を表示してみれば分かるんだけど、opendir() は実際のファイルのほかに
「. (カレントディレクトリ)」「.. (ひとつ上のディレクトリ)」も含まれる。
なのでgrepでもかけて実際のファイルだけ取り出してやらないといけない。

っていうか @file1 と @files って・・書き間違い? (@file1 = @files ?)
0636nobodyさん02/07/05 06:25ID:???
あと $cufld = './'; だと、このCGI自体も含まれると思うんだけど。
0637長文02/07/05 07:22ID:xwCvs6jw
>>635
@file1は写し間違いでした。すみません
grep、調べてみました。頭に入れときます。

>>636
そうですね、自身も含まれちゃうんで
ファイル名ではじこうと思います。

でも、@filesを表示する以前に
opendir()でdieしてるみたいなんですが……
ローカルでも、アップした状態でもやってみましたが
結果は同じでした。
環境によっては使えないとか、そういうことってあるんでしょうか。
サーバはxreaを使ってます。ローカルではMacのWEB共有です。
0638長文02/07/05 07:24ID:xwCvs6jw
なんだか連続で質問になってしまってすみません
こんな時間にありがとうございますです。
0639nobodyさん02/07/05 07:26ID:q2MOJvqj
質問です
$line = join('',@lines);
$line = s/***/****/g;

for (0 .. $#lines) {
  my($tmp) = $lines[$_];
  $tmp = s/***/****/g;
  $line .= $tmp;
}
どちらが最適か教えて下さい。
(元のデータは残しておく)
0640japh ◆J.5V8ta6 02/07/05 08:30ID:???
>>639
Benchmark使ってみろ。
そうすればどっちを使うべきかは一目瞭然。

#!/usr/bin/perl -w

use Benchmark;
use IO::File;
my @lines = IO::File->new(__FILE__)->getlines;
timethese 100000 => {
1 => sub{
my $line;
$line = join('',@lines);
$line =~ s/$/:/g;
},
2 => sub{
my $line;
for (0 .. $#lines) {
my($tmp) = $lines[$_];
$tmp = s/$/:/g;
$line .= $tmp;
}
},
};
0641 02/07/05 12:27ID:L0bSs9Ak
mod_perlで掲示板を動かしていますが、mod_perl用のディレクトリにある画像を利用出来なくて悩んでいます。
mod_perl用のディレクトリ以下にあるファイルは全てCGIとして使われちゃうと聞きました。
他のディレクトリに画像を移そうかとも考えましたが、スクリプトの修正個所が多くて大変なんです。
Apacheのhttpd.confの設定とかで利用できる用に出来ませんか?
0642nobodyさん02/07/05 14:44ID:???
>>641
できるよ。perldoc cgi_to_mod_perl読め。

あとは下記スレで。
[mod_perlを使おう!]
http://pc.2ch.net/test/read.cgi/php/1005122528/l50
0643nobodyさん02/07/05 19:28ID:???
質問ですが、指定したディレクトリ内にあるファイル名を全部配列に格納したいです。
できるならやり方を教えて下さい。
0644nobodyさん02/07/05 19:35ID:???
>643
opendirとreaddirを使う。
使い方は自分で調べてみよう。
0645nobodyさん02/07/05 19:36ID:???
opendir(DIR, dir);
@readlist = readdir(DIR);
closedir(DIR);

ただ、 . と .. も入るから注意。って、他にもあったな、やりかた。
0646nobodyさん02/07/05 20:25ID:???
opendir(DIR,$dir);
@readlist = grep ! /^\.\.?$/, readdir(DIR);
closedir(DIR);
0647nobodyさん02/07/05 21:05ID:???
sub filescan
{
my @dir;

opendir( DIR, $_[0] ) || return 0;
@dir = grep( !/^\.\.?$/, readdir( DIR ) );
closedir( DIR );

foreach ( @dir ) {
if ( -d "$_[0]$_\/" ) {
push( @all, "$_[0]$_\/" );
&filescan( "$_[0]$_\/" );
}
else {
push( @all, "$_[0]$_" );
#print "$_[0]$_\n";
}
}
return 1;
}
0648nobodyさん02/07/05 23:25ID:St7kmpIx
sub function
{
}
とかくバカは死ね
0649nobodyさん02/07/05 23:26ID:???
opendir(DIR, $dir);
@readlist = readdir(DIR);
closedir(DIR);
splice(@readlist, 0, 2);
0650nobodyさん02/07/05 23:49ID:???
効率を気にしなくていいときは
@readlist = <*>;
を愛用してる。こっちは逆にドットファイルが出てこないけど。
0651nobodyさん02/07/06 01:52ID:???
>>648ジサクジエン(・∀・)デシタ!!
http://pc.2ch.net/test/read.cgi/php/1024741312/71-
0652nobodyさん02/07/06 05:36ID:???
おまえ邪魔。
0653nobodyさん02/07/06 10:20ID:???

アナル → <*>
065464302/07/06 13:09ID:???
ありがとうございます。
ファイルの取得ができました。

さらに、この配列を、最終更新日時順にソートする、、なんてことはできますか?
よろしくお願いします。。
0655nobodyさん02/07/06 13:16ID:???
>>654


  少  し  は  勉  強  し  よ  う  っ  て  気  は  な  い  の  か


0656Saru02/07/06 13:21ID:CFBQ9es6
Perlでテキスト処理に関して、2桁の数字だけを削除したい場合は
どのようにかいたらいいんでしょうか?
今は
s/[0-9]{2}//g;と書いてます。
1桁の数字は残しておきたいんですが…。
どなたかヒントでもよいので教えてください。お願いします。
0657nobodyさん02/07/06 14:01ID:???
s/^[0-9]([0-9])$/$1/g;
0658Saru02/07/06 14:16ID:CFBQ9es6
>657さん
困っていたのでとても助かりました。
どうもありがとうございます!
0659nobodyさん02/07/06 14:32ID:???
s/(\D)\d{2}(\D)/$1$2/g;
0660nobodyさん02/07/06 14:54ID:???

今クリック数をカウントするCGIを作ってるのですが、
クライアントから送られてくるデータが

id=1&url=http://www.***.com/

だったばあい、

$idの中身を1に
$urlの中身をhttp://www.***.com/

にしたいのですが、今は

$data = $ENV{'QUERY_STRING'};
@data = split(/\&/,$data);
$id = $data[0];
$url = $data[1];
%id = split(/\=/,$id);
%url = split(/\=/,$url);

となんとも効率が悪いやり方なのですが自分の知識ではこのようにしか
やり方が分からないのですがもっといいやり方は無いでしょうか?

それともし$dataに「&と=」が無かった場合はexitで終了させたいのですが
どのように調べればいいのでしょうか?

よろしくお願いします。
0661nobodyさん02/07/06 15:02ID:???


$buffer = $ENV{'QUERY_STRING'};
if (($buffer !~/&/ )&&($buffer !~/=/){exit;}
local(@pairs) = split(/&/,$buffer);
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
0662nobodyさん02/07/06 15:03ID:???
 ) がひとつ足りなかった。
0663nobodyさん02/07/06 15:12ID:???
&と=が正規表現で調べることが出来ることは分かったのですが、

$FORM{$name} = $value;

これは%FORMというハッシュの中にkeyが$nameでvalueが$valueというのを
代入してる処理なんでしょうか?

0664nobodyさん02/07/06 15:17ID:???
local(@pairs) = split(/&/,$buffer);
この処理で、
id=1&url=http://www.***.com/ を
id=1 url=http://www.***.com/ に分割し(@pairsに)
foreach $pair(@pairs){
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
で それらをさらに分ける。
$FORM{$name} = $value;
は
$FORM{id} = 1;
$FORM{url} = http://www.***.com/;
になるから%FORMに入れられる。あとはこれらを自由に処理するだけ。
0665nobodyさん02/07/06 15:20ID:???
>>664

なるほど。理解できました。ありがとうございます。

ちなみにローカル変数はサブルーチン内で使うものでわなかったでしょうか?
サブルーチン化したほうがいいのでしょうか?
0666Saru02/07/06 15:21ID:CFBQ9es6
>659さん
こちらは2桁ともに削除できるんですね。
勉強になります…!ありがとうございます。
0667nobodyさん02/07/06 15:22ID:???
ちなみに

split(/=/,$pair);

これは

=の前に\を入れてエスケープするんですよね?
0668nobodyさん02/07/06 15:31ID:???
エスケープしないで使ってる人が多いな。
たいていはサブルーチン化して、GETもPOSTも対応してる。

local($pair,$buffer);
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
local(@pairs) = split(/&/,$buffer);
foreach $pair (@pairs) {
local($name,$value) = split(/=/,$pair);
$FORM{$name} = $value;
}
0669nobodyさん02/07/06 16:42ID:up0NZwlm
open(FILE, "./log.log") で作成したログのパーミッションが 644 で生成されるんですが、
これを 600 で生成されるようにするにはどうすればよいでしょうか?
CGIはユーザー権限で動いています。
おながいします。
0670nobodyさん02/07/06 16:45ID:???
まちがった・・ open(FILE, ">./log.log") でした
0671nobodyさん02/07/06 16:48ID:???
>>670
umask
0672nobodyさん02/07/06 16:51ID:up0NZwlm
>>671
umask関数ですね。検索して調べてみます。
067366902/07/06 17:06ID:???
umask 066; でできました。 >>671 さんありがとうございました。
0674nobodyさん02/07/06 17:42ID:stglrVc7
open,umaskとするよりsysopen使うのがおすすめだぞ。
openよりはセキュアかもだしな。
067566902/07/06 18:30ID:???
>>674
もうできたからいいよ。っつーか書くのがおせーよ!
氏ね!
0676nobodyさん02/07/06 18:33ID:???
>>675

偽者ケテーイ
0677nobodyさん 02/07/06 21:50ID:pjFxin79
perl初心者です。Activeperlのプログラムを動かしてInternetExplorerを起動したいんですが
どのようにすればよいでしょうか?
0678nobodyさん02/07/06 21:53ID:???
exec(C:\Program Files\Internet Explorer\IEXPLORE.EXE);

`C:\Program Files\Internet Explorer\IEXPLORE.EXE`
0679nobodyさん02/07/06 23:30ID:Jm7Ff5yb
レンタルサーバーでsendmailが使えない場合、ほかにメールを送る方法ってありますか?
0680nobodyさん02/07/06 23:31ID:???
Net::SMTP
0681nobodyさん02/07/07 01:52ID:iHDNP1fk
JavaScriptをperlに書き換えたいのですが
★の部分の書き方がわかりません。(ぺこり)
他も間違いありましたら教えて下さい。
-------------------------------------
functuon myfun{
P=document.F.E1.value+document.F.E2.value+document.F.E3.value;
T=0;
for(i=0;i<P.length;i++){T=T+eval(P.charAt(i))}
if((T==11)||(T==22)){document.F.E4.value=hoge[T]}
else{while(T>=10){T=T-9;}
document.write(hoge[T])
}
-----------------------------------------
foreach $data ( @buf ){
( $name , $value ) = split( /=/ , $data );
$FORM{$name} = $value;
@list = values %FORM
};

$P = $list[0]+$list[1]+$list[2];
$T = 0;
for($i=0; $i<★; $i++){$T=$T+★($i)};
if(($T==11) || ($T==22)){$list[4]=hoge[$T];}
else{while($T>=10){$T=$T-9;}}
print "hoge[$T]";
0682nobodyさん02/07/07 02:06ID:???
>>681
せめて変数が何あらわしてるかぐらい書け。
068368102/07/07 02:18ID:iHDNP1fk
>>683
整数
document.F.E1.value
document.F.E2.value
document.F.E3.value

計算をするための作業用の変数
P
T

Pのlengthを取得するためのカウンター用の変数
i

他のはformに入力された値を取得するための変数です
0684nobodyさん02/07/07 02:32ID:???
とりあえずこんな感じ

for($i=0; $i<★; $i++){$T=$T+★($i)};
↓
for($i=0;$i<length($P);$i++){$T=$T+substr($P,$i,1)}
068568102/07/07 08:45ID:???
>>684さん
おはようございますっ♪
あ〜感謝!うれしいです。

0686nobodyさん02/07/07 12:56ID:xpVArwn6
「http://サーバー名/CGIスクリプト名?データ」で実行し、
データの受け渡しをするプログラムを作っているんですが、
他のURLへジャンプさせるときに、
<A HREF="http://***/CGIスクリプト名?ジャンプ先URL">ジャンプ</A>
としたいんですが、ジャンプ先URLをフルパスで出せるようにするには
どうしたらいいですか?以下がつくった内容です。
my($encoding) = @_;
my($method) = $ENV{'REQUEST_METHOD'};
if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; }
elsif ($method eq 'POST') { read(STDIN, $query,
$ENV{'CONTENT_LENGTH'}); }
local(@query) = split(/&/, $query);
foreach (@query) {
tr/+/ /;
($key, $val) = split(/=/);
$key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge;
$val =~ s/\r\n/\n/g;
$in{$key} = $val;
}
my $req = new HTTP::Request POST => $val;
$req->content_type('application/x-www-form-urlencoded');
$req->content('match=www&errors=0');
my $res = $ua->request($req);
if ($res->is_success) {
$myd = $res->content;
$myd =~ s/(\<A HREF=\")/$1test.cgi?/g;
print $myd;
} else {
print "No!";
}

今の状態ですと、
$myd =~ s/(\<A HREF=\")/$1test.cgi?/g;
をやると、
<A HREF=test.cgi?test/index.html> というような感じになって
<A HREF=test.cgi?http://www.***.co.jp/test/index.html>;
というような形になりません。
■ このスレッドは過去ログ倉庫に格納されています