ちばと申します。

> #====(A)========
> pr=proc{ a=2 }
> begin	
>  a=1
>  pr.call
> end
> pr2=proc{ p a }
> pr2.call  #=>1
> #====(B)=========
> a=1
> pr=proc{ a=3 }
> pr.call
> pr2=proc{ p a }
> pr2.call  #=>3

Ruby ではローカル変数のスコープは「宣言した位置からその変数
が宣言されたブロック、メソッド定義、またはクラス/モジュール
定義 の終りまで」だそうです。

したがって、(A)の場合、最初に 2 を代入された a のスコープは
代入された場所からそのブロックの終わりまでで、1 を代入された 
a のスコープはそこからスクリプトの終わりまです。つまり最初の
Procで代入された a と2番目の Proc で代入された a は別のもの
になります。

(B)の場合は 1 を代入された a のスコープがそこからスクリプト
の終わりまで続きます。この場合は出てくる変数 a はすべて同じ
スコープに属します。

Basic から移植するのであれば、Proc より def ... end を使い、
サブルーチン内ローカルでない変数はすべてグローバルにしたほう
がよいのではないかと思うのですがいかがしょうか。たとえばこん
な風に。

def pr
 $a=2
end
def pr2
 p $a 
end
begin	
 $a=1
 pr
end
pr2  #=>2

                               千葉 敬介 <chiba / raia-inc.jp>