[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:17965] Re: perl



角です。

#手元にラクダ本が無いんで、ちゃんとは説明できないんですが・・・

From: 早間義博 <yossi@yedo.src.co.jp>
> これは、「プログラムの結合度」の観点で local (出来ないけれど my)
> を入れたいところです。
> > use vars qw($pointer);
> は、関数の中に書くのですか。(自分で確かめます)

値の受け渡しをこの手で行うと、後々保守が辛くなるかも知れません。
#手っ取り早いといえば、その通りです。

> > my $number="210";
> > my $address="city";
> > 
> > にしましょう。
> > 
> 
> これは、書いてみましたが、効果はありませんでした。別の意味なのでしょ
> うか。

正確にはどう説明すればいいのかは分からないんですが、全くの別物です。
私は「local はグローバル」って覚えていますが、local をほとんど使わなく
なってしまいました。最近使った記憶では、関数の中で関数を定義して再帰呼
び出しした時かなぁ。

> 
> > 
> >     my $keyword = {
> >         phone   => {pointer=> \$number, proc=>1,} ,
> >         addr   => {pointer=> \$address, proc=>1,} ,
> >     };
> > 
> 
> この書き方は
>          phone   => {pointer=> *number, proc=>1,} ,
> とどのように違うのでしょう。

このとき、前者は $number へのリファレンスなのに対して、
後者は $keyword->{phone}->{pointer} に *main::number が入ります。
これは $main::number なのか &main::number なのかの区別がないんですね。
私は右辺に型グロブを使うのはファイルハンドルの時しか無いんですが、
あえて作るとしたら、こんな使い方もできちゃうんです。
----------------------------------------------------------------------
#!/usr/bin/perl -w

use strict;
use vars qw($var);

Call();

sub Call {
  local($var);
  *var = *hello;
  print &var;
}

sub hello {
  print "print from hello.\n";
  return "return from hello.\n";
}
----------------------------------------------------------------------
こう書かれると長いプログラムで一部の関数だけ見せられても、もう何が何だか。

今回の問題は、スコープの異なる local 変数間で型グロブによってシンボル
を受け渡ししたのが原因なんでしょう。(これが正確な表現なのかは不明です ^^;)

> ポインタ(perlでもこの表現で良いのでしょうか)をデータとして利用す
> るために試した中で、使用できた形式が最初に書いたものです。

Cのポインタ like な使い方であれば、リファレンス渡し
$var1 = \$var2;
です。

> perl で迷うのは、殆ど同じのように見えるのに
>  $abc{"aaa"}{"xyz"}="aaa";
> と
>  $abc={
>      aaa => { xyz=> "aaa",},
>  };
> が違うのです。
> この違いを「らくだ」からは読めませんでした。

この違いを味わうとすれば・・・
----------------------------------------------------------------------
#!/usr/bin/perl -w

use strict;
my(%hoge,$hoge);

$hoge{aaa}{bbb}="ccc1";
$hoge->{aaa}->{bbb}="ccc2";

print %hoge . " " . \%hoge . " " . \$hoge{aaa} . " " . \$hoge{aaa}{bbb} . "\n";
print $hoge . " " . \$hoge . " " . \$hoge->{aaa} . " " . \$hoge->{aaa}->{bbb} . "\n";
print "$hoge{aaa}->{bbb}\n";
print "$hoge->{aaa}{bbb}\n";
----------------------------------------------------------------------
こんな感じでしょうか。

> 利用目的からはどちらでも良いのですが、「aaa => { xyz=> "aaa",}」の
> 方が内容を理解しやすいようにおもいます。

後者の形式は、ハッシュへのリファレンスを受け取った関数の中でよく使います。

----------------------------------------------------------------------
...

$hoge{aaa}='bbb';
...

Hello(\%hoge);
...

sub Hello {
  my($hash) = @_
  ...
  ... $hash->{aaa} ...;
  ...
}
----------------------------------------------------------------------

ではでは。

-----
Yasutaka SUMI <sum@mwb.biglobe.ne.jp>
http://pgp.nic.ad.jp:11371/pks/lookup?op=get&search=0x8842F549
Key fingerprint = 5F6D 79E1 E52D 2B38 B9B5  13F5 F8E9 F3E1 8842 F549

Follow-Ups
[plamo:17971] Re: perl, 早間義博
References
[plamo:17955] Re: perl, Yasutaka SUMI
[plamo:17956] Re: perl, Yasutaka SUMI
[plamo:17958] Re: perl, 早間義博

[検索ページ] [メール一覧]
Plamo ML 公開システム