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

Perl 初心者コーナー Part21

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/03/18 18:47ID:Dujz7IUF
いらっしゃーい、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 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/

過去ログやお勧めサイトは >>2-10
0412nobodyさん03/04/01 17:07ID:???
>>407
な、なんだってー(AA略
041340603/04/01 17:25ID:???
>>411
サンクスできました。
0414nobodyさん03/04/01 17:48ID:???
ttp://www.age.jp/~lunar/index.cgi?read=./package/web_ftp_3_5_0.lzh
の中の ftpcontrol.pl を解読中なのですが、300行目付近の
($boundary) = $content_type =~ /boundary="([^"]+)"/; #";
の行がよくわかりません。左端の括弧が必要な理由と、
右端の #"; が何かよくわかりません。どなたかわかりますか?
0415nobodyさん03/04/01 18:18ID:???
リストコンテキストを作り出すために、カッコをつけているんじゃないかな。

0416nobodyさん03/04/01 18:30ID:???
#";
てのは、なんだかわからん。
普通に考えれば、# 以降は行末までコメントだけど・・・。
041741403/04/01 18:40ID:???
ありがとうございます。左端の括弧はリストコンテキストですね。
調べが足りませんでした。
しかし、右端の #"; は謎ですね。コメントにしか見えないんだけど、
何の意味をこめてコメントにしたのかわからないし、
タイプミスだとしても、タイプミスで「"」を入力するヤシがいるのかと問いたい。
0418nobodyさん03/04/01 18:58ID:???
世の中には対応する括弧やクォートを強調表示したり、
そこへ飛んだりできるエディタが多く存在するのだよ。

そういうエディタで /boundary="([^"]+)"/ なんて行が
あると、クォートの数が揃わんで難儀するのだよ。
0419nobodyさん03/04/01 19:08ID:???
>>418 なるほど!
042041403/04/01 19:10ID:???
>>418
なるほど!!

では、#"; のセミコロンも意味があるのだろうか・・・
0421nobodyさん03/04/01 19:11ID:???
気分?
0422bloom03/04/01 19:13ID:xVxahWvN
http://www.agemasukudasai.com/bloom/
0423nobodyさん03/04/01 23:05ID:jYJDEp5A
@template = ("aaa","bbb","ccc");

foreach $line (@template){
 $line =~ s/aaa/AAA/;
 $hoge = $hoge . $line;
}

print "@template : $hoge";

こうすると、$template[0]自体がAAAになってしまいます。
違うのです。配列の要素は変わらないで欲しいんです。
っていうか、配列の要素に対して置き換えしてるわけじゃないのに
どうして配列の要素の$template[0]が置き換えされちゃうんでしょうか。
$lineに対して処理をしてるのに。
042442303/04/01 23:09ID:???
例えば、@templateを何度か使い回しする時、
配列の要素が変更されてると困っちゃうんです。
0425nobodyさん03/04/01 23:23ID:???
>>423
思いっきり配列の要素を変更しようとしています。

) foreach $line (@template){
)  $line =~ s/aaa/AAA/;
)  $hoge = $hoge . $line;
) }

foreach ループ内では、$line は配列@templateの各要素にセットされます。
$line を変更すると、配列の要素が変更できる、ということです。
変更したくない場合は、一旦別な変数にコピーしてから、扱いましょう。

「コピーする」「セットする」という用語がみそです。
0426nobodyさん03/04/01 23:34ID:???
久々に初心者らしい質問だったな
0427nobodyさん03/04/01 23:51ID:???
ここまで全部嘘でした。
0428nobodyさん03/04/01 23:55ID:wgIEAtF8
#!/usr/bin/perl

@arr = ('aaa', 'bbb', 'ccc');
$str = 'zzz';

foreach $str (@arr) {
  print $str . "\n";
}

print $str . "\n";


最後に表示される1行は、zzz だよ。
今日は4月1日だな。(笑)
0429nobodyさん03/04/02 00:46ID:???
>>428
何を訳わかんないこと一人で納得してんの?
0430nobodyさん03/04/02 01:09ID:???
foreach の横に書いた変数はlocalが付いているものとして解釈される、ということ。
でも今の、foreachの中で$strが@arrの各要素のエイリアスになる、ということには関係ない。
0431 03/04/02 01:20ID:???
モジュールを使わないでmailを送る方法って無いでしょうか?
0432nobodyさん03/04/02 01:22ID:???
がんばれ
0433nobodyさん03/04/02 03:38ID:???
>>431
モジュールって意味わかって言ってんのかなぁ?
0434nobodyさん03/04/02 04:29ID:???
申し訳ないです、"->"の意味を教えて頂けないでしょうか?関数等なら検索すれば
直ぐに出てくるのですが記号等は検索しても何故か引っかからないのでお手上げ状態に
なってしまいます。
0435nobodyさん03/04/02 05:15ID:???
矢印演算子 Perl で検索すれば出てくると思う
0436nobodyさん03/04/02 05:16ID:???
>>434
「Perl 矢印演算子」でぐぐれ

0437nobodyさん03/04/02 08:30ID:???
アロー演算子だろ。
0438 03/04/02 14:38ID:sWPLndkw
質問です。

投票CGIの多重投票防止をクライアントのNICのMACアドレスを取得
することで実現できないかと考えたのですが、実現可能でしょうか?
また実現可能な場合、どのようなコードを書けばいいのでしょうか?

ご教授ください。
0439nobodyさん03/04/02 14:53ID:???
すごいな。
0440nobodyさん03/04/02 14:57ID:???
>>438
MACも偽装できるけどそれでもイィ?
044143803/04/02 15:06ID:sWPLndkw
>>440
それでもIPやクッキーよりもましだと思うので、方法があるのでしたら
ご教授ください。
0442nobodyさん03/04/02 15:09ID:???
偽装の前に、そもそもMACアドレスって、どこまで知れ渡るの?
同じネットワーク内だけじゃ?
0443nobodyさん03/04/02 15:28ID:???
春だなぁ〜(´∀`
0444nobodyさん03/04/02 15:35ID:???
Net::PcapかNet::PcapUtilsでパケットつかまえて
NetPacket::ARPとか使えば出来そうだけど、
敷居が高すぎてやったことないね。

それよりもネットワーク系超ニガテだけどさ、
442さんの言うとおりイーサネットまででしょ。
多分つかまえられるのはてめーんとこのルータのMACアドレスまでだね。
他はIP+ポートのソケット単位でルーティングされてるんだろうから。
リモートのIPじゃだめなの?

よって、クッキーたべさせなさい。
0445 03/04/02 15:35ID:sWPLndkw
>>442
クライアント側でipconfig実行してその値を取得できればいいんですけど
そのやり方がどうも分からなくて、Win32::OLE使えば出来そうなんですけど。

http://member.nifty.ne.jp/hippo2000/perltips/Win32/OLE.htm
0446nobodyさん03/04/02 15:37ID:???
>>445
掲示板に書き込もうとした人に無理矢理ipconfigを実行させるのか?
0447nobodyさん03/04/02 15:39ID:???
そんなことができるなら、とっくにみんなやっていると思うけど。
0448 03/04/02 15:39ID:sWPLndkw
>>444
IPだと再ダイアルアップしたらだめだし、クッキーもその都度消されちゃったら
だめなんでMACアドレスならいいかなと。それにルーターまででも桔梗いいん
じゃないかと・・・
044944603/04/02 15:39ID:???
掲示板じゃなくて投票か。どうでもいいけど
0450nobodyさん03/04/02 15:43ID:???
>>448
だから、てめーんとこのルータまでだって。
ルータ製品を変えない限り何万回でも何億回でも
同じMACアドレスしかつかまえられないでしょ。
そんなクッキーよりIPより無用なものがよかったら
NetPacket::ARP使いなさいってこった。
0451nobodyさん03/04/02 15:45ID:???
それにipconfigをクライアントで実行させた値を取ってこれたら、
果てしなくガクブル系セキュリティホールだな。
しかも、OLEなんて全然関係ないし。
0452nobodyさん03/04/02 18:04ID:4v5aHOPP
外部に作成したHTMLファイルから読み込んで
<!--here-->
みたいなコメントの部分をCGIで置き換えて出力する部分を作成しています(Perl)。

この、HTMLファイルを、CGIのディレクトリと違うディレクトリにいれたんですが、
これだと、HTMLが画像のリンクなどを含んでいた場合、困ったことになります。
HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。

ホームページの編集ソフトなどで作成したHTMLを、指定フォルダにアップする形にしたいので、
すべての画像パスを絶対パスにするとかそういう解決策は無しで、何かいい方法はないでしょうか?

一般的な解決策などがあるのでしょうか?
0453nobodyさん03/04/02 18:09ID:???
>>452
まったく Perl と関係ねー
0454nobodyさん03/04/02 18:12ID:???
君みたいな人はお金で買ったほうが早いよ
0455nobodyさん03/04/02 18:21ID:???
> HTMLがCGIから出力された時に、相対パスで入っていると、画像が表示されません。

その相対パスの指定が間違っているだけではありませんか。
結果的に正しい相対パスになるように、書いておくしかないのではないでしょうか。
0456nobodyさん03/04/02 19:13ID:???
正規表現で自動で置き換えるようにするとかさぁ

なんで<!--here-->は置き換えられてIMGタグは置き換えられないのかと・・・ry
0457nobodyさん03/04/02 20:21ID:???
$iptext = "ip.txt";
##################################
$openimg = "svropen.gif";
$closeimg = "svrclose.gif";

open IN, "<$iptext" or die "ERROR:ipファイルが開けません!";
$ipdata = <IN>;
close IN;

if ($ipdata == "close") {
$dispimg = $closeimg;
&dispimage;
} else {
$dispimg = $openimg;
&dispimage;
}

sub dispimage{
print "Content-type: image/gif\n\n";
open IMG, "$dispimg" or die "ERROR:imgファイルが開けません!";
binmode IMG;
binmode STDOUT;
while (<IMG>){
print STDOUT $_;
}
close IMG;
}
__END__

これのopenimgとcloseimg両方を文字で表したいのですがどうすればいいですか?
0458nobodyさん03/04/02 20:31ID:???
説明下手が多いよな、手助けしたくても理解できんよ。
0459nobodyさん03/04/02 20:40ID:???
>>458
ハゲドゥー
046045703/04/02 20:43ID:???
#!/usr/bin/perl

##############ファイル設定#################
$iptext = "ip.txt";
$open = "あ";
$close = "い";
###########################################

if ($ipdata == "close") {
print "$open\n";
}
else {
print "$close\n";
}

これでは表示されないのかなぁ?
0461nobodyさん03/04/02 21:04ID:???
何を言ってるのかやりたいのか、さっぱりわからん??? 
0462nobodyさん03/04/02 21:08ID:???
なんで

open IN, "<$iptext" or die "ERROR:ipファイルが開けません!";
$ipdata = <IN>;
close IN;

を消してんだよ。
046345703/04/02 21:10ID:???
あれ〜〜〜。。
これさ、imgタグで表示させるから、文字にしても意味ないか、、、
0464nobodyさん03/04/02 21:15ID:???
独り言は脳内でやってくれや
0465nobodyさん03/04/02 21:19ID:???
聞く前に一番最初に気づけ。
046645703/04/02 22:19ID:???
重ね重ねすいませんが、
今やろうとしているのは、

まずip.txtを読みにいって、IPがあれば、「公開」、空白だと「非公開」
(ip.txtの更新はNoDNSというフリーソフトでやってます)
というふうにして、HTMLに表示するCGIを作りたいのですが、どうでしょうか?
0467nobodyさん03/04/02 22:31ID:???
>>466
うるさい
046845703/04/02 22:38ID:yhPO3ktu
#/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "content-type: text/html\n\n";
print "<html><head><title>公開</title></head>\n";
print "<body><h1>公開</h1></body>\n";
print "</html>\n";
exit;
}
sub unsettion
{
print "content-type: text/html\n\n";
print "<html><head><title>非公開</title></head>\n";
print "<body><h1>非公開</h1></body>\n";
print "</html>\n";
exit;
}
046945703/04/02 22:51ID:???
>>468
わざわざこんなに書いていただいたのに申し訳ありませぬが、
あらかじめいろいろ書いているindex.htmlに付け加える形にしたいのですが、、、
なんどもすいません
0470nobodyさん03/04/02 23:01ID:yhPO3ktu
SSIを使でよびだすのはだめですか?
047145703/04/02 23:03ID:???
>>470
CGIがいいです、はい。
注文多くてごめんなさい。
あ、でも、使いそうなので教えてくれますか?
0472nobodyさん03/04/02 23:09ID:yhPO3ktu

SSIでやるには、読み込みたい部分に<!--#exec cgi="よみこむCGIファイル" -->
でいいとおもいます。

CGIでは・・・やりかたがいまいちおもいつきません。index.htmlのフレームを
わければなんとかなりそうですが・・・
047345703/04/02 23:19ID:???
>>472
そうですかぁ。。。
付け加えるのなら、画像にしてIMGタグにするしかないんですかね
0474nobodyさん03/04/02 23:19ID:yhPO3ktu
付け加えるって追加indexに追加書き込みするってことですか?
047545703/04/02 23:24ID:???
>>474
そういうことです。
0476nobodyさん03/04/02 23:35ID:yhPO3ktu
#/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
$ex++;
}
}
close(FILE);
open(FILE2,"+>index.html");
while(<FILE2>){
if(s/<\/body>(.*)<\/html>/\1/ig){
print FILE2 "$_";
}else{
print FILE2 "$_";
}
}
close(FILE2);
if($ex){
&settion;
}else{
&unsettion;
}
0477つづき03/04/02 23:36ID:yhPO3ktu
sub settion
{
open(FILE3,">>index.html");
print "<h1>公開</h1></body>\n";
print "</html>\n";
close(FILE3);
exit;
}
sub unsettion
{
open(FILE3,">>index.html");
print "<h1>非公開</h1></body>\n";
print "</html>\n";
close(FILE3);
exit;
}
0478nobodyさん03/04/02 23:46ID:???
普通はSSIだよな
0479名無しさんパーフェクト03/04/02 23:50ID:RgSUli0E
indexを読み込んだときにそのプログラムを読み込むのではもう遅いのでは?
それならまた違うhtmlを編集して最後にそちらに飛ばした方が
0480名無しさんパーフェクト03/04/02 23:51ID:RgSUli0E
あげてしまった吊ってくる
0481名無しさんパーフェクト03/04/02 23:53ID:???
鬱・・・
048245703/04/02 23:56ID:???
すいません。ほんとに迷惑かけて。SSIで行くことにしました。。

自宅鯖は<!--#exec cgi="よみこむCGIファイル" -->です。
ってして、あとどうすればいいですか?
CGIファイルはどれにすればいいんですか?
ほんと何も知らないですいません。。
0483nobodyさん03/04/02 23:57ID:yhPO3ktu
これでだめならSSIかframeで分割して読み込んでください。
0484nobodyさん03/04/03 00:06ID:os6gOz9a
>>468
のファイル名をserchip.cgiだとして
それをSSIでindex.htmlに組み込むとすると
組み込みたい場所に
<!--#exec cgi="serchip.cgi"-->
てなかんじでいいとおもいます。
048545703/04/03 00:20ID:???
できないなぁ。トクトクはSSIOKなはずなのに、、、
0486nobodyさん03/04/03 00:40ID:???
>>485
何をどうやってできないのか、はっきり言え。
そうでなければただの独り言だ。独り言を公開の場に垂れ流すな。
048745703/04/03 00:49ID:???
>>486

#!/usr/bin/perl

$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/close/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "閉鎖中\n";
exit;
}
sub unsettion
{
print "公開中\n";
exit;
}

これでSSI使ったらできました。
>>468の
(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
が違ってるとしかおもえないんですが、、どうでしょう?
0488nobodyさん03/04/03 01:00ID:???
>>487
ソースも読めない奴がいじろうとするな
048945703/04/03 01:03ID:???
>>488
コンテンツタイプとかのは、
自宅のAN Httpdだと筒抜けですが、トクトクだと、ちゃんとBODYだけ表示されます。。。
049045703/04/03 01:05ID:???
トクトクにあげているのはこれです。
#!/usr/bin/perl

$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/close/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "content-type: text/html\n\n";
print "閉鎖中\n";
exit;
}
sub unsettion
{
print "content-type: text/html\n\n";
print "公開中\n";
exit;
}
直接cgi実行するとちゃんと変わるんですが、SSIにするとうまくいきません。
自宅鯖は<!--#exec cgi="ip.cgi" -->です。って書いたのに、
自宅鯖はです。
になってしまいます。SSIの文まちがってますかね?
0491nobodyさん03/04/03 01:07ID:???
>476
百合親切だな
0492nobodyさん03/04/03 01:10ID:???
SSIの呼び出し方に決まりごとなかったか?
ちゃんと設定方法とか読んだのかよ、
つか漏れ的には if(/close/){ が非常に気になるわけだが・・・。
049345703/04/03 01:16ID:???
>>492
#!/usr/bin/perl
$ex=0;
open(FILE,"ip.txt");
while(<FILE>){
if(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
$ex++;
}
}
close(FILE);
if($ex){
&settion;
}else{
&unsettion;
}
sub settion
{
print "content-type: text/html\n\n";
print "<html><head><title>公開</title></head>\n";
print "<body><h1>公開</h1></body>\n";
print "</html>\n";
exit;
}
sub unsettion
{
print "content-type: text/html\n\n";
print "<html><head><title>非公開</title></head>\n";
print "<body><h1>非公開</h1></body>\n";
print "</html>\n";
exit;
}
これで直接実行したらできました。あとは、SSIです。。。
049445703/04/03 01:25ID:???
トクトクでは、SSIを動作させるにはファイルの拡張子を .shtml にしなければいけません。
 .htaccess もトクトクでは動作しませんのでこれは変更不可能です。
 また、トップページは index.htm , index.html の形式しか許されていませんので、トップページにSSIを利用することはできません。
( ゚Д゚)ポカーン・・・・・
逝ってきまつ
0495nobodyさん03/04/03 01:26ID:???
>>493
そのコード自体が目的不明に見えるんだが
$ex++みたいにカウントアップして何か意味あるのか?
049645703/04/03 01:28ID:???
>>495
これはほかの方が教えてくれたやつです。。。
index.shtmlにしたらデキターヨ。。
みなさんスレよごしてごめんなさい。
0497nobodyさん03/04/03 01:33ID:???
>495
whileが最後まで回る所とかな。
0498nobodyさん03/04/03 01:33ID:???
>>490
「うまくいきません」の定義はなんだよ?
「自宅鯖はです。」って、HTMLソースレベルでみてそれ言ってるの?
SSIコケたら[an error occurred while processing this directive]が出るだろ普通。

ソース見てみ。多分SSIの構文が丸裸かもしれんぞ。サーバが何かわからんけどよ。

あと、ちゃんとエラーを捕捉しろって。
リファクタリングしてやる。

#!/usr/bin/perl -w
use strict;
use CGI::Carp qw#fatalsToBrowser#;

my $ex = 0;
open(FILE, "ip.txt") || die $!;
while (<FILE>) {
if(/close/){
$ex++;
last;
}
}
close(FILE) || die $!;

print "content-type: text/html\n\n";
print $ex ? "閉鎖" : "公開";
print "中\n";

共通化できる所はまとめなさい。
049945703/04/03 01:44ID:???
>>498
すいません。トクトクでは、shtmlでないといけなかったみたいです。。。
でも、このCGI直すところいっぱいありますか?
0500nobodyさん03/04/03 01:44ID:???
そもそも目的がはっきりしてないんだよな。
>>466の「まずip.txtを読みにいって、IPがあれば、」って、
ファイルにはどれだけのデータがあるのか?
IPある無しの答えは1個なのか複数かもはっきりしてないし
0501nobodyさん03/04/03 01:46ID:???
txtのフォーマットもわからないしな
0502nobodyさん03/04/03 02:20ID:???
>434じゃないんですけど、
perl色々勉強してて、「->」につまづいて、もう全然わけわからなくて、
http://www.rfs.jp/sitebuilder/perl/04/06.html
↑ここが一番詳しいかなとおもうんですけど、ここ見ても意味不明で・・・
だんだんやる気なくしてたんですけど、ちょっと教えていただけませんか?

まず、「矢印演算子を使わなければならない理由」、
あるいは、別に使わなければならないわけでもないなら、
「矢印演算子を使うことでどのようなメリットがあるのか」を
できれば、例をだして、「こういう風なことをしたいときにこうする」
または、「こういう風にするときにこうした方がこういうメリットがある」
という感じで教えていただけないでしょうか?

次に
http://www.rfs.jp/sitebuilder/perl/04/06.html
こことかで出てくる、「無名の配列」「無名のハッシュ」・・・
の「無名」ってのはどういう状態を指してるんでしょうか?

あと、そんなことよりこのサイトで勉強しろよってのがあれば、
貼っていただけると自分で勉強してきます
0503nobodyさん03/04/03 03:19ID:???
無名の名ってのは、変数名のことじゃないかなぁ。

@arr = (1,2,3,4,5);

ってときは、arr っていう名前が、この配列についてる。
0504nobodyさん03/04/03 03:53ID:???
>>502
http://www.namazu.org/~tsuchiya/perl/info/perl-ja_20.html
どうしてもアローを使わなければならないケースは少ないだろう。
0505nobodyさん03/04/03 05:20ID:???
んーホント難しい・・・

>無名の名ってのは、変数名のことじゃないかなぁ。
そういうことだと思うんですけど、じゃあ、これが無名ってのは、どういう状態なんでしょう?
まだ、宣言されてない変数ってことなんでしょうかねぇ?

>どうしてもアローを使わなければならないケースは少ないだろう。
でも人のソースを解読したいときに激しく不便、ってかできないんです
教えていただいたurl・・・難しい。明日改めて勉強しに行ってきます
0506nobodyさん03/04/03 07:32ID:Nji/7HYX
>>505
無名配列、無名ハッシュってのは、多次元のそれらを作るときできる。
@ar=([baka, aho, manuke], 'kuso', 'manko');
ここで($ar[0], 'kuso', 'manko')は、arって名前の配列だな。
だけど(baka, aho, manuke)ってのは、名前のない配列や。
上のは、print $ar[2], "\n";で表示できるが、下のは、
print $ar[0][1], "\n";または、print $ar[0]->[1], "\n";だ。
ハッシュのときは、矢印演算子使うた方が分かりやすいからよく使われる。
0507nobodyさん03/04/03 07:52ID:Nji/7HYX
まだ分からんか。ハッシュの例だ。
%hash=('baka' => 'kuso', 'aho' => {'manuke' => 'manko', 'boke' => 'shikko'});
print $hash{'baka'}, "\n";
print $hash{'aho'}->{'manuke'}, "\n";
0508nobodyさん03/04/03 08:06ID:Nji/7HYX
まだか。まだ分からんのか。
(...)ってのはリスト構造だ。[...]ってのは配列だ。{...}ってのは
ハッシュだ。いいか?だから、
$ar=['baka', 'aho', 'bokenasu'];
$hash={'baka', 'kuso', 'aho', 'manko', 'bokenasu', 'shikko'};
って書くと直接無名配列、無名ハッシュができる。
$ar->[1]とか$hash->{'baka'}ってアクセスするっきゃ内。
0509nobodyさん03/04/03 08:09ID:Nji/7HYX
おい、分かったって言ってくれ。
もう出かけるぞ。
0510nobodyさん03/04/03 10:14ID:???
こういう無名ハッシュを考える。$hashには{ .. }のアドレスが入ってる。
$hash = {a => 1, b => {c => 3, d => 4};

$$hash{a}
これはちょっと格好悪いから、矢印を導入。
$hash->{a}

$$hash{b}->{d}
$hash->{b}->{d}
#{..}の間の矢印は省略できる。一気にデリファレンスする感じ。
$$hash{b}{d}
$hash->{b}{d}

無名ハッシュに対してスライスを使いたいとき、矢印は使えない。
@$hash{b}{'c', 'd'} # (3, 4)

普通のハッシュに戻す事もできる。
%hash = %$hash;

このとき、
$hash{b}->{d}は、さっきのルールが適用されて、
$hash{b}{d}でアクセスできる。
0511nobodyさん03/04/03 10:24ID:???
無名っていう物は、元の英語だと、Anonymousになってて、匿名って読み替えてもいい。

%hash = (a => 1, b => 2);
$hash = {a => 1, b => 2};
この2つの状態を比べると、データは同じでも、上の方は、%hashっていう名前が
付いているのに対して、下は、データのアドレスが$hashに入ってる。

つまり、1つの変数にメモリ上のデータが対応している状態を、普通の状態。
変数に対応していないデータの事を、無名だ。という。
■ このスレッドは過去ログ倉庫に格納されています