ファイルスコープで「my」を使用してPerl変数を宣言するのはなぜですか?

4
Don Kirkby 2014-06-20 19:02.

私はPerlを学び、変数スコープを理解しようとしています。sub内でmy $name = 'Bob';ローカル変数を宣言することは理解していますが、なぜグローバルスコープでキーワードを使用するのでしょうか。コードを安全にサブに移動できるようにするのは良い習慣ですか?my

これを行うサンプルスクリプトがたくさんありますが、なぜだろうと思います。でも、use strictを削除しても文句はありませんmy。動作を比較してみましたが、違いはわかりません。

ここだ一例にこれを行います。

#!/usr/bin/perl
use strict;
use warnings;

use DBI;

my $dbfile = "sample.db";

my $dsn = "dbi:SQLite:dbname=$dbfile";
my $user = ""; my $password = "";
my $dbh = DBI->connect($dsn, $user, $password, {
   PrintError       => 0,
   RaiseError       => 1,
   AutoCommit       => 1,
   FetchHashKeyName => 'NAME_lc',
});

# ...

$dbh->disconnect;

更新

この動作をテストしたとき、私は運が悪かったようです。これが私がテストしたスクリプトです:

use strict;

my $a = 5;
$b = 6; sub print_stuff() { print $a, $b, "\n"; # prints 56 $a = 55;
    $b = 66; } print_stuff(); print $a, $b, "\n"; # prints 5566

私はここの回答の一部から学んだ、として$aおよび$bコンパイラは文句を言わないように、すでに宣言された特別な変数です。そのスクリプトで$bをに変更すると$c、文句を言います。

my $fooグローバルスコープで使用する理由については、ファイルスコープが実際にはグローバルスコープではないようです

4 answers

2
frezik 2014-06-21 02:12.

それは良い習慣です。個人的なルールとして、私は変数を可能な限り最小の範囲に保つようにしています。コード行が変数を認識できない場合、予期しない方法で変数を混乱させることはできません。

ただし、スクリプトがuse strictなくてmyも機能することがわかったのは驚きです。それは一般的に許可されていません:

$ perl -E 'use strict; $db = "foo"; say $db' Global symbol "$db" requires explicit package name at -e line 1.
Global symbol "$db" requires explicit package name at -e line 1. Execution of -e aborted due to compilation errors. $ perl -E 'use strict; my $db = "foo"; say $db'
foo

変数$a$bは免除されます:

$ perl -E 'use strict; $b = "foo"; say $b'
foo

しかし、投稿したコードを厳密で欠落している状態でどのように機能させるかはわかりませんmy

3
Rob K 2014-06-21 03:06.

の追加はmy、Perlにこれまでに起こった中で最高のことであり、Perlが解決した問題はタイプミスでした。

変数があるとします$variable。この変数に対していくつかの割り当てと比較を行います。

$variable = 5;

# intervening assignments and calculations...

if ( $varable + 20 > 25 ) # don't use magic numbers in real code
{
    # do one thing
}
else
{
    # do something else
}

上記のコードに、use strict;変数を宣言する必要がない場合に発生する微妙なバグがありますmyか?# do one thingケースはなり決して起こりません。維持しなければならない本番コードでこれに何度か遭遇しました。

2
Axeman 2014-06-21 12:33.

いくつかのポイント:

  • strictすべての変数がmy(またはstate)で宣言されるか、パッケージにインストールされることを要求します-ourステートメントまたはuse varsプラグマ(古風な)で宣言されるか、コンパイル時にシンボルテーブルに挿入されます。

  • それらはそのファイルの変数です。それらは問題ではなく、そのファイルの使用中に必要なモジュールを使用することもありません。

  • それらはパッケージ間で使用できます(ただし、それはあまり正当な理由ではありません)。

  • 語彙変数には、唯一の選択肢が持つ魔法はありません。他のパッケージ変数の場合とは異なり、スコープを変更するときに字句変数を「プッシュ」および「ポップ」することはできません。魔法がないということは、より速く、よりわかりやすい処理を意味します。

  • 怠惰。my特定の括弧でスコープを集中させるのとは対照的に、括弧なしでを宣言する方が簡単です。

    {   my $visible_in_this_scope_only; ... sub bananas { ... my $bananas = $visible_in_this_scope_only + 3; ... } } # End $visible_in_this_scope_only
    

(構文に関する注意:私のコードでは、中括弧を使用することはありません。スコープが「明白」であったとしても、スコープの前(標準ループ)または後のいずれかで常に通知されます。

1
G. Cito 2014-06-21 02:44.

Asub{}、その操作を定義する中括弧間の変数のスコープを制御/制限します。もちろん、多くの変数は特定の関数の外部に存在しmy、「グローバル」変数に字句を使用すると、アプリケーション内での動作の「動的」をより細かく制御できます。のPrivate Variables via my()セクションでperlodocperlsubは、これをかなり徹底的に行う理由について説明します。

私は他の場所から自分自身を引用するつもりですが、これはSOで行うのが最善ではありませんが、ここに行きます:

古典的なperlmonksノード-Perlの変数スコープ:基本-は頻繁に参照されるリファレンスです:-)

コメントで述べたように、YAPC :: NA 2012でのブルースグレイの講演-my ()の理由は、かなり専門的なperlプログラマーがperlと名前空間に頭を包んだ方法についての良い話です。

myPerlはJavascriptと同等であると人々が説明していると聞きましたvarが、実際には必要ですが、Perlであるperlため、それを行うように主張したり、苦労したりすると、Perlがなくても機能します。

PS:実際にJavaScriptを使用して、私は機能が推測されている使用してのご説明にanalagousな方法で「スコープ」を制御するために使用myしてsubの。

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language