PowerShell -Part 4at TECH
PowerShell -Part 4 - 暇つぶし2ch705:デフォルトの名無しさん
20/11/08 02:53:16.74 mlfH60EQ.net
スコープの話だと思うよ
関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない
関数を次のように書き換えて明示的にスクリプトスコープの変数を更新してやればいい
function get_stop_code {
$script:hoge=(Get-Content stop_code.txt)
}
PSのスコープって特殊で悩ましい
特にループの初回、ほかの言語みたいに未宣言の変数だぞとエラーになってくれればまだいいんだけど、変数が作られて親からも見えちゃうから混乱する

706:デフォルトの名無しさん
20/11/08 08:09:56.71 0BM2Z5Uf.net
おれも一瞬ではなく数分、>>703の問題がわからなかった
とりあえず頭にSet-StrictMode -Version Latestを付けとけばエラーにはなる

707:デフォルトの名無しさん
20/11/08 10:11:33.41 vf10kFcr.net
>>705
ありがとうございます。
>関数の内側で変数を書き換えてもローカルスコープ内の変数の更新にしかならないので、関数から戻ったら値は書き換わってない
というのは、
>>703だと、
同じシェル内にある$hogeであっても、
 ①get_stop_code関数内の$hoge
 ②while ($true)内にある$hoge
の2種類があり、
while ($true)内で、get_stop_code関数を実行しても、
①の$hogeしか書き換わらないから、求める結果が得られない。
って事でしょうか。

708:デフォルトの名無しさん
20/11/08 12:20:50.04 mlfH60EQ.net
そんな感じ
関数はローカルスコープを作る
whileの方はその外側にあたるから親スコープになる
ちなみにPSではwhileブロックはローカルスコープを作らないのでスクリプト全体のスコープと同じ

709:デフォルトの名無しさん
20/11/08 14:40:55.27 vf10kFcr.net
>>708
ありがとうございます。
スコープですね、勉強になりました。
きっと、しっかり理解すれば便利な仕様なんでしょうが、
初学者にとっては罠でしかありませんね・・・こういうの・・・。

710:デフォルトの名無しさん
20/11/08 21:23:36.42 TgcNdU0w.net
about_Scopes
URLリンク(docs.microsoft.com)(v=wps.640)

711:デフォルトの名無しさん
20/11/09 11:42:35.91 tOFQB4no.net
ダイナミックスコーン

712:デフォルトの名無しさん
20/11/09 13:18:24.63 hpK1fX+1.net
>>707
その前にシェルという単語の使い方がおかしい
ファミリーベーシックで「ファミコン書きました」と言ってる感じで
恥ずかしいのでやめたほうがいい

713:デフォルトの名無しさん
20/11/09 13:43:05.15 6e3D9VGJ.net
シェルスクリプトはシェルスクリプトであってシェルではない

714:デフォルトの名無しさん
20/11/09 18:13:48.88 XoDGsHQu.net
今どきファミリーベーシックに例えても人に通じないぜーっ!!

715:デフォルトの名無しさん
20/11/09 18:47:25.54 8i+JRxOJ.net
べーしっ君はもっと通じないだろw

716:デフォルトの名無しさん
20/11/09 21:56:26.60 zTstc6LM.net
ショットシェルだったら散弾のことでちょっとかっこいいぐらいなのに…
URLリンク(hb-plaza.com)

717:デフォルトの名無しさん
20/11/09 22:20:12.83 7qqOuQ5J.net
ちょっと知れるね

718:デフォルトの名無しさん
20/11/09 22:31:51.42 NYGqo7nG.net
ポンタポイントが付くか楽天ポイントが付くかの違いで基本的には一緒だよ

719:デフォルトの名無しさん
20/11/10 02:41:01.00 TotITmpP.net
スクリプトスコープ以外にも、関数スコープがあるのは便利。
C, Ruby と同じ
関数スコープが無い言語は、プログラミングが異常に難しい

720:デフォルトの名無しさん
20/11/10 04:19:48.53 UHXHz0W1.net
その程度の事で「異常に」難しいんじゃ向いてないんじゃない?
多少面倒臭いなと思う事はあっても

721:デフォルトの名無しさん
20/11/10 04:24:34.34 /n5BB76T.net
再帰呼び出しで・・・

722:デフォルトの名無しさん
20/11/10 09:42:32.98 v1zmG+Gm.net
むしろローカル変数の恩恵に理解を示し、グローバル変数を強制されたら不安だと思う感性の方が普段たくさんプログラミングしてるんだろうなと感じる
変数iを使ったループの中でさらに別の変数iを使った関数を呼ぶと無限ループのバグになる
代わりにjにしようとか考えてると早晩行き詰まるので「i_関数名」みたいな変数名を常に使うことを思い付く
関数名は短くしたいと考えるようになって可読性がまずいことに
短いスクリプトしか書かない用途の言語ならいいけど、そうでないなら品質の低いコードを招く言語になるだろうな

723:デフォルトの名無しさん
20/11/10 13:37:25.83 xsn7mmhw.net
ローカルとグローバルの話はまあややこしいな

724:デフォルトの名無しさん
20/11/10 13:43:57.86 xsn7mmhw.net
自分のいる世界の常識が他の場所で通用するかどうか
それを生きていて初めて見せられた例がプログラミングのローカルとグローバルだった
なんていうPCヲタも少なくないだろうなあw
ブロック過ぎたらまっさらに戻る言語なら
関数が動かないと思ったらちゃんと戻り値にして出さないとなあ
報告連絡相談 と同じ

725:デフォルトの名無しさん
20/11/12 08:30:03.86 HWijez2q.net
Announcing PowerShell 7.1
URLリンク(devblogs.microsoft.com)


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch