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

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/02/09 00:24ID:s0tpWWxg
初めに→「perl」その物のスレです。

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

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


CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/

あとは>>2-10。
0577nobodyさん03/03/05 23:57ID:???
>>576
DBIとか。
0578nobodyさん03/03/06 00:04ID:/oqmBN82
なるほど。DBI を勉強しろと言うことなのか・・・なるほど。
0579nobodyさん03/03/06 00:09ID:???
自分で作ったモジュールの中からさらにモジュールオブジェクトを作成すると
newでの変数初期化がされない現象が起こるのですが、これはperlの仕様ですか?

↓-------------------- a.pl
package a;
sub new{
my $this=shift;
my $a=0;
my $obj{'obj'=>$a};
bless $obj,$this;
return $obj;}1;
↓--------------------- b.pl
package b;
require('./a.pl');
sub new{
my $this=shift;
my $b=0;
my $obj{'obj'=>$b};
bless $obj,$this;
return $obj;}
sub test{
my $a = new a;
print "a=$$a{'obj'}";}1;
↓--------------------- main.cgi
require('./b.pl');
sub test
{my $b = new b;
$b->test();}
-------------------------------------
結果:a=
(何も表示されない)
0580nobodyさん03/03/06 00:13ID:???
>>576
まずは道具をインストールする。
で、SQLを適当に理解する。
あとは、
connect prepare execute fetch finish disconnect
0581nobodyさん03/03/06 00:13ID:???
仕様=バグとか言うふざけた前提でほざいてると解釈して良いのか?
0582nobodyさん03/03/06 00:14ID:???
>>579
newは「変数初期化」なんて機能じゃないけれど。
0583nobodyさん03/03/06 00:18ID:???
>>579
前置(?)のnewは、コンパイルするときに、それが関数か、
メソッドかを決定しないといけない。
で、newっていうサブルーチンがある(ように見える)から、関数になった。と。

a->new()でどうだ。
058457903/03/06 00:22ID:???
>newは「変数初期化」なんて機能じゃないけれど。
あい、それは承知してます。
newでオブジェクトのメンバを初期化したいという意味でした。
>>579の場合だと、a.plで
$a=0;
・・・
$obj={'obj'=>$a};
としているのに、bから作成したときは$a->{'obj'}に0が入っていないのです。
(0以外でも同様。main.cgiから直接作成した場合は初期化される)
これがバグなのか、仕様なのかどこにも説明してないので設計に困ってます。
058557903/03/06 00:24ID:???
>>583
ありが�dございます。試してみます。
0586nobodyさん03/03/06 00:26ID:???
>>579
http://www.geocities.co.jp/SiliconValley/5634/t82E2_0001.html#1941
http://www.geocities.co.jp/SiliconValley/5634/t82A2_0003.html#2203
0587nobodyさん03/03/06 00:28ID:???
perlobjにWARNINGって大きく書いてあるんだけどなぁ〜
0588nobodyさん03/03/06 00:30ID:???
>>580
どうもです!いろいろやってみるしかないですね・・・
0589nobodyさん03/03/06 01:02ID:???























0590nobodyさん03/03/06 11:24ID:rJoYB8KP
ActivePerlの5.6と5.8って共存できますか?
0591nobodyさん03/03/06 11:26ID:???
>>590
できる。
0592nobodyさん03/03/06 12:35ID:nlUIeg7X
あの…

日本語を交えて変数を作りたいのですが、
「全部」ハッシュにしたらアホでしょうか?

$file{'ログファイル'}
$file{'登録ファイル'}

やっぱ重くなりますか?
アホ丸出しのような気がしますが、この方が作りやすいんです。
0593nobodyさん03/03/06 12:55ID:???
>>592
そういう質問をするレベルならどうせ動かないから好きに作っていいよ。
ただしサーバには上げないでローカルでやってくれな。
0594nobodyさん03/03/06 13:21ID:???
>>592
日本語を使いたいのはわからんでもないですが、
はっきりいってアホです。
0595nobodyさん03/03/06 13:28ID:???
VB使え。
0596nobodyさん03/03/06 14:17ID:???
>>595
VakaBasicでつか?
0597nobodyさん03/03/06 15:09ID:???
>596
そでつ
0598nobodyさん03/03/06 16:25ID:???
$変数 = 1;

Unicodeでなんとかならんか?
0599nobodyさん03/03/06 16:42ID:???
>>592
別にいいんじゃない?
ハッシュの構造上、考えてるほど重くはならないよ。

ただ、他人がそのソースを見たら( ´,_ゝ`)プッ とは思うかも。
0600nobodyさん03/03/06 18:20ID:mX/0qgeV
>>592
そんなあなたにPerlのオブジェクト指向文法!

$this->{field} = 'test';
$this->{公安二課課長補佐} = undef;

主な利点:日本語がちょっとだけ目立たない。
0601nobodyさん03/03/06 18:25ID:???
BSD magazine No.12 P127〜P128 より
> use encoding "euc-jp"; # スクリプトと同じ文字コードを指定
> use utf8;
> my $人 = 1;
> $人++; # 私たちは繁殖している!
060260103/03/06 18:26ID:???
要 Perl 5.8.0 な。
0603nobodyさん03/03/06 19:30ID:???
>>600
それができるのは、キーが\wのとき。日本語の場合は何かでくくらないとだめ
0604nobodyさん03/03/06 20:58ID:+0RpBVtX
すいません、ActivePerl-5.8.0.805-MSWin32-x86にwin32-apiをppmを起動してインストールしようとすると
ppm> install win32-api
Error: no suitable installation target found for package win32-api.
と表示されインストールできませんでした。
ppm>sarch win32-api
ppm> search win32-api
Searching in Active Repositories
1. Win32-API-OutputDebugString [0.03] OutputDebugString Win32 API support
ppm> install 1
Package 1:
Error: no suitable installation target found for package
Win32-API-OutputDebugString.
サーチをかけてインストールしてもパッケージがないと言われます。
また、
no suitable installation target found for package
の一文で検索をかけても英語圏HPしかでてこず、多分どこかにパッケージを
ぶち込んだらOKだと言う解釈なのですがどうにもヘタレ読解力ではキビシイです。
アドバイスお願いできないでしょうか?
0605nobodyさん03/03/06 21:09ID:???
>>604
ありゃ、インストールされた。
日を改めてインストールしてみたら?
0606nobodyさん03/03/06 21:13ID:+0RpBVtX
粘って粘って3日目です(;´д⊂)
0607nobodyさん03/03/06 21:46ID:+0RpBVtX
しまった・・。
環境はXPproでc¥perlにperlをインストールしています。
0608nobodyさん03/03/06 22:41ID:???
  ∋8ノノハ.∩
   川o・-・)ノ <先生!こんなのがありました!
__/ /    /   
\(_ノ ̄ ̄ ̄\
||ヽ|| ̄ ̄ ̄ ̄||
 ...|| ̄ ̄ ̄ ̄||
http://saitama.gasuki.com/shinagawa/
060959203/03/07 12:00ID:???
>>593-600

分かりました。ありがとうございます。
別に
アホ丸出しだろうが
( ´,_ゝ`)プッと思われても構わないので
今後は全部ハッシュで作ろうと思います。
0610nobodyさん03/03/07 16:16ID:o/kX6MY9
特定のホストからのアクセスのみ通すアクセス制限をしたくて探したのですが、
逆の「特定のホストからのアクセスをはじく」アクセス制限のCGIしか見つけられず
そこで、これを改造したら使えないかなあと考えました。
が、どこをどういじって良いのか見当がつきません。どなたかお知恵を貸してください・・。
@deny = ("*.co.jp","*.hoge.net");

sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
# gethostbyaddr関数を使用する場合は1
$gethostbyaddr = 1;
if ($gethostbyaddr) {
if ($host eq "" || $host eq "$addr") {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}
}
if ($host eq "") { $host = $addr; }
}
sub axs {
# ホスト名を取得
&get_host;
if ($deny[0]) {
local($flag)=0;
foreach (@deny) {
if ($_ eq '') { last; }
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { $flag=1; last; }
}
if ($flag) { &error("許可されていないアクセスです") }
}
}
0611nobodyさん03/03/07 16:20ID:???
>>610
.htaccess じゃダメなの?
061261003/03/07 16:20ID:o/kX6MY9
いっそシンプルにこうしたら・・・??
sub axs {
&get_host;
if ($_ ne "@deny"){ &error("許可されていないアクセスです")}
}
061361003/03/07 16:21ID:o/kX6MY9
.htaccessもSSIも使えないです(^^;
0614nobodyさん03/03/07 16:24ID:???
以下のような過去10回のゲームの結果があります。
名前<->点数<->偏差値<-> の様になってます。
これを名前でuniqしたいのですが、賢い方法はあるでしょうか?
一応自分で作ったのですが、マヌケな感じで最後の人が表示されないようです。
識者の方、よろしくお願いします。

--(生データ)---
a<->17<->100<->
a<->20<->68.97<->
a<->20<->68.97<->
a<->27<->87.1<->
b<->27<->87.1<->
c<->13<->41.94<->
c<->14<->87.5<->
c<->22<->75.86<->
c<->22<->75.86<->
c<->8<->47.06<->
d<->14<->82.35<->
d<->14<->87.5<->
d<->25<->86.21<->
d<->25<->86.21<->
d<->31<->100<->
e<->16<->100<->
e<->17<->100<->
e<->27<->93.1<->
--(生データ)---
0615nobodyさん03/03/07 16:26ID:???
>>614 です。
自分で作ったマヌケなプログラムです。

@sortedに生データが入っているとして、

foreach (@sorted){
($s_name,$s_point,$s_rate) = (split(/<->/))[0,1,2];

if($s_name eq $old_name){
$total_p = $s_point + $old_point;
$total_rate = $s_rate + $old_rate;

$old_name = $s_name;
$old_point = $total_p;
$old_rate = $total_rate;
$howmany ++;

}elsif ($s_name ne $old_name){
$average=sprintf('%4.2f', $old_point / $howmany); $average+=0;
$rate_avg=sprintf('%4.2f', $old_rate / $howmany); $rate_avg+=0;
push(@uniq, "$old_name<->$old_point<->$howmany<->$average<->$rate_avg\n");

$old_name = $s_name;
$old_point = $s_point;
$old_rate = $s_rate;
$howmany = 1;
}else{ print "Error!! does not match!!\n";}
}
shift @uniq;
@uniq = reverse sort { (split(/<->/,$a))[3] <=> (split(/<->/,$b))[3] } @uniq;
061661003/03/07 16:33ID:o/kX6MY9
>>612
待った・・・根本的なところが、、、

ごめん、超厨房な質問。
$_ の意味はなんでしょう。$名前 (変数)とは違いますよね。
#手元の入門書には$hogehogeと@hogehogeの説明はあるんだけど$_がない
0617nobodyさん03/03/07 16:36ID:???
>>616
デフォルトで入る変数だよ。
@deny で foreach してるなら、その中の各行が$_に入ってる
061861003/03/07 16:37ID:o/kX6MY9
>>617
そういうことなんですね・・。
ということは>>612はダメじゃん(死)
061961003/03/07 16:39ID:???
あげてしまった・・・。
062061403/03/07 16:43ID:???
これでどう?試してないけど。

それよりおらの質問にも答えてけれ

foreach (@deny) {
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }
}
if ($_ eq '') { $flag=1; last; }
if ($flag) { &error("許可されていないアクセスです") }
}
}
062161403/03/07 16:47ID:???
上のダメだわ。これは?

foreach (@deny) {

$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }
}else{ &error("許可されていないアクセスです") }


}
062261003/03/07 16:50ID:???
>>620
おあ、ありがとう。
今思いついて書き込もうとしたんだけど、おもっきし間違ってたよーです(冷汗)

>それよりおらの質問にも答えてけれ
ごめん・・・わっちには手に余るんだ・・初心者すぎて(苦)
#掲示板カスタマイズくらいしか経験ない。
062361003/03/07 17:03ID:o/kX6MY9
これで大丈夫みたい・・・(エラーは出なかった)
sub axs {
&get_host;
foreach (@deny){
if ($_ eq '') { last; }
$_ =~ s/\*/\.\*/g;
if ($host =~ /$_/) { last; }

if ($_ ne "@deny"){ &error("許可されていないアクセスです")}
}
}

アクセスをはじけてるかどうかはまだチェックしてないけどね。
>>614さん、ありがとう(*^^*) 感謝です。
0624nobodyさん03/03/07 19:23ID:???
ある文字列を16進で縦に出力する方法を教えてください

例"5aB0"
↓
0x35
0x61
0x42
0x30

0625nobodyさん03/03/07 19:38ID:UTyY6aWY
>>624
$str = "ある文字列";
chomp $str; # 必要なら
foreach( split //, $str ){
printf "0x%x\n", ord;
}
0626nobodyさん03/03/07 19:42ID:???
>>625
ありがとうございました
0627nobodyさん03/03/07 19:58ID:UTyY6aWY
>>614-615
エラーチェックはしてないでつ
あと@uniqの内容がこれで良いのか自信なし

@sorted = でーた;
@uniq = ();

my %count = ();
my %sum_point = ();
my %sum_rate = ();
foreach(@sorted){
my($name, $point, $rate) = (split /<->/)[0..2];
$count{$name}++;
$sum_point{$name} += $point;
$sum_rate{$name} += $rate;
}
foreach(sort keys %count){
my $ave_point = sprintf "%4.2f", $sum_point{$_} / $count{$_};
my $ave_rate = sprintf "%4.2f", $sum_rate{$_} / $count{$_};
push @uniq, join("<->", $_, $sum_point{$_}, $count{$_}, $ave_point, $ave_rate);
}
0628nobodyさん03/03/07 20:48ID:???
今変数内に、HTMLタグを含む文字列が入ってます。
質問1.この中の<br>タグ(大文字のタグも含む)の数を数えたい場合どうすればいいでつか?
質問2.この中の後から数えてn番目の<br>タグ(大文字のタグも含む)以降の文字列を別変数に入れたい場合どうすればいいでつか?
お頼み申し上げ候
0629nobodyさん03/03/07 21:29ID:???
>>628
#三回マッチ
$val = "1<br>2<br>3<br>4<br>5<br>6<br>7<br>";
$val =~ /((.*?<br>){3})/;
print "$'\n";
063062903/03/07 21:32ID:???
括弧が一つ多かった。
大文字も含むなら
$val =~ /(.*?<br>){3}/i;
0631nobodyさん03/03/07 22:16ID:???
>>628
2.の良い方法が思いつかないけどとりあえずこんなんで
index使ったほうがいいのかな

1. count_br(文字列)
2. separate_br(文字列,n番目)

sub count_br{
  my $str = shift;
  return ($str =~ s/<br>//ig);
}

sub separate_br{
  my($str, $cnt) = @_;
  $cnt = count_br($str) - $cnt;
  my $pre = join "<br>", (split /<br>/i, $str." ")[0 .. $cnt];
  return substr($_[0], length $pre );
}
0632nobodyさん03/03/07 23:00ID:???
my @line = $str =~ /[^<]*<br>/ig;
my $new = join('', @line[ $n .. $#line ]);
0633nobodyさん03/03/07 23:06ID:???
$'を使うものの方が速そうだな。あぁ
063463103/03/07 23:12ID:???
>>632
漏れもそれを最初は考えたんだが、<BR>以外のタグが
あったときなんかはどうすれば良いのでしょう?
回避方法が思いつかずあんな恥ずかしいソースに…
063561403/03/07 23:20ID:???
>>627
ありがとう。
ちょっと手直ししたらうまくできましたーー。
きれいなコードで早そうですね。
まじさんくす。

0636nobodyさん03/03/07 23:28ID:???
>>634
はぅー考えてなかった。

そこは否定先読みで何とかできるかな。
0637nobodyさん03/03/07 23:29ID:???
$val = "1<br>2<br>3<br>4<br>5<br>6<br>7<br>";

my $want = 3; # 3以降
my $count = 0;
my $after = '';
while($val =~ /<br>/ig){
if (++$count == $want){
$after = substr($val, pos($val));
}
}

print "count=$count after=$after\n";

出遅れた…。
063863103/03/07 23:33ID:???
>>636
n番目の<BR>以降がn番目の<BR>を含まないならこうでいいのかな?
ベンチマークしたらほとんど変わらなかったけどソースすっきりです。

sub separate_br{
my($str, $cnt) = @_;
my @line = $str =~ /.*?<br>/ig;
return join('', @line[ ($#line-$cnt+2) .. $#line ]);
}
0639nobodyさん03/03/08 00:35ID:???
なるほど。最短一致ですか。先読みとか言ってた自分はアホですな。
0640 03/03/08 01:05ID:???
スクリプトがかけるCPU負荷というのは、どうすれば
調べる事ができるのでしょうか? PERLだと、どのような
処理を用いると負荷を上げてしまうのでしょうか?

Admin設置禁止CGIスクリプト情報
http://chat-jp.com/announce/denycgi/index.html
0641nobodyさん03/03/08 01:11ID:???
timesで何かそれらしき物(CPU時間)が出てくるから、少しは参考になるかも。
064262803/03/08 03:36ID:???
>>629-634,636-639
うまくいきました。
ありがとうございます。

今回は漏れの厨な脳に一番マッチした637さんのを使わせていただきました。
ただ、後から数えてn番目の<br>タグ以降の条件が前から数えてになってまつた。
0643nobodyさん03/03/08 04:20ID:???
CJ ClubのCGIってそんな負担だったのか…。
私も詳しく負荷率調べる方法教えて欲しいのです。
0644 03/03/08 06:43ID:???
ローカルでHTML表示部分をループさせて
process viewer見てたら、perlだけで30%近く
いきますね。
0645nobodyさん03/03/08 08:09ID:ijgyFeL7
45
0646nobodyさん03/03/08 09:22ID:2Y4AuOip
それここに書いてある
http://homepage3.nifty.com/digikei/
http://homepage3.nifty.com/digikei/sample/sample.html
              ,、-―-、
             丿   <`)       __
        ,、- ''' "二ヽ_(ヽ'`(二ニ・    |   \_
        /  、     !__'、_┌´     │   / `' ー┐
     /     ヽ   |   `         |   |     |
   ___ |    ヾ__|   |   _,、r‐'',ニ=-  |  /  _,、-‐'゙
 _| '、|    ミ/ ゙、  |_,∠-''´ ̄`'ー、   ̄|-''" |
 \|.  |     l___l     / ̄ヾ`´`   | ̄ ̄ ̄`'''iー、
.  |/゙|    ̄   ヽ_,、-''´`ヽ _,、,、,、,、_|______|_
  |  ( ´         ,、- ''゙  丿 ヾ二二二二二二二二二|ニ!
  ヽ<二二二二二>~/ / /   └‐┬─‐────┬┘
0647nobodyさん03/03/08 11:09ID:???
>>644
負荷かけてんだから当たり前なわけだが。
0648nobodyさん03/03/08 11:48ID:???
>>647
スクリプティングによる差は出ませんか?
0649nobodyさん03/03/08 12:10ID:???
>>648
そりゃ場合によっては差も出るだろうが
「HTML表示部分をループ」
だけならそんなに変わんないんじゃ?
0650nobodyさん03/03/08 12:23ID:???
>>649
掲示板の、
ログデータ読み込んで整形してHTMLで出力させる
みたいな感じです。
他で差が出るとすると連続書き込みさせた場合ですかね。
0651nobodyさん03/03/08 12:52ID:???
child tree のソースをちと読んでみた。
これは… 激しく読むのが苦痛。
CPU負荷は環境によるので一概には言えないが、
メモリにはかなり厳しそうなスクリプトですな。

で、>>640を読む限りだと
・禁止してないスクリプトなら設置していいよ
・でも負荷が高いときは勝手に止めることがあるからね
ということなので、CPU負荷は調べる必要ないかと。
0652世直し一揆(コピペ推奨)03/03/08 13:01ID:lDVM7LmW
<血液型A型の一般的な特徴>(見せかけのもっともらしさ(偽善)に騙されるな!!)
●とにかく気が小さい(神経質、臆病、二言目には「世間」(「世間」と言っても、同じA型を中心とした一部の人間の動向に過ぎないのだが・・・)、了見が狭い)
●他人に異常に干渉し、しかも好戦的でファイト満々(キモイ、自己中心、硬直的でデリカシーがない)
●妙に気位が高く、自分が馬鹿にされると怒るくせに平気で他人を馬鹿にしようとする
(ただし、相手を表面的・形式的にしか判断できず(早合点・誤解の名人)、実際にはた
いてい、内面的・実質的に負けている)
●本音は、ものすごく幼稚で倫理意識が異常に低い(人にばれさえしなければOK!)
●権力、強者(警察、暴走族…etc)に弱く、弱者には威張り散らす(強い者にはへつらい、弱い者に対してはいじめる)
●あら探しだけは名人級でウザイ(例え10の長所があってもほめることをせず、たった1つの短所を見つけてはけなす)
●基本的に悲観主義でマイナス思考に支配されているため性格がうっとうしい(根暗)
●単独では何もできない(群れでしか行動できないヘタレ)
●少数派の異質、異文化を排斥する(差別主義者、狭量)
●集団によるいじめのパイオニア&天才(陰湿&陰険)
●悪口、陰口が大好き(A型が3人寄れば他人の悪口、裏表が激しい)
●他人からどう見られているか、人の目を異常に気にする(「〜みたい」とよく言う、
世間体命)
●自分の感情をうまく表現できず、コミュニケーション能力に乏しい(同じことを何度
も言ってキモイ)
●表面上協調・意気投合しているようでも、腹は各自バラバラで融通が利かず、頑固(本当は個性・アク強い)
●人を信じられず、疑い深い(自分自身裏表が激しいため、他人に対してもそう思う)
●自ら好んでストイックな生活をしストレスを溜めておきながら、他人に猛烈に嫉妬
する(不合理な馬鹿)  
●後で自分の誤りに気づいても、強引に筋を通し素直に謝れない(切腹するしかない!)●自分に甘く他人に厳しい(自分のことは棚に上げてまず他人を責める。包容力がなく冷酷)
●男は、女々しいあるいは女の腐ったみたいな考えのやつが多い(例:「俺のほうが男
前やのに、なんでや!(あの野郎の足を引っ張ってやる!!)」)
0653nobodyさん03/03/08 14:48ID:GxFJGMsn
すいません、デコード処理のルーチンの一部なんですが
$in{$key} .= "\0" if (defined($in{$key}));
の「.」ってなんでそう?探してもみつからず、気になって気になって
夜も寝ずに昼寝してしまいます。
0654nobodyさん03/03/08 14:51ID:???
>>653
文字列の連結。 +=とかと同じシリーズ。って言うか基礎。本読め。
0655nobodyさん03/03/08 14:52ID:???
>>653
$a = $a . $b;
$a .= $b;

上を短縮した書き方が下。
他に += とか、ほとんどの演算子でこのような記法ができる。
0656nobodyさん03/03/08 14:57ID:???
あぁなるほど、いやね、妙に半角一マス空いてたんで違う意味なのかなって思ってマスタ。
ありがとうございました。これでぐっすりできます。多謝。
0657nobodyさん03/03/08 18:26ID:6Zv33rxC
以前定数は
use constantがイイ!
という意見が出てるのを見てから見栄えも上級者っぽい
という事もあって使いまくってたんですけど
何故配布CGIとかだとさっぱり使ってないんでしょう?
そんなの配布サイトに聞けッ!て感じですけど
ご意見聞かせて下さい。
0658nobodyさん03/03/08 18:30ID:???
constとenumで
0659nobodyさん03/03/08 18:33ID:???
配布CGIの作者は必ずしもPerlの達人ってわけじゃないからね。
糞みたいなスクリプトでもそこそこ動けばいいんだよ。

あと、Perl4でも動くようにっていう配慮もあるかも。
(でも実際は新しい記法についていけてないだけの人のほうが多そうだ)
066065703/03/08 18:46ID:6Zv33rxC
>>658-659
ありがとうございます。
配布CGIのほとんどが使って無いので
何か自分の知らない落とし穴でもあるんじゃ?と思ってました。
ほんのわずかでも早くなってデメリットが無いのなら
使わない手は無いという感じで、これからもビシバシ使おうと思います。
0661nobodyさん03/03/08 19:05ID:???
http://www30.cds.ne.jp/~yukinaka/eureka/notes/perl_memo.html#const

Perlではこんな面倒なことをしないと定数すら使えないのか。
0662nobodyさん03/03/08 19:15ID:???
上から順に読むんだからインライン展開とかできないだろが
0663nobodyさん03/03/08 19:32ID:???
配列@_内の重複した要素をまとめてユニークにするロジックなんですが・・
@a=grep(!$b{$_}++,@_);
foreach (@a){
print "$_\n";
}

grepの第一引数の意味がよくわかりません。({$_}とか++の意味)
重複したものを探して真の場合は取り除いている
ようなきはするのですが・・

どなたか教えてください。
0664nobodyさん03/03/08 19:49ID:g3+hGhZv
現在KENT WEBのSunbbsを改造しています。
それで新着情報ボードモードにしてあるので
$comと比較して「二重投稿禁止」のエラーを出させないようにしたいんですが

# 二重投稿の禁止
($num,$name,$com) = (split(/<>/, $lines[0]))[0,2,5];
&error("二重投稿は禁止です") if ($in{'name'} eq $name && $in{'comment'} eq $com);

↑この部分を全部消したら$numに干渉せず
記事全て[1]になってしまいます。
$in{'comment'} eq $comだけを消してもエラーが出てしまいます。
どなたか教えてください。
0665nobodyさん03/03/08 20:09ID:???
>>663
まず初期状態では %b は未定義なので、評価するとすべて偽。
grepの第1引数は、真で返すとその要素が戻り値のリストに入る。ここまでOK?

要素をキーとして $b{} を評価する。これが偽なら、はじめて出てくる要素なので
この要素をgrepの戻り値として返す。そのとき、第1引数は真にしないといけないので
!で反転させている。で、++して「その要素はすでに返した」というフラグを立てる。
これを繰り返す。

同じ要素が出てくると、$b{} は++されているので「真」になる。!で反転させると偽になり、
grepの戻り値としては返されない。結果、同じ要素は複数返されないことになる。

説明下手でスマソ

>>664
2行目だけ消せばいいと思われ。
0666nobodyさん03/03/08 20:15ID:???
>>663
$b{} はハッシュの要素を指す
! は論理否定
$_ はデフォルトの対象となる変数
(この場合はgrepによって第二引数=リストの一部が設定される)
++ はオートインクリメント(この場合は後置:式の評価後、インクリメントが発生)
066766403/03/08 20:19ID:???
>>665
OKでした。
2行目にも$comの記述があるから、と消そうとしなかった僕はアホですね。
ありがとうございました。
066866303/03/08 20:43ID:???
>>665
>>666
ありがとうございました
0669名無しのmakoto君(名前あるじゃん03/03/08 21:23ID:???
質問てか教えてなんだけど、簡単なアクセスカウンターの作り方
教えてください<(_ _)><(_ _)>ペコペコ
検索してもよく出てきませんでした(恥
お願いします(たたかれてもメゲマセン←ハァ?
0670nobodyさん03/03/08 21:32ID:???
>>669
あっちで答えてやったのでは不満か?傷ついた。
0671nobodyさん03/03/08 21:49ID:???
>>669
はいよ〜
http://www.google.com/search?num=100&hl=ja&ie=UTF-8&oe=UTF-8&as_qdr=all&q=perl+%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%83%BC%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9&lr=
0672nobodyさん03/03/08 21:57ID:???
windows環境でperl勉強しています。
フルパスからファイル名を取得したいので
以下のように作りました。
一応機能的にはokなんですが、もう少し格好良くperlっぽいやり方があれば教えてください。
なんか無駄が多いような・・

$_=$0;
$_=~ s/^(.*)\\(.*)$/\2/;
print "$_\n";

0673nobodyさん03/03/08 22:03ID:???
>>671
ワラタ
0674名無し.net03/03/08 22:05ID:HY3rXLfE
はじめまして。
連想配列(?)についての質問なんですが、
$temp->{'001'} = "1";
$temp->{'002'} = "2";
$temp->{'003'} = "3";
という配列があり、これを通常の連想配列(ハッシュ)で
while (($name, $value) = each(%temp)) {
print "$name = $value<br>\n";
}
とやるのと同じ事をしたいのですが、可能なのでしょうか?
ご存知の方がいらしたら是非教えてくださいm(__)m
%tempを$tempにしたら、500 Internet Server Errorになってしまいました。
0675nobodyさん03/03/08 22:08ID:???
>>672
十分Perl臭い。
0676nobodyさん03/03/08 22:12ID:???
%{$temp}
だっけ…、ちと動作させてないから動くかわからん。
■ このスレッドは過去ログ倉庫に格納されています