Perl-クイックガイド
Perlは、もともとテキスト操作用に開発された汎用プログラミング言語であり、現在はシステム管理、Web開発、ネットワークプログラミング、GUI開発などの幅広いタスクに使用されています。
Perlとは何ですか?
Perlは、安定したクロスプラットフォームのプログラミング言語です。
Perlは正式には頭字語ではありませんが、 Practical Extraction and Report Language。
これは、公共および民間部門のミッションクリティカルなプロジェクトに使用されます。
Perlはオープンソースソフトウェアであり、ArtisticLicenseまたはGNUGeneral Public License(GPL)の下でライセンスされています。
PerlはLarryWallによって作成されました。
Perl 1.0は、1987年にusenetのalt.comp.sourcesにリリースされました。
このチュートリアルを書いている時点では、perlの最新バージョンは5.16.2でした。
Perlはオックスフォード英語辞典にリストされています。
PC Magazineは、Perlを開発ツールカテゴリの1998年テクニカルエクセレンスアワードのファイナリストとして発表しました。
Perlの機能
Perlは、C、awk、sed、sh、BASICなどの他の言語から最高の機能を取り入れています。
Perlsデータベース統合インターフェースDBIは、Oracle、Sybase、Postgres、MySQLなどのサードパーティデータベースをサポートしています。
Perlは、HTML、XML、およびその他のマークアップ言語で動作します。
PerlはUnicodeをサポートしています。
PerlはY2Kに準拠しています。
Perlは、手続き型プログラミングとオブジェクト指向プログラミングの両方をサポートしています。
Perlは、XSまたはSWIGを介して外部C / C ++ライブラリとインターフェイスします。
Perlは拡張可能です。Comprehensive Perl Archive Network(CPAN)から入手できるサードパーティのモジュールは20,000を超えています。
Perlインタプリタは他のシステムに組み込むことができます。
PerlとWeb
Perlは、そのテキスト操作機能と迅速な開発サイクルにより、最も人気のあるWebプログラミング言語でした。
Perlは「インターネットのダクトテープ」として広く知られています。
Perlは、eコマーストランザクションを含む暗号化されたWebデータを処理できます。
PerlをWebサーバーに組み込んで、処理を最大2000%高速化できます。
Perlのmod_perlを使用すると、ApacheWebサーバーにPerlインタープリターを埋め込むことができます。
PerlのDBIパッケージにより、Webデータベースの統合が容易になります。
Perlは解釈されます
Perlはインタープリター型言語です。つまり、移植性のない実行可能プログラムを作成するコンパイル段階がなくても、コードをそのまま実行できます。
従来のコンパイラは、プログラムを機械語に変換します。Perlプログラムを実行すると、最初にバイトコードにコンパイルされ、次に(プログラムの実行時に)マシン命令に変換されます。したがって、シェル、またはTclとはまったく同じではありません。strictly 中間表現なしで解釈されます。
また、マシンに依存する形式に直接コンパイルされるCまたはC ++のほとんどのバージョンとは異なります。Python、awk、Emacs .elcファイルとともに、その中間にあります。
Perlプログラムを書き始める前に、Perl環境をセットアップする方法を理解しましょう。Perlはさまざまなプラットフォームで利用できます-
- Unix(Solaris、Linux、FreeBSD、AIX、HP / UX、SunOS、IRIXなど)
- 9x / NT / 2000 /に勝つ
- WinCE
- マッキントッシュ(PPC、68K)
- Solaris(x86、SPARC)
- OpenVMS
- アルファ(7.2以降)
- Symbian
- Debian GNU / kFreeBSD
- MirOS BSD
- などなど...
これは、システムにperlがインストールされている可能性が高くなります。$プロンプトで次のコマンドを実行してみてください-
$perl -v
マシンにperlがインストールされている場合は、次のようなメッセージが表示されます。
This is perl 5, version 16, subversion 2 (v5.16.2) built for i686-linux
Copyright 1987-2012, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
perlをまだインストールしていない場合は、次のセクションに進んでください。
Perlインストールの取得
最新および最新のソースコード、バイナリ、ドキュメント、ニュースなどは、Perlの公式Webサイトで入手できます。
Perl Official Website − https://www.perl.org/
次のサイトからPerlのドキュメントをダウンロードできます。
Perl Documentation Website − https://perldoc.perl.org
Perlをインストールする
Perlディストリビューションは、さまざまなプラットフォームで利用できます。プラットフォームに適用可能なバイナリコードのみをダウンロードして、Perlをインストールする必要があります。
プラットフォームのバイナリコードが利用できない場合は、ソースコードを手動でコンパイルするためにCコンパイラが必要です。ソースコードをコンパイルすると、インストールに必要な機能の選択に関してより柔軟になります。
これは、さまざまなプラットフォームへのPerlのインストールの概要です。
UnixおよびLinuxのインストール
Unix / LinuxマシンにPerlをインストールする簡単な手順は次のとおりです。
Webブラウザーを開き、 https://www.perl.org/get.html.
リンクをたどって、Unix / Linuxで利用可能なzip形式のソースコードをダウンロードします。
ダウンロード perl-5.x.y.tar.gz ファイルを作成し、$プロンプトで次のコマンドを発行します。
$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install
NOTE −ここで、$はコマンドを入力するUnixプロンプトです。したがって、上記のコマンドを入力するときに$を入力しないようにしてください。
これにより、Perlが標準の場所/ usr / local / binにインストールされ、そのライブラリが/ usr / local / lib / perlXXにインストールされます。XXは、使用しているPerlのバージョンです。
発行後、ソースコードのコンパイルにはしばらく時間がかかります makeコマンド。インストールが完了したら、発行できますperl -v$プロンプトでコマンドを実行して、perlのインストールを確認します。すべてが正常であれば、上記のようなメッセージが表示されます。
Windowsのインストール
WindowsマシンにPerlをインストールする手順は次のとおりです。
WindowsでのStrawberryPerlインストールのリンクをたどる http://strawberryperl.com
インストールの32ビットまたは64ビットバージョンをダウンロードします。
ダウンロードしたファイルをWindowsエクスプローラーでダブルクリックして実行します。これにより、Perlインストールウィザードが表示されます。これは非常に使いやすいです。デフォルト設定を受け入れ、インストールが完了するまで待つだけで、準備が整います。
Macintoshのインストール
独自のバージョンのPerlをビルドするには、「make」が必要です。これは、通常MacOSインストールDVDに付属しているAppleの開発者ツールの一部です。makeをインストールするために、最新バージョンのXcode(現在は有料)は必要ありません。
Mac OSXマシンにPerlをインストールする簡単な手順は次のとおりです。
Webブラウザーを開き、 https://www.perl.org/get.html。
リンクをたどって、Mac OSXで利用可能なzip形式のソースコードをダウンロードします。
ダウンロード perl-5.x.y.tar.gz ファイルを作成し、$プロンプトで次のコマンドを発行します。
$tar -xzf perl-5.x.y.tar.gz
$cd perl-5.x.y $./Configure -de
$make $make test
$make install
これにより、Perlが標準の場所/ usr / local / binにインストールされ、そのライブラリが/ usr / local / lib / perlXXにインストールされます。XXは、使用しているPerlのバージョンです。
Perlの実行
以下は、Perlを起動するさまざまな方法です。
インタラクティブ通訳
あなたが入ることができます perlコマンドラインから開始して、インタラクティブインタプリタですぐにコーディングを開始します。これは、Unix、DOS、またはコマンドラインインタープリターまたはシェルウィンドウを提供するその他のシステムから実行できます。
$perl -e <perl code> # Unix/Linux
or
C:>perl -e <perl code> # Windows/DOS
使用可能なすべてのコマンドラインオプションのリストは次のとおりです-
シニア番号 | オプションと説明 |
---|---|
1 | -d[:debugger] デバッガーでプログラムを実行します |
2 | -Idirectory @ INC /#includeディレクトリを指定します |
3 | -T 汚染チェックを有効にします |
4 | -t 汚染警告を有効にします |
5 | -U 安全でない操作を許可します |
6 | -w 多くの有用な警告を有効にします |
7 | -W すべての警告を有効にします |
8 | -X すべての警告を無効にします |
9 | -e program プログラムとして送信されたPerlスクリプトを実行します |
10 | file 指定されたファイルからPerlスクリプトを実行します |
コマンドラインからのスクリプト
Perlスクリプトは、perlコードを保持するテキストファイルであり、次のように、アプリケーションでインタープリターを呼び出すことにより、コマンドラインで実行できます。
$perl script.pl # Unix/Linux
or
C:>perl script.pl # Windows/DOS
統合開発環境
Perlは、グラフィカルユーザーインターフェイス(GUI)環境からも実行できます。必要なのは、Perlをサポートするシステム上のGUIアプリケーションだけです。PerlIDEであるPadreをダウンロードできます。Eclipseに精通している場合は、 EclipseプラグインEPIC(PerlエディターおよびIDE for Eclipse)を使用することもできます。
次の章に進む前に、環境が適切にセットアップされ、完全に正常に機能していることを確認してください。環境を適切にセットアップできない場合は、システム管理者の支援を受けることができます。
以降の章に記載されているすべての例は、LinuxのCentOSフレーバーで利用可能なv5.16.2バージョンで実行されています。
Perlは、awk、sed、C、Bourne Shell、Smalltalk、Lisp、さらには英語など、多くの言語から構文と概念を借用しています。ただし、言語間には明確な違いがいくつかあります。この章は、Perlで期待される構文をすばやく理解できるように設計されています。
Perlプログラムは、上から下に実行される一連の宣言とステートメントで構成されています。ループ、サブルーチン、およびその他の制御構造を使用すると、コード内をジャンプできます。すべての単純なステートメントはセミコロン(;)で終了する必要があります。
Perlは自由形式の言語です。好きなようにフォーマットしてインデントすることができます。空白は、構文の重要な部分であるPythonや重要でないFortranのような言語とは異なり、主にトークンを分離するのに役立ちます。
最初のPerlプログラム
インタラクティブモードプログラミング
Perlインタープリターは -eコマンドラインのオプション。コマンドラインからPerlステートメントを実行できます。次のように$プロンプトで何かを試してみましょう-
$perl -e 'print "Hello World\n"'
この実行により、次の結果が生成されます-
Hello, world
スクリプトモードプログラミング
すでに$プロンプトが表示されていると仮定して、viまたはvimエディターを使用してテキストファイルhello.plを開き、ファイル内に次の行を配置します。
#!/usr/bin/perl
# This will print "Hello, World"
print "Hello, world\n";
ここに /usr/bin/perl実際のperlインタプリタバイナリです。スクリプトを実行する前に、必ずスクリプトファイルのモードを変更し、実行権限を付与してください。通常、0755の設定は完全に機能し、最後に上記のスクリプトを次のように実行します。
$chmod 0755 hello.pl $./hello.pl
この実行により、次の結果が生成されます-
Hello, world
関数の引数には括弧を使用することも、個人的な好みに応じて括弧を省略することもできます。それらは、優先順位の問題を明確にするためにたまにしか必要とされません。次の2つのステートメントは、同じ結果を生成します。
print("Hello, world\n");
print "Hello, world\n";
Perlファイル拡張子
Perlスクリプトは、通常のシンプルテキストエディタプログラム内で作成できます。すべてのタイプのプラットフォームで利用できるいくつかのプログラムがあります。プログラマー向けに設計された多くのプログラムがWebからダウンロードできます。
Perlの慣例として、Perlファイルは、機能するPerlスクリプトとして認識されるために、.plまたは.PLファイル拡張子で保存する必要があります。ファイル名には数字、記号、文字を含めることができますが、スペースを含めることはできません。スペースの代わりにアンダースコア(_)を使用します。
Perlでのコメント
プログラミング言語でのコメントは、開発者の友達です。コメントは、プログラムをユーザーフレンドリーにするために使用でき、コード機能に影響を与えることなく、インタープリターによってスキップされます。たとえば、上記のプログラムでは、ハッシュで始まる行# コメントです。
Perlでコメントを言うだけで、ハッシュ記号で始まり、行の終わりまで実行されます-
# This is a comment in perl
=で始まる行は、埋め込みドキュメント(pod)のセクションの開始として解釈され、次の= cutまでの後続のすべての行はコンパイラによって無視されます。以下は例です-
#!/usr/bin/perl
# This is a single line comment
print "Hello, world\n";
=begin comment
This is all part of multiline comment.
You can use as many lines as you like
These comments will be ignored by the
compiler until the next =cut is encountered.
=cut
これにより、次の結果が生成されます-
Hello, world
Perlの空白
Perlプログラムは空白を気にしません。次のプログラムは完全に正常に動作します-
#!/usr/bin/perl
print "Hello, world\n";
ただし、引用符で囲まれた文字列内にスペースがある場合は、そのまま印刷されます。例-
#!/usr/bin/perl
# This would print with a line break in the middle
print "Hello
world\n";
これにより、次の結果が生成されます-
Hello
world
スペース、タブ、改行などのすべてのタイプの空白は、引用符の外で使用される場合、インタープリターと同等です。おそらくコメント付きの空白のみを含む行は空白行と呼ばれ、Perlはそれを完全に無視します。
Perlでの一重引用符と二重引用符
次のように、リテラル文字列を二重引用符または一重引用符で囲むことができます。
#!/usr/bin/perl
print "Hello, world\n";
print 'Hello, world\n';
これにより、次の結果が生成されます-
Hello, world
Hello, world\n$
一重引用符と二重引用符には重要な違いがあります。二重引用符のみinterpolate変数および改行などの特殊文字\ n。一方、一重引用符は変数または特殊文字を補間しません。$ aを変数として使用して値を格納し、後でその値を出力する以下の例を確認してください-
#!/usr/bin/perl
$a = 10; print "Value of a = $a\n";
print 'Value of a = $a\n';
これにより、次の結果が生成されます-
Value of a = 10
Value of a = $a\n$
「ヒア」ドキュメント
複数行のテキストを非常に快適に保存または印刷できます。「ヒア」ドキュメント内の変数を利用することもできます。以下は単純な構文です。<<と識別子の間にスペースがないことを注意深く確認してください。
識別子は、以下でEOFを使用したように、裸の単語または引用されたテキストのいずれかです。識別子が引用されている場合、使用する引用のタイプによって、通常の引用と同様に、ここでの文書内のテキストの処理が決まります。引用符で囲まれていない識別子は、二重引用符のように機能します。
#!/usr/bin/perl
$a = 10;
$var = <<"EOF"; This is the syntax for here document and it will continue until it encounters a EOF in the first line. This is case of double quote so variable value will be interpolated. For example value of a = $a
EOF
print "$var\n"; $var = <<'EOF';
This is case of single quote so variable value will be
interpolated. For example value of a = $a EOF print "$var\n";
これにより、次の結果が生成されます-
This is the syntax for here document and it will continue
until it encounters a EOF in the first line.
This is case of double quote so variable value will be
interpolated. For example value of a = 10
This is case of single quote so variable value will be
interpolated. For example value of a = $a
エスケープ文字
Perlは、バックスラッシュ(\)文字を使用して、コードに干渉する可能性のあるあらゆるタイプの文字をエスケープします。二重引用符と$記号を出力する1つの例を見てみましょう-
#!/usr/bin/perl
$result = "This is \"number\""; print "$result\n";
print "\$result\n";
これにより、次の結果が生成されます-
This is "number"
$result
Perl識別子
Perl識別子は、変数、関数、クラス、モジュール、またはその他のオブジェクトを識別するために使用される名前です。Perl変数名は、$、@、または%のいずれかで始まり、その後に0個以上の文字、アンダースコア、および数字(0から9)が続きます。
Perlは、識別子内に@、$、%などの句読文字を使用できません。Perlはcase sensitiveプログラミング言語。したがって、$Manpower そして $manpower Perlの2つの異なる識別子です。
Perlは緩く型付けされた言語であり、プログラムで使用するときにデータの型を指定する必要はありません。Perlインタープリターは、データ自体のコンテキストに基づいてタイプを選択します。
Perlには、3つの基本的なデータ型があります。スカラー、スカラーの配列、および連想配列とも呼ばれるスカラーのハッシュです。これらのデータ型について少し詳しく説明します。
シニア番号 | タイプと説明 |
---|---|
1 | Scalar スカラーは単純な変数です。それらの前にはドル記号($)が付いています。スカラーは、数値、文字列、または参照のいずれかです。参照は実際には変数のアドレスであり、これについては次の章で説明します。 |
2 | Arrays 配列は、0で始まる数値インデックスでアクセスするスカラーの順序付きリストです。これらの前には「アットマーク」(@)が付いています。 |
3 | Hashes ハッシュは、キーを添え字として使用してアクセスする、順序付けされていないキーと値のペアのセットです。それらの前にはパーセント記号(%)が付いています。 |
数値リテラル
Perlは、すべての数値を符号付き整数または倍精度浮動小数点値として内部に格納します。数値リテラルは、次の浮動小数点形式または整数形式のいずれかで指定されます-
タイプ | 値 |
---|---|
整数 | 1234 |
負の整数 | -100 |
浮動小数点 | 2000年 |
科学的記数法 | 16.12E14 |
16進数 | 0xffff |
オクタル | 0577 |
文字列リテラル
文字列は文字のシーケンスです。これらは通常、一重引用符( ')または二重引用符( ")で区切られた英数字の値であり、一重引用符と二重引用符を使用できるUNIXシェル引用符とほぼ同じように機能します。
二重引用符で囲まれた文字列リテラルでは変数の補間が可能ですが、一重引用符で囲まれた文字列ではできません。バックスラッシュが続く場合は特定の文字があり、特別な意味があり、改行(\ n)やタブ(\ t)のように表すために使用されます。
改行または次のエスケープシーケンスのいずれかを、二重引用符で囲まれた文字列に直接埋め込むことができます-
エスケープシーケンス | 意味 |
---|---|
\\ | バックスラッシュ |
\ ' | 一重引用符 |
\ " | 二重引用符 |
\ a | アラートまたはベル |
\ b | バックスペース |
\ f | フォームフィード |
\ n | 改行 |
\ r | キャリッジリターン |
\ t | 水平タブ |
\ v | 垂直タブ |
\ 0nn | 8進数形式の数値を作成します |
\ xnn | 16進数形式の数値を作成します |
\ cX | 文字を制御します。xは任意の文字です。 |
\ u | 次の文字を大文字に強制します |
\ l | 次の文字を強制的に小文字にする |
\ U | 後続のすべての文字を強制的に大文字にします |
\ L | 後続のすべての文字を強制的に小文字にします |
\ Q | 後続のすべての英数字以外の文字を円記号で囲みます |
\ E | \ U、\ L、または\ Qを終了します |
例
文字列が一重引用符と二重引用符でどのように動作するかをもう一度見てみましょう。ここでは、上記の表に記載されている文字列エスケープを使用し、スカラー変数を使用して文字列値を割り当てます。
#!/usr/bin/perl
# This is case of interpolation.
$str = "Welcome to \ntutorialspoint.com!";
print "$str\n"; # This is case of non-interpolation. $str = 'Welcome to \ntutorialspoint.com!';
print "$str\n"; # Only W will become upper case. $str = "\uwelcome to tutorialspoint.com!";
print "$str\n"; # Whole line will become capital. $str = "\UWelcome to tutorialspoint.com!";
print "$str\n"; # A portion of line will become capital. $str = "Welcome to \Ututorialspoint\E.com!";
print "$str\n"; # Backsalash non alpha-numeric including spaces. $str = "\QWelcome to tutorialspoint's family";
print "$str\n";
これにより、次の結果が生成されます-
Welcome to
tutorialspoint.com!
Welcome to \ntutorialspoint.com!
Welcome to tutorialspoint.com!
WELCOME TO TUTORIALSPOINT.COM!
Welcome to TUTORIALSPOINT.com!
Welcome\ to\ tutorialspoint\'s\ family
変数は、値を格納するために予約されているメモリ位置です。これは、変数を作成するときに、メモリにいくらかのスペースを予約することを意味します。
変数のデータ型に基づいて、インタプリタはメモリを割り当て、予約されたメモリに何を格納できるかを決定します。したがって、変数にさまざまなデータ型を割り当てることにより、これらの変数に整数、小数、または文字列を格納できます。
Perlには次の3つの基本的なデータ型があることを学びました-
- Scalars
- Arrays
- Hashes
したがって、Perlでは3種類の変数を使用します。Ascalar変数の前にはドル記号($)が付き、数値、文字列、または参照のいずれかを格納できます。アンarray変数の前には記号@が付き、スカラーの順序付きリストが格納されます。最後に、Hash 変数の前には記号%が付き、キーと値のペアのセットを格納するために使用されます。
Perlは、すべての変数タイプを個別の名前空間に保持します。したがって、競合を恐れることなく、スカラー変数、配列、またはハッシュに同じ名前を使用できます。これは、$ fooと@fooが2つの異なる変数であることを意味します。
変数の作成
Perl変数は、メモリスペースを予約するために明示的に宣言する必要はありません。変数に値を割り当てると、宣言が自動的に行われます。等号(=)は、変数に値を割り当てるために使用されます。
使用する場合は、使用する前に変数を宣言する必要があることに注意してください use strict 私たちのプログラムの声明。
=演算子の左側のオペランドは変数の名前であり、=演算子の右側のオペランドは変数に格納されている値です。例-
$age = 25; # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50; # A floating point
ここで、25、「John Paul」、および1445.50は、それぞれ$ age、$ name、および$ salary変数に割り当てられた値です。間もなく、配列とハッシュに値を割り当てる方法を説明します。
スカラー変数
スカラーは単一のデータ単位です。そのデータは、整数、浮動小数点、文字、文字列、段落、またはWebページ全体である可能性があります。何でもかまいませんが、たった1つのことです。
スカラー変数を使用する簡単な例を次に示します-
#!/usr/bin/perl
$age = 25; # An integer assignment
$name = "John Paul"; # A string $salary = 1445.50; # A floating point
print "Age = $age\n"; print "Name = $name\n";
print "Salary = $salary\n";
これにより、次の結果が生成されます-
Age = 25
Name = John Paul
Salary = 1445.5
配列変数
配列は、スカラー値の順序付きリストを格納する変数です。配列変数の前には「アットマーク」(@)記号が付いています。配列の単一の要素を参照するには、ドル記号($)を使用し、変数名の後に角括弧で囲まれた要素のインデックスを付けます。
配列変数を使用する簡単な例を次に示します-
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "\$ages[0] = $ages[0]\n";
print "\$ages[1] = $ages[1]\n";
print "\$ages[2] = $ages[2]\n";
print "\$names[0] = $names[0]\n";
print "\$names[1] = $names[1]\n";
print "\$names[2] = $names[2]\n";
ここでは、$記号の前にエスケープ記号(\)を使用して印刷しました。他のPerlはそれを変数として理解し、その値を出力します。実行すると、次の結果が生成されます-
$ages[0] = 25
$ages[1] = 30 $ages[2] = 40
$names[0] = John Paul $names[1] = Lisa
$names[2] = Kumar
ハッシュ変数
ハッシュはのセットです key/valueペア。ハッシュ変数の前にはパーセント(%)記号が付いています。ハッシュの単一の要素を参照するには、ハッシュ変数名の後に中括弧内の値に関連付けられた「キー」を使用します。
ハッシュ変数を使用する簡単な例を次に示します-
#!/usr/bin/perl
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";
これにより、次の結果が生成されます-
$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40
可変コンテキスト
Perlは、コンテキスト、つまり変数が使用されている状況に基づいて、同じ変数を異なる方法で処理します。次の例を確認してみましょう-
#!/usr/bin/perl
@names = ('John Paul', 'Lisa', 'Kumar');
@copy = @names;
$size = @names; print "Given names are : @copy\n"; print "Number of names are : $size\n";
これにより、次の結果が生成されます-
Given names are : John Paul Lisa Kumar
Number of names are : 3
ここで、@ namesは配列であり、2つの異なるコンテキストで使用されています。最初にそれを他の配列、つまりリストにコピーしたので、コンテキストがリストコンテキストであると仮定してすべての要素を返しました。次に、同じ配列を使用して、この配列をスカラーに格納しようとしたため、この場合、コンテキストがスカラーコンテキストであると想定して、この配列内の要素の数だけが返されました。次の表に、さまざまなコンテキストを示します-
シニア番号 | コンテキストと説明 |
---|---|
1 | Scalar スカラー変数への割り当ては、スカラーコンテキストの右側を評価します。 |
2 | List 配列またはハッシュへの割り当ては、リストコンテキストの右側を評価します。 |
3 | Boolean ブールコンテキストは、式が真であるか偽であるかを確認するために式が評価されている場所です。 |
4 | Void このコンテキストは、戻り値が何であるかを気にしないだけでなく、戻り値も必要としません。 |
5 | Interpolative このコンテキストは、引用符、または引用符のように機能するものの内部でのみ発生します。 |
スカラーは単一のデータ単位です。そのデータは、整数、浮動小数点、文字、文字列、段落、またはWebページ全体である可能性があります。
スカラー変数を使用する簡単な例を次に示します-
#!/usr/bin/perl
$age = 25; # An integer assignment $name = "John Paul"; # A string
$salary = 1445.50; # A floating point print "Age = $age\n";
print "Name = $name\n"; print "Salary = $salary\n";
これにより、次の結果が生成されます-
Age = 25
Name = John Paul
Salary = 1445.5
数値スカラー
スカラーは、ほとんどの場合、数値または文字列です。次の例は、さまざまなタイプの数値スカラーの使用法を示しています。
#!/usr/bin/perl
$integer = 200; $negative = -300;
$floating = 200.340; $bigfloat = -1.2E-23;
# 377 octal, same as 255 decimal
$octal = 0377; # FF hex, also 255 decimal $hexa = 0xff;
print "integer = $integer\n"; print "negative = $negative\n";
print "floating = $floating\n"; print "bigfloat = $bigfloat\n";
print "octal = $octal\n"; print "hexa = $hexa\n";
これにより、次の結果が生成されます-
integer = 200
negative = -300
floating = 200.34
bigfloat = -1.2e-23
octal = 255
hexa = 255
文字列スカラー
次の例は、さまざまなタイプの文字列スカラーの使用法を示しています。一重引用符で囲まれた文字列と二重引用符で囲まれた文字列の違いに注意してください-
#!/usr/bin/perl
$var = "This is string scalar!"; $quote = 'I m inside single quote - $var'; $double = "This is inside single quote - $var"; $escape = "This example of escape -\tHello, World!";
print "var = $var\n"; print "quote = $quote\n";
print "double = $double\n"; print "escape = $escape\n";
これにより、次の結果が生成されます-
var = This is string scalar!
quote = I m inside single quote - $var
double = This is inside single quote - This is string scalar!
escape = This example of escape - Hello, World
スカラー演算
別の章でPerlで使用できるさまざまな演算子の詳細を確認しますが、ここではいくつかの数値操作と文字列操作をリストします。
#!/usr/bin/perl
$str = "hello" . "world"; # Concatenates strings.
$num = 5 + 10; # adds two numbers. $mul = 4 * 5; # multiplies two numbers.
$mix = $str . $num; # concatenates string and number. print "str = $str\n";
print "num = $num\n"; print "mix = $mix\n";
これにより、次の結果が生成されます-
str = helloworld
num = 15
mul = 20
mix = helloworld15
複数行の文字列
プログラムに複数行の文字列を導入する場合は、次のように標準の一重引用符を使用できます。
#!/usr/bin/perl
$string = 'This is a multiline string'; print "$string\n";
これにより、次の結果が生成されます-
This is
a multiline
string
「ヒア」ドキュメント構文を使用して、以下のように複数行を保存または印刷することもできます。
#!/usr/bin/perl
print <<EOF;
This is
a multiline
string
EOF
これも同じ結果になります-
This is
a multiline
string
V弦
v1.20.300.4000の形式のリテラルは、指定された序数を持つ文字で構成される文字列として解析されます。この形式はv文字列として知られています。
v-stringは、「\ x {1} \ x {14} \ x {12c} \ x {fa0}」というやや読みにくい補間形式を使用するのではなく、文字列を作成するための代替のより読みやすい方法を提供します。
これらは、avで始まり、その後に1つ以上のドット区切りの要素が続くリテラルです。例-
#!/usr/bin/perl
$smile = v9786; $foo = v102.111.111;
$martin = v77.97.114.116.105.110; print "smile = $smile\n";
print "foo = $foo\n"; print "martin = $martin\n";
これも同じ結果になります-
smile = ☺
foo = foo
martin = Martin
Wide character in print at main.pl line 7.
特別なリテラル
これまでのところ、文字列スカラーとその連結および補間操作について理解している必要があります。それでは、3つの特別なリテラル__FILE __、__ LINE__、および__PACKAGE__が、プログラムのその時点での現在のファイル名、行番号、およびパッケージ名を表していることを説明します。
これらは個別のトークンとしてのみ使用でき、文字列に補間されることはありません。以下の例を確認してください-
#!/usr/bin/perl
print "File name ". __FILE__ . "\n";
print "Line Number " . __LINE__ ."\n";
print "Package " . __PACKAGE__ ."\n";
# they can not be interpolated
print "__FILE__ __LINE__ __PACKAGE__\n";
これにより、次の結果が生成されます-
File name hello.pl
Line Number 4
Package main
__FILE__ __LINE__ __PACKAGE__
配列は、スカラー値の順序付きリストを格納する変数です。配列変数の前には「アットマーク」(@)記号が付いています。配列の単一の要素を参照するには、ドル記号($)を使用し、変数名の後に角括弧で囲まれた要素のインデックスを付けます。
配列変数を使用する簡単な例を次に示します-
#!/usr/bin/perl
@ages = (25, 30, 40);
@names = ("John Paul", "Lisa", "Kumar");
print "\$ages[0] = $ages[0]\n"; print "\$ages[1] = $ages[1]\n"; print "\$ages[2] = $ages[2]\n"; print "\$names[0] = $names[0]\n"; print "\$names[1] = $names[1]\n"; print "\$names[2] = $names[2]\n";
ここでは、$記号の前にエスケープ記号(\)を使用して印刷しています。他のPerlはそれを変数として理解し、その値を出力します。実行すると、次の結果が生成されます-
$ages[0] = 25 $ages[1] = 30
$ages[2] = 40 $names[0] = John Paul
$names[1] = Lisa $names[2] = Kumar
Perlでは、リストと配列の用語は、交換可能であるかのように使用されることがよくあります。ただし、リストはデータであり、配列は変数です。
アレイの作成
配列変数の前には@記号が付き、括弧またはqw演算子を使用して入力されます。例-
@array = (1, 2, 'Hello');
@array = qw/This is an array/;
2行目では、qw //演算子を使用しています。この演算子は、区切られた文字列を空白で区切って文字列のリストを返します。この例では、これにより4要素の配列になります。最初の要素は「this」で、最後(4番目)は「array」です。これは、次のように異なる行を使用できることを意味します-
@days = qw/Monday
Tuesday
...
Sunday/;
次のように各値を個別に割り当てることで、配列にデータを入力することもできます。
$array[0] = 'Monday'; ... $array[6] = 'Sunday';
配列要素へのアクセス
配列から個々の要素にアクセスするときは、変数の前にドル記号($)を付けてから、変数名の後に角括弧内の要素インデックスを追加する必要があります。例-
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
print "$days[0]\n";
print "$days[1]\n"; print "$days[2]\n";
print "$days[6]\n"; print "$days[-1]\n";
print "$days[-7]\n";
これにより、次の結果が生成されます-
Mon
Tue
Wed
Sun
Sun
Mon
配列のインデックスはゼロから始まるため、最初の要素にアクセスするには、インデックスとして0を指定する必要があります。負のインデックスを指定することもできます。その場合、配列の最初ではなく最後から要素を選択します。これは次のことを意味します-
print $days[-1]; # outputs Sun
print $days[-7]; # outputs Mon
連番配列
Perlは、連番と文字のショートカットを提供します。たとえば、100まで数えるときに各要素を入力するのではなく、次のようにすることができます。
#!/usr/bin/perl
@var_10 = (1..10);
@var_20 = (10..20);
@var_abc = (a..z);
print "@var_10\n"; # Prints number from 1 to 10
print "@var_20\n"; # Prints number from 10 to 20
print "@var_abc\n"; # Prints number from a to z
ここでは二重ドット(..)は range operator。これにより、次の結果が生成されます-
1 2 3 4 5 6 7 8 9 10
10 11 12 13 14 15 16 17 18 19 20
a b c d e f g h i j k l m n o p q r s t u v w x y z
配列サイズ
配列のサイズは、配列のスカラーコンテキストを使用して決定できます-戻り値は配列内の要素の数になります-
@array = (1,2,3);
print "Size: ",scalar @array,"\n";
返される値は、有効な要素の数ではなく、常に配列の物理サイズになります。これを実証できます。このフラグメントを使用したスカラー@arrayと$#arrayの違いは次のとおりです。
#!/usr/bin/perl
@array = (1,2,3);
$array[50] = 4; $size = @array;
$max_index = $#array;
print "Size: $size\n"; print "Max Index: $max_index\n";
これにより、次の結果が生成されます-
Size: 51
Max Index: 50
配列には情報を含む要素が4つしかありませんが、配列の長さは51要素で、最高のインデックスは50です。
配列内の要素の追加と削除
Perlには、配列内の要素を追加および削除するための便利な関数がいくつか用意されています。関数とは何か疑問があるかもしれません。これまでに使用したprintさまざまな値を出力する関数。同様に、他のさまざまな機能、またはサブルーチンと呼ばれることもあり、他のさまざまな機能に使用できます。
シニア番号 | タイプと説明 |
---|---|
1 | push @ARRAY, LIST リストの値を配列の最後にプッシュします。 |
2 | pop @ARRAY ポップオフして、配列の最後の値を返します。 |
3 | shift @ARRAY 配列の最初の値をオフにシフトして返し、配列を1短くして、すべてを下に移動します。 |
4 | unshift @ARRAY, LIST リストを配列の先頭に付加し、新しい配列の要素数を返します。 |
#!/usr/bin/perl
# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \@coins = @coins\n";
# add one element at the end of the array
push(@coins, "Penny");
print "2. \@coins = @coins\n";
# add one element at the beginning of the array
unshift(@coins, "Dollar");
print "3. \@coins = @coins\n";
# remove one element from the last of the array.
pop(@coins);
print "4. \@coins = @coins\n";
# remove one element from the beginning of the array.
shift(@coins);
print "5. \@coins = @coins\n";
これにより、次の結果が生成されます-
1. @coins = Quarter Dime Nickel
2. @coins = Quarter Dime Nickel Penny
3. @coins = Dollar Quarter Dime Nickel Penny
4. @coins = Dollar Quarter Dime Nickel
5. @coins = Quarter Dime Nickel
配列要素のスライス
配列から「スライス」を抽出することもできます。つまり、配列から複数のアイテムを選択して、別の配列を生成することもできます。
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3,4,5];
print "@weekdays\n";
これにより、次の結果が生成されます-
Thu Fri Sat
スライスの仕様には、正または負の有効なインデックスのリストがあり、それぞれがコンマで区切られている必要があります。速度については、.. 範囲演算子-
#!/usr/bin/perl
@days = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @days[3..5];
print "@weekdays\n";
これにより、次の結果が生成されます-
Thu Fri Sat
配列要素の置き換え
次に、というもう1つの関数を紹介します。 splice()、次の構文があります-
splice @ARRAY, OFFSET [ , LENGTH [ , LIST ] ]
この関数は、OFFSETおよびLENGTHで指定された@ARRAYの要素を削除し、指定されている場合はそれらをLISTに置き換えます。最後に、配列から削除された要素を返します。以下は例です-
#!/usr/bin/perl
@nums = (1..20);
print "Before - @nums\n";
splice(@nums, 5, 5, 21..25);
print "After - @nums\n";
これにより、次の結果が生成されます-
Before - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
After - 1 2 3 4 5 21 22 23 24 25 11 12 13 14 15 16 17 18 19 20
ここで、実際の置換は6番目の番号から始まり、その後5つの要素が6から10に番号21、22、23、24、および25に置き換えられます。
文字列を配列に変換する
と呼ばれるもう1つの関数を調べてみましょう split()、次の構文があります-
split [ PATTERN [ , EXPR [ , LIMIT ] ] ]
この関数は、文字列を文字列の配列に分割して返します。LIMITが指定されている場合、最大でその数のフィールドに分割されます。PATTERNを省略すると、空白で分割されます。以下は例です-
#!/usr/bin/perl
# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";
# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);
print "$string[3]\n"; # This will print Roses print "$names[4]\n"; # This will print Michael
これにより、次の結果が生成されます-
Roses
Michael
配列を文字列に変換する
使用できます join()配列要素を再結合し、1つの長いスカラー文字列を形成する関数。この関数の構文は次のとおりです-
join EXPR, LIST
この関数は、LISTの個別の文字列を、EXPRの値で区切られたフィールドを持つ単一の文字列に結合し、その文字列を返します。以下は例です-
#!/usr/bin/perl
# define Strings
$var_string = "Rain-Drops-On-Roses-And-Whiskers-On-Kittens"; $var_names = "Larry,David,Roger,Ken,Michael,Tom";
# transform above strings into arrays.
@string = split('-', $var_string); @names = split(',', $var_names);
$string1 = join( '-', @string ); $string2 = join( ',', @names );
print "$string1\n"; print "$string2\n";
これにより、次の結果が生成されます-
Rain-Drops-On-Roses-And-Whiskers-On-Kittens
Larry,David,Roger,Ken,Michael,Tom
配列の並べ替え
ザ・ sort()関数は、ASCII数値標準に従って配列の各要素をソートします。この関数の構文は次のとおりです-
sort [ SUBROUTINE ] LIST
この関数は、LISTをソートし、ソートされた配列値を返します。SUBROUTINEが指定されている場合、要素のソート中にSUBTROUTINE内の指定されたロジックが適用されます。
#!/usr/bin/perl
# define an array
@foods = qw(pizza steak chicken burgers);
print "Before: @foods\n";
# sort this array
@foods = sort(@foods);
print "After: @foods\n";
これにより、次の結果が生成されます-
Before: pizza steak chicken burgers
After: burgers chicken pizza steak
ソートは単語のASCII数値に基づいて実行されることに注意してください。したがって、最良のオプションは、最初に配列のすべての要素を小文字に変換してから、ソート機能を実行することです。
配列のマージ
配列は単なるコンマ区切りの値のシーケンスであるため、以下に示すようにそれらを組み合わせることができます。
#!/usr/bin/perl
@numbers = (1,3,(4,5,6));
print "numbers = @numbers\n";
これにより、次の結果が生成されます-
numbers = 1 3 4 5 6
埋め込まれた配列は、以下に示すように、メイン配列の一部になります。
#!/usr/bin/perl
@odd = (1,3,5);
@even = (2, 4, 6);
@numbers = (@odd, @even);
print "numbers = @numbers\n";
これにより、次の結果が生成されます-
numbers = 1 3 5 2 4 6
リストから要素を選択する
リストの表記は、配列の表記と同じです。リストに角かっこを追加し、1つ以上のインデックスを指定することで、配列から要素を抽出できます。
#!/usr/bin/perl
$var = (5,4,3,2,1)[4]; print "value of var = $var\n"
これにより、次の結果が生成されます-
value of var = 1
同様に、先頭の@文字は必要ありませんが、スライスを抽出できます。
#!/usr/bin/perl
@list = (5,4,3,2,1)[1..3];
print "Value of list = @list\n";
これにより、次の結果が生成されます-
Value of list = 4 3 2
ハッシュはのセットです key/valueペア。ハッシュ変数の前にはパーセント(%)記号が付いています。ハッシュの単一の要素を参照するには、ハッシュ変数名の前に「$」記号を付け、その後に中括弧内の値に関連付けられた「キー」を使用します。
ハッシュ変数を使用する簡単な例を次に示します-
#!/usr/bin/perl
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
print "\$data{'John Paul'} = $data{'John Paul'}\n"; print "\$data{'Lisa'} = $data{'Lisa'}\n"; print "\$data{'Kumar'} = $data{'Kumar'}\n";
これにより、次の結果が生成されます-
$data{'John Paul'} = 45
$data{'Lisa'} = 30 $data{'Kumar'} = 40
ハッシュの作成
ハッシュは、次の2つの方法のいずれかで作成されます。最初の方法では、名前付きキーに1つずつ値を割り当てます-
$data{'John Paul'} = 45; $data{'Lisa'} = 30;
$data{'Kumar'} = 40;
2番目のケースでは、リストから個々のペアを取得することによって変換されるリストを使用します。ペアの最初の要素がキーとして使用され、2番目の要素が値として使用されます。例-
%data = ('John Paul', 45, 'Lisa', 30, 'Kumar', 40);
わかりやすくするために、=>をのエイリアスとして使用して、キーと値のペアを次のように示すことができます。
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
上記のフォームのもう1つの変形を示します。これを見てください。ここでは、すべてのキーの前にハイフン(-)が付いており、引用符は不要です-
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
ただし、1つの単語があることに注意することが重要です。つまり、スペースなしのキーはこの形式のハッシュ形成で使用されており、この方法でハッシュを構築すると、以下に示すようにハイフンのみを使用してキーにアクセスします。
$val = %data{-JohnPaul}
$val = %data{-Lisa}
ハッシュ要素へのアクセス
ハッシュから個々の要素にアクセスするときは、変数の前にドル記号($)を付けてから、変数名の後に中括弧内に要素キーを追加する必要があります。例-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
print "$data{'John Paul'}\n"; print "$data{'Lisa'}\n";
print "$data{'Kumar'}\n";
これにより、次の結果が生成されます-
45
30
40
スライスの抽出
配列からスライスを抽出するのと同じように、ハッシュのスライスを抽出できます。戻り値は値のリストになるため、変数に@プレフィックスを使用して戻り値を格納する必要があります-
#!/uer/bin/perl
%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);
@array = @data{-JohnPaul, -Lisa};
print "Array : @array\n";
これにより、次の結果が生成されます-
Array : 45 30
キーと値の抽出
を使用して、ハッシュからすべてのキーのリストを取得できます。 keys 次の構文を持つ関数-
keys %HASH
この関数は、指定されたハッシュのすべてのキーの配列を返します。以下は例です-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@names = keys %data;
print "$names[0]\n";
print "$names[1]\n"; print "$names[2]\n";
これにより、次の結果が生成されます-
Lisa
John Paul
Kumar
同様に、あなたは使用することができます valuesすべての値のリストを取得する関数。この関数の構文は次のとおりです-
values %HASH
この関数は、指定されたハッシュのすべての値で構成される通常の配列を返します。以下は例です-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@ages = values %data;
print "$ages[0]\n"; print "$ages[1]\n";
print "$ages[2]\n";
これにより、次の結果が生成されます-
30
45
40
存在の確認
存在しないハッシュからキーと値のペアにアクセスしようとすると、通常は次のようになります。 undefined値であり、警告がオンになっている場合は、実行時に警告が生成されます。これを回避するには、exists 名前付きキーが存在する場合、その値が何であるかに関係なく、trueを返す関数。
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
if( exists($data{'Lisa'} ) ) {
print "Lisa is $data{'Lisa'} years old\n";
} else {
print "I don't know age of Lisa\n";
}
ここでは、IF ... ELSEステートメントを紹介しました。これについては、別の章で学習します。今のところ、あなたはただそれを仮定しますif( condition ) パーツは、指定された条件が真の場合にのみ実行されます。 else一部が実行されます。したがって、上記のプログラムを実行すると、次の結果が生成されます。これは、ここで指定された条件が存在するためです($ data {'Lisa'}はtrueを返します-
Lisa is 30 years old
ハッシュサイズの取得
キーまたは値のいずれかでスカラーコンテキストを使用することにより、サイズ、つまりハッシュからの要素の数を取得できます。最初にキーまたは値のいずれかの配列を取得する必要があると言うだけで、次のように配列のサイズを取得できます-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";
@values = values %data;
$size = @values; print "2 - Hash size: is $size\n";
これにより、次の結果が生成されます-
1 - Hash size: is 3
2 - Hash size: is 3
ハッシュ内の要素の追加と削除
新しいキーと値のペアの追加は、単純な代入演算子を使用して1行のコードで実行できます。ただし、ハッシュから要素を削除するには、使用する必要がありますdelete 以下の例のように機能します-
#!/usr/bin/perl
%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
@keys = keys %data;
$size = @keys; print "1 - Hash size: is $size\n";
# adding an element to the hash;
$data{'Ali'} = 55; @keys = keys %data; $size = @keys;
print "2 - Hash size: is $size\n"; # delete the same element from the hash; delete $data{'Ali'};
@keys = keys %data;
$size = @keys; print "3 - Hash size: is $size\n";
これにより、次の結果が生成されます-
1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3
Perl条件ステートメントは意思決定に役立ちます。意思決定では、プログラマーがプログラムによって評価またはテストされる1つ以上の条件と、条件が真であると判断された場合に実行される1つまたは複数のステートメントを指定する必要があります。条件がfalseであると判断された場合に実行されるステートメント。
以下は、ほとんどのプログラミング言語に見られる典型的な意思決定構造の一般的なものです。
数値0、文字列「0」と「」、空のリスト()、およびundefはすべて false ブールコンテキストで、他のすべての値は true。による真の値の否定! または not 特別なfalse値を返します。
Perlプログラミング言語は、次のタイプの条件文を提供します。
シニア番号 | ステートメントと説明 |
---|---|
1 | ifステートメント アン if statement ブール式とそれに続く1つ以上のステートメントで構成されます。 |
2 | if ... elseステートメント アン if statement オプションの後に続くことができます else statement。 |
3 | if ... elsif ... elseステートメント アン if statement オプションの後に続くことができます elsif statement その後、オプションで else statement。 |
4 | ステートメントでない限り アン unless statement ブール式とそれに続く1つ以上のステートメントで構成されます。 |
5 | そうでなければ...他のステートメント アン unless statement オプションの後に続くことができます else statement。 |
6 | そうでなければ... elsif..elseステートメント アン unless statement オプションの後に続くことができます elsif statement その後、オプションで else statement。 |
7 | switchステートメント 最新バージョンのPerlを使用すると、 switchステートメント。これにより、変数値をさまざまな条件と比較する簡単な方法が可能になります。 |
?:オペレーター
確認してみましょう conditional operator ? :置き換えるために使用することができます if...elseステートメント。それは次の一般的な形式を持っています-
Exp1 ? Exp2 : Exp3;
ここで、Exp1、Exp2、およびExp3は式です。コロンの使用と配置に注意してください。
?の値 式は次のように決定されます。Exp1が評価されます。trueの場合、Exp2が評価され、?全体の値になります。式。Exp1がfalseの場合、Exp3が評価され、その値が式の値になります。以下は、この演算子を使用した簡単な例です。
#!/usr/local/bin/perl
$name = "Ali"; $age = 10;
$status = ($age > 60 )? "A senior citizen" : "Not a senior citizen";
print "$name is - $status\n";
これにより、次の結果が生成されます-
Ali is - Not a senior citizen
コードのブロックを数回実行する必要がある場合があります。一般に、ステートメントは順番に実行されます。関数の最初のステートメントが最初に実行され、次に2番目のステートメントが実行されます。
プログラミング言語は、より複雑な実行パスを可能にするさまざまな制御構造を提供します。
ループステートメントを使用すると、ステートメントまたはステートメントのグループを複数回実行できます。以下は、ほとんどのプログラミング言語でのループステートメントの一般的な形式です。
Perlプログラミング言語は、ループ要件を処理するために次のタイプのループを提供します。
シニア番号 | ループの種類と説明 |
---|---|
1 | whileループ 指定された条件が真である間、ステートメントまたはステートメントのグループを繰り返します。ループ本体を実行する前に条件をテストします。 |
2 | ループまで 指定された条件が真になるまで、ステートメントまたはステートメントのグループを繰り返します。ループ本体を実行する前に条件をテストします。 |
3 | forループ 一連のステートメントを複数回実行し、ループ変数を管理するコードを省略します。 |
4 | foreachループ foreachループは、通常のリスト値を反復処理し、変数VARをリストの各要素に順番に設定します。 |
5 | do ... whileループ whileステートメントと同様ですが、ループ本体の最後で条件をテストする点が異なります。 |
6 | ネストされたループ 1つ以上のループを別のwhile、for、またはdo..whileループ内で使用できます。 |
ループ制御ステートメント
ループ制御ステートメントは、実行を通常のシーケンスから変更します。実行がスコープを離れると、そのスコープで作成されたすべての自動オブジェクトが破棄されます。
Perlは、次の制御ステートメントをサポートしています。詳細を確認するには、次のリンクをクリックしてください。
シニア番号 | 制御ステートメントと説明 |
---|---|
1 | 次のステートメント ループに本体の残りの部分をスキップさせ、繰り返す前にすぐにその状態を再テストします。 |
2 | 最後のステートメント ループステートメントを終了し、ループの直後のステートメントに実行を転送します。 |
3 | ステートメントを続ける 継続ブロック。条件が再度評価される直前に常に実行されます。 |
4 | やり直しステートメント redoコマンドは、条件を再度評価せずにループブロックを再開します。継続ブロックがある場合は、実行されません。 |
5 | gotoステートメント Perlは、goto label、goto expr、およびgoto&nameの3つの形式のgotoコマンドをサポートしています。 |
無限ループ
条件がfalseにならない場合、ループは無限ループになります。ザ・forループは伝統的にこの目的のために使用されます。を形成する3つの式のどれもfor ループが必要な場合は、条件式を空のままにして無限ループを作成できます。
#!/usr/local/bin/perl
for( ; ; ) {
printf "This loop will run forever.\n";
}
Ctrl + Cキーを押すと、上記の無限ループを終了できます。
条件式がない場合は、trueと見なされます。初期化とインクリメントの式があるかもしれませんが、プログラマーとしては、より一般的にはfor(;;)構文を使用して無限ループを示します。
演算子とは何ですか?
4 +5は9に等しいという式を使用して簡単な答えを与えることができます。ここで、4と5はオペランドと呼ばれ、+は演算子と呼ばれます。Perl言語は多くの演算子タイプをサポートしていますが、以下は重要で最も頻繁に使用される演算子のリストです-
- 算術演算子
- 等式演算子
- 論理演算子
- 代入演算子
- ビット演算子
- 論理演算子
- 引用のような演算子
- その他の演算子
すべての演算子を1つずつ見ていきましょう。
Perl算術演算子
変数を想定 $a holds 10 and variable $bは20を保持し、Perlの算術演算子は次のとおりです。
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | + ( Addition ) 演算子のいずれかの側に値を追加します Example − $a + $bは30を与えます |
2 | - (Subtraction) 左側のオペランドから右側のオペランドを減算します Example − $a - $bは-10を与えます |
3 | * (Multiplication) 演算子のいずれかの側で値を乗算します Example − $a * $bは200を与えます |
4 | / (Division) 左側のオペランドを右側のオペランドで除算します Example − $b / $aは2を与えます |
5 | % (Modulus) 左側のオペランドを右側のオペランドで除算し、余りを返します Example − $b % $aは0を与えます |
6 | ** (Exponent) 演算子の指数(パワー)計算を実行します Example − $a**$bは20の累乗に10を与えます |
Perlの等式演算子
これらは関係演算子とも呼ばれます。変数を想定$a holds 10 and variable $bは20を保持し、次の数値等式演算子をチェックします-
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | == (equal to) 2つのオペランドの値が等しいかどうかをチェックし、等しい場合は条件が真になります。 Example −($a == $b)真実ではない。 |
2 | != (not equal to) 2つのオペランドの値が等しいかどうかをチェックし、値が等しくない場合は条件が真になります。 Example −($a != $b)正しい。 |
3 | <=> 2つのオペランドの値が等しいかどうかをチェックし、左の引数が右の引数よりも数値的に小さいか、等しいか、大きいかに応じて、-1、0、または1を返します。 Example −($a <=> $b)-1を返します。 |
4 | > (greater than) 左のオペランドの値が右のオペランドの値より大きいかどうかを確認します。大きい場合は、条件が真になります。 Example −($a > $b)真実ではない。 |
5 | < (less than) 左のオペランドの値が右のオペランドの値よりも小さいかどうかを確認します。小さい場合は、条件が真になります。 Example −($a < $b)正しい。 |
6 | >= (greater than or equal to) 左のオペランドの値が右のオペランドの値以上であるかどうかをチェックします。はいの場合、条件は真になります。 Example −($a >= $b)真実ではない。 |
7 | <= (less than or equal to) 左のオペランドの値が右のオペランドの値以下であるかどうかをチェックします。はいの場合、条件は真になります。 Example −($a <= $b)正しい。 |
以下は、エクイティオペレーターのリストです。変数を想定$a holds "abc" and variable $bは「xyz」を保持しているので、次の文字列等価演算子をチェックしましょう-
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | lt 左の引数が右の引数より文字列的に小さい場合はtrueを返します。 Example −($a lt $b)正しい。 |
2 | gt 左の引数が右の引数より文字列的に大きい場合はtrueを返します。 Example −($a gt $b)は誤りです。 |
3 | le 左の引数が文字通り右の引数以下の場合にtrueを返します。 Example −($a le $b)正しい。 |
4 | ge 左の引数が右の引数以上の文字列の場合にtrueを返します。 Example −($a ge $b)は誤りです。 |
5 | eq 左の引数が文字通り右の引数と等しい場合にtrueを返します。 Example −($a eq $b)は誤りです。 |
6 | ne 左の引数が文字列的に右の引数と等しくない場合はtrueを返します。 Example −($a ne $b)正しい。 |
7 | cmp 左の引数が文字列的に右の引数よりも小さいか、等しいか、大きいかに応じて、-1、0、または1を返します。 Example −($a cmp $b)は-1です。 |
Perl代入演算子
変数を想定 $a holds 10 and variable $bは20を保持し、Perlで使用可能な代入演算子とその使用法を以下に示します-
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | = 単純な代入演算子、右側のオペランドから左側のオペランドに値を代入します Example − $c = $+ $b will assigned value of $+ $b into $c |
2 | += AND代入演算子を追加します。これは、右のオペランドを左のオペランドに追加し、結果を左のオペランドに割り当てます。 Example − $c += $aはと同等です $c = $c + $ a |
3 | -= AND代入演算子を減算します。左オペランドから右オペランドを減算し、その結果を左オペランドに代入します。 Example − $ c- = $a is equivalent to $c = $c - $a |
4 | *= 乗算AND代入演算子。右のオペランドと左のオペランドを乗算し、その結果を左のオペランドに代入します。 Example − $c *= $aはと同等です $c = $c * $ a |
5 | /= AND代入演算子を除算します。左オペランドを右オペランドで除算し、結果を左オペランドに代入します。 Example − $ c / = $a is equivalent to $c = $c / $a |
6 | %= モジュラスAND代入演算子。2つのオペランドを使用してモジュラスを取り、その結果を左側のオペランドに割り当てます。 Example − $c %= $aはと同等です $c = $c%a |
7 | **= 指数AND代入演算子、演算子に対して指数(累乗)計算を実行し、左側のオペランドに値を割り当てます Example − $c **= $aはと同等です $c = $c ** $ a |
Perlビット演算子
ビット単位の演算子はビットを処理し、ビットごとの演算を実行します。$ a = 60の場合を想定します。および$ b = 13; バイナリ形式では、次のようになります-
$ a = 0011 1100
$ b = 0000 1101
-----------------
$ a&$ b = 0000 1100
$ a | $ b = 0011 1101
$ a ^ $ b = 0011 0001
〜$ a = 1100 0011
Perl言語でサポートされている次のビット演算子があります。 $a = 60; and $b = 13
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | & バイナリAND演算子は、両方のオペランドに存在する場合、結果にビットをコピーします。 Example −($a & $b)00001100である12を与えます |
2 | | バイナリOR演算子は、イーザーオペランドに存在する場合、ビットをコピーします。 Example −($a | $b)00111101である61を与える |
3 | ^ バイナリXOR演算子は、ビットが両方ではなく一方のオペランドに設定されている場合、そのビットをコピーします。 Example −($a ^ $b)00110001である49を与える |
4 | ~ Binary Ones Complement Operatorは単項であり、「フリッピング」ビットの効果があります。 Example −(〜$ a)は、符号付き2進数のため、2の補数形式で11000011である-61を返します。 |
5 | << バイナリ左シフト演算子。左のオペランドの値は、右のオペランドで指定されたビット数だけ左に移動します。 Example − $ a << 2は、11110000である240を返します。 |
6 | >> バイナリ右シフト演算子。左のオペランドの値は、右のオペランドで指定されたビット数だけ右に移動します。 Example − $ a >> 2は15を与え、これは00001111です。 |
Perl論理演算子
Perl言語でサポートされている論理演算子は次のとおりです。変数$ aが真であり、変数$ bが偽であると仮定すると、−
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | and 論理AND演算子と呼ばれます。両方のオペランドが真の場合、条件は真になります。 Example −($ aおよび$ b)はfalseです。 |
2 | && Cスタイルの論理AND演算子は、両方のオペランドにビットが存在する場合、結果にビットをコピーします。 Example −($ a && $ b)は偽です。 |
3 | or 論理OR演算子と呼ばれます。2つのオペランドのいずれかがゼロ以外の場合、条件は真になります。 Example −($ aまたは$ b)は真です。 |
4 | || Cスタイルの論理OR演算子は、イーザーオペランドに存在する場合、ビットをコピーします。 Example −($ a || $ b)は真です。 |
5 | not 論理NOT演算子と呼ばれます。オペランドの論理状態を逆にするために使用します。条件がtrueの場合、LogicalNOT演算子はfalseになります。 Example − not($ aおよび$ b)は真です。 |
引用のような演算子
Perl言語でサポートされているQuoteのような演算子は次のとおりです。次の表で、{}は選択した区切り文字のペアを表します。
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | q{ } 文字列を一重引用符で囲みます Example − q {abcd}は 'abcd'を与えます |
2 | qq{ } 文字列を二重引用符で囲みます Example − qq {abcd}は「abcd」を与えます |
3 | qx{ } 文字列を-引用符で囲みます Example − qx {abcd}は `abcd`を与えます |
その他の演算子
Perl言語でサポートされているその他の演算子は次のとおりです。変数aが10を保持し、変数bが20を保持すると仮定すると、-
例を表示
シニア番号 | オペレーターと説明 |
---|---|
1 | . 二項演算子ドット(。)は、2つの文字列を連結します。 Example − $ a = "abc"の場合、 $b = "def" then $a。$ bは「abcdef」を与えます |
2 | x 繰り返し演算子xは、右側のオペランドで指定された回数繰り返された左側のオペランドで構成される文字列を返します。 Example −( '-' x 3)は---を与えます。 |
3 | .. 範囲演算子..は、左の値から右の値まで(1ずつ)カウントする値のリストを返します。 Example −(2..5)は(2、3、4、5)を与えます |
4 | ++ 自動インクリメント演算子は整数値を1つ増やします Example − $ a ++は11を与えます |
5 | -- 自動デクリメント演算子は整数値を1つ減らします Example − $ a--は9を与えます |
6 | -> 矢印演算子は主に、オブジェクトまたはクラス名からメソッドまたは変数を逆参照する際に使用されます Example − $ obj->$a is an example to access variable $fromオブジェクト$ obj。 |
Perl演算子の優先順位
次の表に、すべての演算子を優先順位の高いものから低いものの順に示します。
例を表示
left terms and list operators (leftward)
left ->
nonassoc ++ --
right **
right ! ~ \ and unary + and -
left =~ !~
left * / % x
left + - .
left << >>
nonassoc named unary operators
nonassoc < > <= >= lt gt le ge
nonassoc == != <=> eq ne cmp ~~
left &
left | ^
left &&
left || //
nonassoc .. ...
right ?:
right = += -= *= etc.
left , =>
nonassoc list operators (rightward)
right not
left and
left or xor
この章では、Perlで日付と時刻を処理および操作する方法の基本的な理解を提供します。
現在の日時
から始めましょう localtime()関数。引数が指定されていない場合、現在の日付と時刻の値を返します。以下は、によって返される9要素のリストです。localtime リストコンテキストで使用しながら機能する-
sec, # seconds of minutes from 0 to 61
min, # minutes of hour from 0 to 59
hour, # hours of day from 0 to 24
mday, # day of month from 1 to 31
mon, # month of year from 0 to 11
year, # year since 1900
wday, # days since sunday
yday, # days since January 1st
isdst # hours of daylight savings time
次の例を試して、localtime()関数によって返されるさまざまな要素を出力します-
#!/usr/local/bin/perl
@months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
@days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
print "$mday $months[$mon] $days[$wday]\n";
上記のコードを実行すると、次の結果が得られます。
16 Feb Sat
スカラーコンテキストでlocaltime()関数を使用する場合は、システムに設定されている現在のタイムゾーンの日付と時刻が返されます。次の例を試して、現在の日付と時刻を完全な形式で印刷してください-
#!/usr/local/bin/perl
$datestring = localtime();
print "Local date and time $datestring\n";
上記のコードを実行すると、次の結果が得られます。
Local date and time Sat Feb 16 06:50:45 2013
GMT時間
関数 gmtime()localtime()関数と同じように機能しますが、戻り値は標準のグリニッジ時間帯にローカライズされます。リストコンテキストで呼び出された場合、gmtimeによって返される最後の値である$ isdstは常に0です。GMTには夏時間がありません。
localtime()はスクリプトを実行するマシンの現在の現地時間を返し、gmtime()は協定世界時(GMT(またはUTC))を返すという事実に注意する必要があります。
次の例を試して、現在の日付と時刻をGMTスケールで印刷してください-
#!/usr/local/bin/perl
$datestring = gmtime(); print "GMT date and time $datestring\n";
上記のコードを実行すると、次の結果が得られます。
GMT date and time Sat Feb 16 13:50:45 2013
日付と時刻のフォーマット
localtime()関数を使用して、9要素のリストを取得できます。後で、 printf() 次のように要件に基づいて日付と時刻をフォーマットする機能-
#!/usr/local/bin/perl
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); printf("Time Format - HH:MM:SS\n"); printf("%02d:%02d:%02d", $hour, $min, $sec);
上記のコードを実行すると、次の結果が得られます。
Time Format - HH:MM:SS
06:58:52
エポックタイム
time()関数を使用して、エポック時間を取得できます。つまり、Unixで特定の日付から経過した秒数は1970年1月1日です。
#!/usr/local/bin/perl
$epoc = time(); print "Number of seconds since Jan 1, 1970 - $epoc\n";
上記のコードを実行すると、次の結果が得られます。
Number of seconds since Jan 1, 1970 - 1361022130
次のように、指定された秒数を日付と時刻の文字列に変換できます。
#!/usr/local/bin/perl
$datestring = localtime(); print "Current date and time $datestring\n";
$epoc = time(); $epoc = $epoc - 24 * 60 * 60; # one day before of current date. $datestring = localtime($epoc); print "Yesterday's date and time $datestring\n";
上記のコードを実行すると、次の結果が得られます。
Current date and time Tue Jun 5 05:54:43 2018
Yesterday's date and time Mon Jun 4 05:54:43 2018
POSIX関数strftime()
POSIX機能を使用できます strftime()次の表を使用して、日付と時刻をフォーマットします。アスタリスク(*)でマークされた指定子は、ロケールに依存することに注意してください。
指定子 | と取り換える | 例 |
---|---|---|
%a |
平日の略称* | Thu |
%A |
完全な平日の名前* | Thursday |
%b |
月の略称* | Aug |
%B |
完全な月の名前* | August |
%c |
日付と時刻の表現* | Thu Aug 23 14:55:02 2001 |
%C |
年を100で除算し、整数に切り捨てます(00-99 ) |
20 |
%d |
月の日、ゼロパッド(01-31 ) |
23 |
%D |
短いMM/DD/YY 日付、同等%m/%d/%y |
08/23/01 |
%e |
月の日、スペースが埋め込まれている(1-31 ) |
23 |
%F |
短いYYYY-MM-DD 日付、同等%Y-%m-%d |
2001-08-23 |
%g |
週ベースの年、下2桁(00-99 ) |
01 |
%G |
週ベースの年 | 2001 |
%h |
省略形の月名*(と同じ%b ) |
Aug |
%H |
24時間形式の時間(00-23 ) |
14 |
%I |
12時間形式の時間(01-12 ) |
02 |
%j |
年間通算日(001-366 ) |
235 |
%m |
10進数としての月(01-12 ) |
08 |
%M |
分(00-59 ) |
55 |
%n |
改行文字('\n' ) |
|
%p |
AMまたはPMの指定 | PM |
%r |
12時間制* | 02:55:02 pm |
%R |
24時間HH:MM 制、同等%H:%M |
14:55 |
%S |
2番目(00-61 ) |
02 |
%t |
水平タブ文字('\t' ) |
|
%T |
ISO 8601時間形式(HH:MM:SS )、同等%H:%M:%S |
14:55 |
%u |
平日はISO8601で、月曜日は1 (1-7 ) |
4 |
%U |
第1週の最初の日を第1日曜日とする週番号(00-53 ) |
33 |
%V |
ISO 8601週番号(00-53 ) |
34 |
%w |
平日を10進数として、日曜日を0 (0-6 )として |
4 |
%W |
最初の月曜日を第1週の最初の日とする週番号(00-53 ) |
34 |
%x |
日付表現* | 08/23/01 |
%X |
時間表現* | 14:55:02 |
%y |
年、下2桁(00-99 ) |
01 |
%Y |
年 | 2001 |
%z |
タイムゾーンでのUTCからのISO8601オフセット(1分= 1、1時間= 100) タイムゾーンを終了できない場合、文字はありません |
+100 |
%Z |
タイムゾーン名または略語* タイムゾーンを終了できない場合、文字はありません |
CDT |
%% |
% 看板 |
% |
次の例をチェックして、使用法を理解しましょう-
#!/usr/local/bin/perl
use POSIX qw(strftime);
$datestring = strftime "%a %b %e %H:%M:%S %Y", localtime; printf("date and time - $datestring\n");
# or for GMT formatted appropriately for your locale:
$datestring = strftime "%a %b %e %H:%M:%S %Y", gmtime; printf("date and time - $datestring\n");
上記のコードを実行すると、次の結果が得られます。
date and time - Sat Feb 16 07:10:23 2013
date and time - Sat Feb 16 14:10:23 2013
Perlサブルーチンまたは関数は、一緒にタスクを実行するステートメントのグループです。コードを個別のサブルーチンに分割できます。コードを異なるサブルーチン間でどのように分割するかはあなた次第ですが、論理的には通常、各関数が特定のタスクを実行するように分割されます。
Perlは、サブルーチン、メソッド、および関数という用語を同じ意味で使用します。
サブルーチンを定義して呼び出す
Perlプログラミング言語でのサブルーチン定義の一般的な形式は次のとおりです。
sub subroutine_name {
body of the subroutine
}
そのPerlサブルーチンを呼び出す一般的な方法は次のとおりです-
subroutine_name( list of arguments );
5.0より前のバージョンのPerlでは、サブルーチンを呼び出すための構文が以下に示すようにわずかに異なっていました。これは最新バージョンのPerlでも機能しますが、サブルーチンのプロトタイプをバイパスするため、お勧めしません。
&subroutine_name( list of arguments );
次の例を見てみましょう。この例では、単純な関数を定義してから呼び出します。Perlはプログラムを実行する前にコンパイルするので、サブルーチンをどこで宣言するかは問題ではありません。
#!/usr/bin/perl
# Function definition
sub Hello {
print "Hello, World!\n";
}
# Function call
Hello();
上記のプログラムを実行すると、次の結果が得られます。
Hello, World!
サブルーチンへの引数の受け渡し
他のプログラミング言語と同じように、さまざまな引数をサブルーチンに渡すことができ、それらは特別な配列@_を使用して関数内でアクセスできます。したがって、関数の最初の引数は$_[0], the second is in $_ [1]など。
配列とハッシュは他のスカラーと同じように引数として渡すことができますが、複数の配列またはハッシュを渡すと、通常、それらの個別のIDが失われます。したがって、参照(次の章で説明)を使用して、配列またはハッシュを渡します。
次の例を試してみましょう。この例では、数値のリストを取得して、それらの平均を出力します-
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_); $sum = 0;
foreach $item (@_) { $sum += $item; } $average = $sum / $n;
print "Average for the given numbers : $average\n";
}
# Function call
Average(10, 20, 30);
上記のプログラムを実行すると、次の結果が得られます。
Average for the given numbers : 20
サブルーチンへのリストの受け渡し
@_変数は配列であるため、サブルーチンにリストを提供するために使用できます。ただし、Perlがリストと配列を受け入れて解析する方法のため、@ _から個々の要素を抽出するのは難しい場合があります。他のスカラー引数と一緒にリストを渡す必要がある場合は、以下に示すように、最後の引数としてリストを作成します-
#!/usr/bin/perl
# Function definition
sub PrintList {
my @list = @_;
print "Given list is @list\n";
}
$a = 10;
@b = (1, 2, 3, 4);
# Function call with list parameter
PrintList($a, @b);
上記のプログラムを実行すると、次の結果が得られます。
Given list is 10 1 2 3 4
ハッシュをサブルーチンに渡す
リストを受け入れるサブルーチンまたは演算子にハッシュを指定すると、ハッシュは自動的にキーと値のペアのリストに変換されます。例-
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach my $key ( keys %hash ) {
my $value = $hash{$key}; print "$key : $value\n";
}
}
%hash = ('name' => 'Tom', 'age' => 19);
# Function call with hash parameter
PrintHash(%hash);
上記のプログラムを実行すると、次の結果が得られます。
name : Tom
age : 19
サブルーチンからの戻り値
他のプログラミング言語と同じように、サブルーチンから値を返すことができます。サブルーチンから値を返さない場合は、サブルーチンで最後に実行された計算も自動的に戻り値になります。
他のスカラーと同じように、サブルーチンから配列とハッシュを返すことができますが、複数の配列またはハッシュを返すと、通常、それらは別々のIDを失います。したがって、参照(次の章で説明)を使用して、関数から配列またはハッシュを返します。
次の例を試してみましょう。この例では、数値のリストを取得して、それらの平均を返します。
#!/usr/bin/perl
# Function definition
sub Average {
# get total number of arguments passed.
$n = scalar(@_);
$sum = 0; foreach $item (@_) {
$sum += $item;
}
$average = $sum / $n; return $average;
}
# Function call
$num = Average(10, 20, 30); print "Average for the given numbers : $num\n";
上記のプログラムを実行すると、次の結果が得られます。
Average for the given numbers : 20
サブルーチン内のプライベート変数
デフォルトでは、Perlのすべての変数はグローバル変数です。つまり、プログラムのどこからでもアクセスできます。しかし、あなたは作成することができますprivate と呼ばれる変数 lexical variables いつでも my オペレーター。
ザ・ my演算子は、変数を使用およびアクセスできるコードの特定の領域に制限します。その領域外では、この変数は使用またはアクセスできません。この領域はスコープと呼ばれます。字句スコープは通常、サブルーチンの本体を定義するものや、if、while、for、foreach、およびevalステートメントのコードブロックをマークするものなど、その周りに中括弧のセットが付いたコードのブロックです。
以下は、を使用して単一または複数のプライベート変数を定義する方法を示す例です。 my 演算子-
sub somefunc {
my $variable; # $variable is invisible outside somefunc()
my ($another, @an_array, %a_hash); # declaring many variables at once
}
次の例をチェックして、グローバル変数とプライベート変数を区別しましょう-
#!/usr/bin/perl
# Global variable
$string = "Hello, World!";
# Function definition
sub PrintHello {
# Private variable for PrintHello function
my $string; $string = "Hello, Perl!";
print "Inside the function $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";
上記のプログラムを実行すると、次の結果が得られます。
Inside the function Hello, Perl!
Outside the function Hello, World!
local()による一時的な値
ザ・ local変数の現在の値が呼び出されたサブルーチンに表示される必要がある場合に主に使用されます。ローカルは、グローバル(パッケージを意味する)変数に一時的な値を与えるだけです。これは動的スコープとして知られています。字句スコープはmyを使用して実行されます。これは、Cの自動宣言のように機能します。
ローカルに複数の変数または式を指定する場合は、それらを括弧で囲む必要があります。この演算子は、これらの変数の現在の値を非表示のスタックの引数リストに保存し、ブロック、サブルーチン、またはevalの終了時にそれらを復元することによって機能します。
次の例をチェックして、グローバル変数とローカル変数を区別しましょう-
#!/usr/bin/perl
# Global variable
$string = "Hello, World!"; sub PrintHello { # Private variable for PrintHello function local $string;
$string = "Hello, Perl!"; PrintMe(); print "Inside the function PrintHello $string\n";
}
sub PrintMe {
print "Inside the function PrintMe $string\n"; } # Function call PrintHello(); print "Outside the function $string\n";
上記のプログラムを実行すると、次の結果が得られます。
Inside the function PrintMe Hello, Perl!
Inside the function PrintHello Hello, Perl!
Outside the function Hello, World!
state()を介した状態変数
別のタイプの字句変数があります。これはプライベート変数に似ていますが、状態を維持し、サブルーチンを複数回呼び出しても再初期化されません。これらの変数は、state 演算子であり、Perl5.9.4以降で使用できます。
次の例を確認して、の使用法を示しましょう。 state 変数-
#!/usr/bin/perl
use feature 'state';
sub PrintCount {
state $count = 0; # initial value print "Value of counter is $count\n";
$count++;
}
for (1..5) {
PrintCount();
}
上記のプログラムを実行すると、次の結果が得られます。
Value of counter is 0
Value of counter is 1
Value of counter is 2
Value of counter is 3
Value of counter is 4
Perl 5.10より前は、次のように記述する必要がありました-
#!/usr/bin/perl
{
my $count = 0; # initial value
sub PrintCount {
print "Value of counter is $count\n"; $count++;
}
}
for (1..5) {
PrintCount();
}
サブルーチン呼び出しコンテキスト
サブルーチンまたはステートメントのコンテキストは、期待される戻り値のタイプとして定義されます。これにより、ユーザーが受け取ることを期待しているものに基づいて異なる値を返す単一の関数を使用できます。たとえば、次のlocaltime()は、スカラーコンテキストで呼び出されると文字列を返しますが、リストコンテキストで呼び出されるとリストを返します。
my $datestring = localtime( time );
この例では、$ timestrの値は、現在の日付と時刻で構成される文字列になります。たとえば、Thu Nov 30 15:21:332000です。逆に-
($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);
これで、個々の変数には、localtime()サブルーチンによって返される対応する値が含まれます。
Perl参照は、スカラー、配列、またはハッシュなどの別の値の場所を保持するスカラーデータ型です。そのスカラーの性質により、参照はどこでも使用でき、スカラーを使用できます。
他のリストへの参照を含むリストを作成できます。リストには、ハッシュへの参照などを含めることができます。これは、ネストされたデータ構造がPerlで構築される方法です。
参照を作成する
次のようにバックスラッシュを前に付けることで、変数、サブルーチン、または値の参照を簡単に作成できます。
$scalarref = \$foo; $arrayref = \@ARGV;
$hashref = \%ENV; $coderef = \&handler;
$globref = \*foo;
バックスラッシュ演算子を使用してI / Oハンドル(filehandleまたはdirhandle)に参照を作成することはできませんが、匿名配列への参照は、次のように角括弧を使用して作成できます。
$arrayref = [1, 2, ['a', 'b', 'c']];
同様の方法で、次のように中括弧を使用して匿名ハッシュへの参照を作成できます。
$hashref = {
'Adam' => 'Eve',
'Clyde' => 'Bonnie',
};
匿名サブルーチンへの参照は、次のようにサブ名なしでsubを使用して作成できます。
$coderef = sub { print "Boink!\n" };
間接参照
間接参照は、参照ポイントから場所への値を返します。参照を逆参照するには、参照がスカラー、配列、またはハッシュのいずれを指しているかに応じて、参照変数のプレフィックスとして$、@、または%を使用するだけです。以下は、概念を説明するための例です-
#!/usr/bin/perl
$var = 10;
# Now $r has reference to $var scalar.
$r = \$var;
# Print value available at the location stored in $r. print "Value of $var is : ", $$r, "\n"; @var = (1, 2, 3); # Now $r has reference to @var array.
$r = \@var; # Print values available at the location stored in $r.
print "Value of @var is : ", @$r, "\n"; %var = ('key1' => 10, 'key2' => 20); # Now $r has reference to %var hash.
$r = \%var; # Print values available at the location stored in $r.
print "Value of %var is : ", %$r, "\n";
上記のプログラムを実行すると、次の結果が得られます。
Value of 10 is : 10
Value of 1 2 3 is : 123
Value of %var is : key220key110
変数の型がわからない場合は、を使用してその型を簡単に知ることができます ref、引数が参照の場合、次の文字列のいずれかを返します。それ以外の場合はfalseを返します-
SCALAR
ARRAY
HASH
CODE
GLOB
REF
次の例を試してみましょう-
#!/usr/bin/perl
$var = 10;
$r = \$var;
print "Reference type in r : ", ref($r), "\n"; @var = (1, 2, 3); $r = \@var;
print "Reference type in r : ", ref($r), "\n"; %var = ('key1' => 10, 'key2' => 20); $r = \%var;
print "Reference type in r : ", ref($r), "\n";
上記のプログラムを実行すると、次の結果が得られます。
Reference type in r : SCALAR
Reference type in r : ARRAY
Reference type in r : HASH
循環参照
循環参照は、2つの参照に相互の参照が含まれている場合に発生します。参照を作成するときは注意する必要があります。そうしないと、循環参照によってメモリリークが発生する可能性があります。以下は例です-
#!/usr/bin/perl
my $foo = 100;
$foo = \$foo;
print "Value of foo is : ", $$foo, "\n";
上記のプログラムを実行すると、次の結果が得られます。
Value of foo is : REF(0x9aae38)
関数への参照
これは、シグナルハンドラーを作成して、関数名の前に\&を付けて関数への参照を生成し、その参照を逆参照するには、アンパサンド&を使用して参照変数のプレフィックスを付ける必要がある場合に発生する可能性があります。以下は例です-
#!/usr/bin/perl
# Function definition
sub PrintHash {
my (%hash) = @_;
foreach $item (%hash) {
print "Item : $item\n"; } } %hash = ('name' => 'Tom', 'age' => 19); # Create a reference to above function. $cref = \&PrintHash;
# Function call using reference.
&$cref(%hash);
上記のプログラムを実行すると、次の結果が得られます。
Item : name
Item : Tom
Item : age
Item : 19
Perlは、「フォーマット」と呼ばれる書き込みテンプレートを使用してレポートを出力します。Perlのフォーマット機能を使用するには、最初にフォーマットを定義する必要があり、次にそのフォーマットを使用してフォーマットされたデータを書き込むことができます。
フォーマットを定義する
以下は、Perlフォーマットを定義するための構文です-
format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.
ここに FormatNameフォーマットの名前を表します。ザ・fieldline特定の方法です。データをフォーマットする必要があります。値の行は、フィールド行に入力される値を表します。フォーマットは単一のピリオドで終了します。
次 fieldline任意のテキストまたはフィールドホルダーを含めることができます。フィールドホルダーは、後日そこに配置されるデータ用のスペースを保持します。フィールドホルダーの形式は-
@<<<<
このフィールドホルダーは左寄せで、フィールドスペースは5です。フィールド内のスペースの数を知るには、@記号と<記号を数える必要があります。他のフィールドホルダーは次のとおりです。
@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder
形式の例は次のようになります-
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age @#####.## $salary
===================================
.
この例では、$ nameは22文字のスペース内で左揃えとして記述され、それ以降は2つのスペースで記述されます。
フォーマットの使用
このフォーマット宣言を呼び出すために、 write キーワード−
write EMPLOYEE;
問題は、フォーマット名が通常開いているファイルハンドルの名前であり、writeステートメントが出力をこのファイルハンドルに送信することです。データをSTDOUTに送信する必要があるため、EMPLOYEEをSTDOUTファイルハンドルに関連付ける必要があります。ただし、最初に、select()関数を使用して、STDOUTが選択したファイルハンドルであることを確認する必要があります。
select(STDOUT);
次に、次のように特別な変数$〜または$ FORMAT_NAMEを使用して、新しいフォーマット名をSTDOUTに設定することにより、EMPLOYEEをSTDOUTに関連付けます。
$~ = "EMPLOYEE";
ここでwrite()を実行すると、データはSTDOUTに送信されます。注意:STDOUTではなく他のファイルハンドルでレポートを作成する場合は、select()関数を使用してそのファイルハンドルを選択でき、残りのロジックは同じままです。
次の例を見てみましょう。ここでは、使用法を示すためだけに値をハードコーディングしています。実際の使用法では、ファイルまたはデータベースから値を読み取って実際のレポートを生成し、最終レポートをファイルに再度書き込む必要がある場合があります。
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary =================================== . select(STDOUT); $~ = EMPLOYEE;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
$salary = $s[$i++];
write;
}
実行すると、次の結果が生成されます-
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
レポートヘッダーを定義する
すべてがうまく見えます。ただし、レポートにヘッダーを追加することをお勧めします。このヘッダーは、各ページの上部に印刷されます。これを行うのは非常に簡単です。テンプレートの定義とは別に、ヘッダーを定義して$ ^または$ FORMAT_TOP_NAME変数に割り当てる必要があります-
#!/usr/bin/perl
format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age @#####.## $salary
===================================
.
format EMPLOYEE_TOP =
===================================
Name Age
===================================
.
select(STDOUT);
$~ = EMPLOYEE; $^ = EMPLOYEE_TOP;
@n = ("Ali", "Raza", "Jaffer");
@a = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);
$i = 0; foreach (@n) { $name = $_; $age = $a[$i];
$salary = $s[$i++];
write;
}
これで、レポートは次のようになります。
===================================
Name Age
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
ページネーションを定義する
レポートに複数のページが含まれている場合はどうでしょうか。あなたはそのための解決策を持っています、単に使用してください$% または$ FORMAT_PAGE_NUMBERは、次のようにヘッダーと一緒に変更できます-
format EMPLOYEE_TOP =
===================================
Name Age Page @<
$%
===================================
.
これで、出力は次のようになります。
===================================
Name Age Page 1
===================================
===================================
Ali 20
2000.00
===================================
===================================
Raza 30
2500.00
===================================
===================================
Jaffer 40
4000.00
===================================
ページの行数
特別な変数を使用して、ページあたりの行数を設定できます $= (または$ FORMAT_LINES_PER_PAGE)、デフォルトでは$ =は60になります。
レポートフッターを定義する
$ ^または $FORMAT_TOP_NAME contains the name of the current header format, there is no corresponding mechanism to automatically do the same thing for a footer. If you have a fixed-size footer, you can get footers by checking variable $-または各write()の前に$ FORMAT_LINES_LEFTを実行し、必要に応じて次のように定義された別の形式を使用してフッターを自分で出力します-
format EMPLOYEE_BOTTOM =
End of Page @<
$%
.
フォーマットに関連する変数の完全なセットについては、Perlの特殊変数のセクションを参照してください。
ファイルの処理の基本は単純です。 filehandle 外部エンティティ(通常はファイル)を使用してから、Perl内のさまざまな演算子と関数を使用して、ファイルハンドルに関連付けられたデータストリーム内に格納されているデータを読み取って更新します。
ファイルハンドルは、物理ファイルを名前に関連付ける名前付きの内部Perl構造です。すべてのファイルハンドルは読み取り/書き込みアクセスが可能であるため、ファイルハンドルに関連付けられている任意のファイルまたはデバイスから読み取りおよび更新できます。ただし、ファイルハンドルを関連付ける場合は、ファイルハンドルを開くモードを指定できます。
3つの基本的なファイルハンドルは- STDIN、 STDOUT、および STDERR, これは、それぞれ標準入力、標準出力、および標準エラーデバイスを表します。
ファイルを開いたり閉じたりする
Perlで新規または既存のファイルを開くために使用できる複数の形式の次の2つの関数があります。
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
ここで、FILEHANDLEは、によって返されるファイルハンドルです。 open 関数とEXPRは、ファイル名とファイルを開くモードを持つ式です。
オープン機能
開く構文は次のとおりです file.txt読み取り専用モード。ここで<記号未満は、ファイルを読み取り専用モードで開く必要があることを示します。
open(DATA, "<file.txt");
ここで、DATAはファイルハンドルであり、ファイルの読み取りに使用されます。これは、ファイルを開き、そのコンテンツを画面に印刷する例です。
#!/usr/bin/perl
open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!"; while(<DATA>) { print "$_";
}
以下は、file.txtを書き込みモードで開くための構文です。ここで、>未満の記号は、ファイルを書き込みモードで開く必要があることを示します。
open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!";
この例では、書き込み用に開く前に実際にファイルを切り捨て(空にし)ますが、これは望ましい効果ではない可能性があります。読み取りと書き込みのためにファイルを開きたい場合は、>または<文字の前にプラス記号を付けることができます。
たとえば、ファイルを切り捨てずに更新用に開くには-
open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!";
最初にファイルを切り捨てる-
open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";
追加モードでファイルを開くことができます。このモードでは、書き込みポイントはファイルの終わりに設定されます。
open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";
ダブル>>は、追加するファイルを開き、ファイルポインタを最後に配置して、情報の追加をすぐに開始できるようにします。ただし、その前にプラス記号を付けないと、そこから読み取ることはできません-
open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";
以下は、さまざまなモードの可能な値を示す表です。
シニア番号 | エンティティと定義 |
---|---|
1 | < or r 読み取り専用アクセス |
2 | > or w 作成、書き込み、および切り捨て |
3 | >> or a 書き込み、追加、作成 |
4 | +< or r+ 読み取りと書き込み |
5 | +> or w+ 読み取り、書き込み、作成、および切り捨て |
6 | +>> or a+ 読み取り、書き込み、追加、および作成 |
Sysopen関数
ザ・ sysopen 関数は、システムを使用することを除いて、メインのオープン関数に似ています open() 提供されたパラメータをシステム関数のパラメータとして使用する関数-
たとえば、更新用にファイルを開くには、 +<filename オープンからのフォーマット−
sysopen(DATA, "file.txt", O_RDWR);
または、更新する前にファイルを切り捨てる-
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
O_CREATを使用して新しいファイルを作成し、O_WRONLY-を使用してファイルを書き込み専用モードで開き、O_RDONLY-を使用してファイルを読み取り専用モードで開くことができます。
ザ・ PERMS引数は、ファイルを作成する必要がある場合に、指定されたファイルのファイル権限を指定します。デフォルトでは0x666。
以下は、MODEの可能な値を示す表です。
シニア番号 | エンティティと定義 |
---|---|
1 | O_RDWR 読み書き |
2 | O_RDONLY 読み取り専用 |
3 | O_WRONLY 書き込みのみ |
4 | O_CREAT ファイルを作成する |
5 | O_APPEND ファイルを追加する |
6 | O_TRUNC ファイルを切り捨てます |
7 | O_EXCL ファイルがすでに存在する場合は停止します |
8 | O_NONBLOCK ノンブロッキングユーザビリティ |
クローズ機能
ファイルハンドルを閉じて、対応するファイルからファイルハンドルの関連付けを解除するには、 close関数。これにより、ファイルハンドルのバッファがフラッシュされ、システムのファイル記述子が閉じられます。
close FILEHANDLE
close
FILEHANDLEが指定されていない場合は、現在選択されているファイルハンドルを閉じます。バッファを正常にフラッシュしてファイルを閉じることができた場合にのみtrueを返します。
close(DATA) || die "Couldn't close file properly";
ファイルの読み取りと書き込み
ファイルハンドルを開いたら、情報の読み取りと書き込みができるようにする必要があります。データの読み取りとファイルへの書き込みには、さまざまな方法があります。
<FILEHANDL>演算子
開いているファイルハンドルから情報を読み取る主な方法は、<FILEHANDLE>演算子です。スカラーコンテキストでは、ファイルハンドルから1行を返します。例-
#!/usr/bin/perl
print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";
リストコンテキストで<FILEHANDLE>演算子を使用すると、指定されたファイルハンドルから行のリストが返されます。たとえば、ファイルから配列にすべての行をインポートするには-
#!/usr/bin/perl
open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);
getc関数
getc関数は、指定されたFILEHANDLEから単一の文字を返します。何も指定されていない場合はSTDINを返します-
getc FILEHANDLE
getc
エラーが発生した場合、またはファイルハンドルがファイルの終わりにある場合は、代わりにundefが返されます。
関数を読む
read関数は、バッファリングされたファイルハンドルから情報のブロックを読み取ります。この関数は、ファイルからバイナリデータを読み取るために使用されます。
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
読み取られるデータの長さはLENGTHによって定義され、OFFSETが指定されていない場合、データはSCALARの先頭に配置されます。それ以外の場合、データはSCALARのOFFSETバイトの後に配置されます。この関数は、成功時に読み取られたバイト数、ファイルの終わりにゼロ、またはエラーがあった場合はundefを返します。
印刷機能
ファイルハンドルから情報を読み取るために使用されるすべての異なるメソッドの場合、情報を書き戻すための主な関数は印刷関数です。
print FILEHANDLE LIST
print LIST
print
print関数は、LISTの評価値をFILEHANDLEまたは現在の出力ファイルハンドル(デフォルトではSTDOUT)に出力します。例-
print "Hello World!\n";
ファイルのコピー
これは、既存のファイルfile1.txtを開き、それを1行ずつ読み取り、別のコピーファイルfile2.txtを生成する例です。
#!/usr/bin/perl
# Open file to read
open(DATA1, "<file1.txt");
# Open new file to write
open(DATA2, ">file2.txt");
# Copy data from one file to another.
while(<DATA1>) {
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
ファイルの名前を変更する
これは、ファイルfile1.txtの名前をfile2.txtに変更する方法を示す例です。ファイルが/ usr / testディレクトリにあると仮定します。
#!/usr/bin/perl
rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );
この機能 renames 2つの引数を取り、既存のファイルの名前を変更するだけです。
既存のファイルを削除する
これは、を使用してファイルfile1.txtを削除する方法を示す例です。 unlink 関数。
#!/usr/bin/perl
unlink ("/usr/test/file1.txt");
ファイル内の配置
あなたはに使用することができます tell ファイルの現在位置を知る関数と seek ファイル内の特定の位置を指す関数。
関数に伝える
最初の要件は、ファイル内の位置を見つけることです。これは、tell関数を使用して行います-
tell FILEHANDLE
tell
これは、指定されている場合はFILEHANDLE内のファイルポインタの位置をバイト単位で返し、何も指定されていない場合は現在のデフォルトで選択されているファイルハンドルを返します。
シーク機能
シーク関数は、ファイルポインタをファイル内の指定されたバイト数に配置します-
seek FILEHANDLE, POSITION, WHENCE
この関数はfseekシステム関数を使用しており、開始、終了、現在の位置の3つの異なるポイントに対して同じ位置を設定できます。これを行うには、WHENCEの値を指定します。
ゼロは、ファイルの先頭を基準にした位置を設定します。たとえば、この行はファイルポインタをファイルの256番目のバイトに設定します。
seek DATA, 256, 0;
ファイル情報
-Xテストと総称される一連のテスト演算子を使用して、Perl内で特定の機能を非常に迅速にテストできます。たとえば、ファイルに対するさまざまなアクセス許可の簡単なテストを実行するには、次のようなスクリプトを使用できます。
#/usr/bin/perl
my $file = "/usr/test/file1.txt"; my (@description, $size);
if (-e $file) { push @description, 'binary' if (-B _); push @description, 'a socket' if (-S _); push @description, 'a text file' if (-T _); push @description, 'a block special file' if (-b _); push @description, 'a character special file' if (-c _); push @description, 'a directory' if (-d _); push @description, 'executable' if (-x _); push @description, (($size = -s _)) ? "$size bytes" : 'empty'; print "$file is ", join(', ',@description),"\n";
}
これがファイルやディレクトリをチェックできる機能のリストです-
シニア番号 | 演算子と定義 |
---|---|
1 | -A スクリプトの開始時間からファイルの最終アクセス時間を引いた日数。 |
2 | -B バイナリファイルですか? |
3 | -C スクリプトの開始時間からファイルの最後のiノード変更時間を引いた日数。 |
3 | -M スクリプトの開始時間からファイルの変更時間を引いた日数。 |
4 | -O ファイルは実際のユーザーIDによって所有されていますか? |
5 | -R ファイルは実際のユーザーIDまたは実際のグループで読み取り可能ですか? |
6 | -S ファイルはソケットですか? |
7 | -T テキストファイルですか? |
8 | -W ファイルは実際のユーザーIDまたは実際のグループで書き込み可能ですか? |
9 | -X ファイルは実際のユーザーIDまたは実際のグループで実行可能ですか? |
10 | -b ブロック特殊ファイルですか? |
11 | -c キャラクタースペシャルファイルですか? |
12 | -d ファイルはディレクトリですか? |
13 | -e ファイルは存在しますか? |
14 | -f プレーンファイルですか? |
15 | -g ファイルにはsetgidビットが設定されていますか? |
16 | -k ファイルにスティッキービットが設定されていますか? |
17 | -l ファイルはシンボリックリンクですか? |
18 | -o ファイルは実効ユーザーIDによって所有されていますか? |
19 | -p ファイルは名前付きパイプですか? |
20 | -r ファイルは有効なユーザーまたはグループIDで読み取り可能ですか? |
21 | -s ファイルのサイズを返します。ゼロサイズ=空のファイル。 |
22 | -t ファイルハンドルはTTY(ターミナル)によって開かれていますか? |
23 | -u ファイルにはsetuidビットが設定されていますか? |
24 | -w ファイルは有効なユーザーまたはグループIDで書き込み可能ですか? |
25 | -x ファイルは有効なユーザーまたはグループIDで実行可能ですか? |
26 | -z ファイルサイズはゼロですか? |
以下は、ディレクトリを操作するために使用される標準関数です。
opendir DIRHANDLE, EXPR # To open a directory
readdir DIRHANDLE # To read a directory
rewinddir DIRHANDLE # Positioning pointer to the begining
telldir DIRHANDLE # Returns current position of the dir
seekdir DIRHANDLE, POS # Pointing pointer to POS inside dir
closedir DIRHANDLE # Closing a directory.
すべてのファイルを表示する
特定のディレクトリで使用可能なすべてのファイルを一覧表示するには、さまざまな方法があります。まず、簡単な方法を使用して、を使用してすべてのファイルを取得して一覧表示しましょう。glob 演算子-
#!/usr/bin/perl
# Display all the files in /tmp directory.
$dir = "/tmp/*"; my @files = glob( $dir );
foreach (@files ) {
print $_ . "\n"; } # Display all the C source files in /tmp directory. $dir = "/tmp/*.c";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}
# Display all the hidden files.
$dir = "/tmp/.*"; @files = glob( $dir );
foreach (@files ) {
print $_ . "\n"; } # Display all the files from /tmp and /home directories. $dir = "/tmp/* /home/*";
@files = glob( $dir ); foreach (@files ) { print $_ . "\n";
}
これは別の例で、ディレクトリを開き、このディレクトリ内で使用可能なすべてのファイルを一覧表示します。
#!/usr/bin/perl
opendir (DIR, '.') or die "Couldn't open directory, $!"; while ($file = readdir DIR) {
print "$file\n";
}
closedir DIR;
使用する可能性のあるCソースファイルのリストを印刷するもう1つの例は次のとおりです。
#!/usr/bin/perl
opendir(DIR, '.') or die "Couldn't open directory, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR))) { print "$_\n";
}
closedir DIR;
新しいディレクトリを作成する
使用できます mkdir新しいディレクトリを作成する関数。ディレクトリを作成するには、必要な権限が必要です。
#!/usr/bin/perl
$dir = "/tmp/perl"; # This creates perl directory in /tmp directory. mkdir( $dir ) or die "Couldn't create $dir directory, $!";
print "Directory created successfully\n";
ディレクトリを削除する
使用できます rmdirディレクトリを削除する関数。ディレクトリを削除するには、必要な権限が必要です。さらに、このディレクトリを削除する前に、このディレクトリを空にする必要があります。
#!/usr/bin/perl
$dir = "/tmp/perl"; # This removes perl directory from /tmp directory. rmdir( $dir ) or die "Couldn't remove $dir directory, $!";
print "Directory removed successfully\n";
ディレクトリを変更する
使用できます chdirディレクトリを変更して新しい場所に移動する機能。ディレクトリを変更して新しいディレクトリに移動するには、必要な権限が必要です。
#!/usr/bin/perl
$dir = "/home"; # This changes perl directory and moves you inside /home directory. chdir( $dir ) or die "Couldn't go inside $dir directory, $!";
print "Your new location is $dir\n";
実行とエラーは常に一緒になります。存在しないファイルを開いている場合。この状況を適切に処理しなかった場合、プログラムの品質は悪いと見なされます。
エラーが発生すると、プログラムは停止します。そのため、適切なエラー処理を使用して、プログラムの実行中に発生する可能性のあるさまざまなタイプのエラーを処理し、プログラムを完全に停止するのではなく、適切なアクションを実行します。
さまざまな方法でエラーを識別してトラップできます。Perlでエラーをトラップし、適切に処理するのは非常に簡単です。使用できる方法は次のとおりです。
ifステートメント
ザ・ if statementステートメントからの戻り値をチェックする必要がある場合は、当然の選択です。例-
if(open(DATA, $file)) {
...
} else {
die "Error: Couldn't open the file - $!";
}
ここで変数$!実際のエラーメッセージを返します。あるいは、そうすることが理にかなっている状況では、ステートメントを1行に減らすことができます。例-
open(DATA, $file) || die "Error: Couldn't open the file $!";
until関数
ザ・ unless関数は、if:ステートメントとは論理的に反対です。ステートメントは成功ステータスを完全にバイパスでき、式がfalseを返した場合にのみ実行されます。例-
unless(chdir("/etc")) {
die "Error: Can't change directory - $!";
}
ザ・ unlessステートメントは、式が失敗した場合にのみエラーまたは代替を発生させたい場合に最適です。このステートメントは、1行のステートメントで使用する場合にも意味があります-
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
ここでは、chdir操作が失敗した場合にのみ死に、読みやすくなっています。
三項演算子
非常に短いテストの場合、条件演算子を使用できます ?:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
ここで私たちが何を達成しようとしているのかはそれほど明確ではありませんが、効果は if または unlessステートメント。条件演算子は、式またはステートメント内の2つの値のいずれかをすばやく返したい場合に最適です。
警告機能
警告機能は警告を発するだけで、メッセージがSTDERRに出力されますが、それ以上のアクションは実行されません。したがって、ユーザーへの警告を出力して残りの操作を続行する場合は、より便利です。
chdir('/etc') or warn "Can't change directory";
ダイ機能
die関数は、exitも呼び出すことを除いて、warnと同じように機能します。通常のスクリプト内では、この関数は実行を即座に終了する効果があります。プログラムにエラーが発生した場合に続行することが役に立たない場合は、この関数を使用する必要があります-
chdir('/etc') or die "Can't change directory";
モジュール内のエラー
処理できるはずの2つの異なる状況があります-
モジュールのファイル名と行番号を引用するモジュールのエラーを報告する-これは、モジュールをデバッグする場合、またはスクリプト関連ではなくモジュール関連のエラーを具体的に発生させたい場合に役立ちます。
エラーの原因となったスクリプト内の行をデバッグできるように、呼び出し元の情報を引用するモジュール内でエラーを報告します。この方法で発生したエラーは、呼び出し元のスクリプトの発信行に関連するエラーを強調するため、エンドユーザーにとって便利です。
ザ・ warn そして die関数は、モジュール内から呼び出された場合に予想されるものとは少し異なる動作をします。たとえば、単純加群-
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
warn "Error in module!";
}
1;
以下のようなスクリプトから呼び出された場合-
use T;
function();
次の結果が得られます-
Error in module! at T.pm line 9.
これは多かれ少なかれあなたが期待するものですが、必ずしもあなたが望むものではありません。モジュールプログラマーの観点からは、この情報はモジュール自体のバグを指摘するのに役立つため、役立ちます。エンドユーザーにとって、提供された情報はかなり役に立たず、強化されたプログラマーを除いて、それは完全に無意味です。
このような問題の解決策はCarpモジュールです。これは、呼び出し元のスクリプトに関する情報を返すモジュール内のエラーを報告するための簡略化された方法を提供します。Carpモジュールは、carp、cluck、croak、およびconfessの4つの機能を提供します。これらの機能については、以下で説明します。
コイ機能
carp関数は、warnと基本的に同等であり、実際にスクリプトを終了してスクリプト名を出力することなく、メッセージをSTDERRに出力します。
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
以下のようなスクリプトから呼び出された場合-
use T;
function();
次の結果が得られます-
Error in module! at test.pl line 4
クラック機能
cluck関数は一種の過給された鯉であり、同じ基本原則に従いますが、元のスクリプトの情報を含む、呼び出される関数につながったすべてのモジュールのスタックトレースも出力します。
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
以下のようなスクリプトから呼び出された場合-
use T;
function();
次の結果が得られます-
Error in module! at T.pm line 9
T::function() called at test.pl line 4
鳴き声機能
ザ・ croak 関数はと同等です dieただし、発信者を1レベル上に報告します。dieと同様に、この関数もSTDERRにエラーを報告した後にスクリプトを終了します-
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
以下のようなスクリプトから呼び出された場合-
use T;
function();
次の結果が得られます-
Error in module! at test.pl line 4
コイと同様に、警告およびダイ機能に従って行およびファイル情報を含めることに関して、同じ基本ルールが適用されます。
告白機能
ザ・ confess 機能は次のようなものです cluck; dieを呼び出してから、発信スクリプトまでのスタックトレースを出力します。
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
以下のようなスクリプトから呼び出された場合-
use T;
function();
次の結果が得られます-
Error in module! at T.pm line 9
T::function() called at test.pl line 4
Perlで事前定義された特別な意味を持ついくつかの変数があります。これらは、$ _(以下で説明)などの通常の変数インジケーター($、@、または%)の後に句読文字を使用する変数です。
ほとんどの特殊変数には、長い名前のような英語があります。たとえば、オペレーティングシステムエラー変数$!$ OS_ERRORと書くことができます。しかし、名前のように英語を使用する場合は、1行入力する必要がありますuse English;プログラムファイルの先頭にあります。これにより、インタプリタは変数の正確な意味を取得できます。
最も一般的に使用される特殊変数は$ _で、これにはデフォルトの入力とパターン検索文字列が含まれています。たとえば、次の行で-
#!/usr/bin/perl
foreach ('hickory','dickory','doc') {
print $_;
print "\n";
}
実行すると、次の結果が生成されます-
hickory
dickory
doc
繰り返しますが、$ _変数を明示的に使用せずに同じ例を確認しましょう-
#!/usr/bin/perl
foreach ('hickory','dickory','doc') {
print;
print "\n";
}
実行すると、次の結果も生成されます-
hickory
dickory
doc
初めてループを実行すると、「ヒッコリー」が出力されます。2回目は「dickory」、3回目は「doc」が印刷されます。これは、ループの各反復で、現在の文字列がに配置されるためです。$_, and is used by default by print. Here are the places where Perl will assume $_指定しなくても−
ordやintなどの関数、およびデフォルトでSTDINに設定されている-tを除くすべてのファイルテスト(-f、-d)を含む、さまざまな単項関数。
印刷やリンク解除などのさまざまなリスト機能。
=〜演算子なしで使用した場合のパターンマッチング操作m //、s ///、およびtr ///。
他の変数が指定されていない場合のforeachループのデフォルトのイテレーター変数。
grepおよびmap関数の暗黙のイテレータ変数。
行入力操作の結果がwhileテストの唯一の基準としてそれ自体でテストされるときに入力レコードを配置するデフォルトの場所(つまり、)。しばらくの間のテスト以外では、これは起こらないことに注意してください。
特殊変数タイプ
特殊変数の使用法と性質に基づいて、次のカテゴリに分類できます-
- グローバルスカラー特殊変数。
- グローバル配列特殊変数。
- グローバルハッシュ特殊変数。
- グローバルスペシャルファイルハンドル。
- グローバル特殊定数。
- 正規表現の特殊変数。
- Filehandle特殊変数。
グローバルスカラー特殊変数
これがすべてのスカラー特殊変数のリストです。対応する英語のような名前を記号名とともにリストしました。
$ _ | デフォルトの入力およびパターン検索スペース。 |
$ ARG | |
$。 | 最後に読み取られたファイルハンドルの現在の入力行番号。ファイルハンドルを明示的に閉じると、行番号がリセットされます。 |
$ NR | |
$ / | 入力レコード区切り文字。デフォルトでは改行。null文字列に設定すると、空白行が区切り文字として扱われます。 |
$ RS | |
$、 | 印刷演算子の出力フィールドセパレータ。 |
$ OFS | |
$ \ | 印刷演算子の出力レコード区切り文字。 |
$ ORS | |
$ " | 「$」と同様ですが、二重引用符で囲まれた文字列(または同様の解釈された文字列)に補間されたリスト値に適用される点が異なります。デフォルトはスペースです。 |
$ LIST_SEPARATOR | |
$; | 多次元配列エミュレーション用の添え字区切り文字。デフォルトは「\ 034」です。 |
$ SUBSCRIPT_SEPARATOR | |
$ ^ L | フォームフィードを実行するためにフォーマットが出力するもの。デフォルトは「\ f」です。 |
$ FORMAT_FORMFEED | |
$: | 継続フィールド(^で始まる)をフォーマットで埋めるために文字列が分割される可能性がある現在の文字セット。デフォルトは「\ n」です。 |
$ FORMAT_LINE_BREAK_CHARACTERS | |
$ ^ A | フォーマット行の書き込みアキュムレータの現在の値。 |
$ ACCUMULATOR | |
$# | 印刷された数値の出力形式が含まれます(非推奨)。 |
$ OFMT | |
$? | 最後のパイプクローズ、バッククォート( ``)コマンド、またはシステムオペレータによって返されるステータス。 |
$ CHILD_ERROR | |
$! | 数値コンテキストで使用される場合、errno変数の現在の値を生成し、最後のシステムコールエラーを識別します。文字列コンテキストで使用すると、対応するシステムエラー文字列が生成されます。 |
$OS_ERROR or $ERRNO | |
$ @ | 最後のevalコマンドからのPerl構文エラーメッセージ。 |
$ EVAL_ERROR | |
$$ | このスクリプトを実行しているPerlプロセスのpid。 |
$ PROCESS_IDまたは$ PID | |
$ < | このプロセスの実際のユーザーID(uid)。 |
$REAL_USER_ID or $UID | |
$> | このプロセスの実効ユーザーID。 |
$ EFFECTIVE_USER_IDまたは$ EUID | |
$( | このプロセスの実際のグループID(gid)。 |
$REAL_GROUP_ID or $GID | |
$) | このプロセスの効果的なガイド。 |
$ EFFECTIVE_GROUP_IDまたは$ EGID | |
$ 0 | 実行中のPerlスクリプトを含むファイルの名前が含まれます。 |
$ PROGRAM_NAME | |
$ [ | 配列の最初の要素と部分文字列の最初の文字のインデックス。デフォルトは0です。 |
$] | バージョンとパッチレベルを1000で割った値を返します。 |
$ PERL_VERSION | |
$ ^ D | デバッグフラグの現在の値。 |
$ DEBUGGING | |
$ ^ E | 一部のプラットフォームでの拡張エラーメッセージ。 |
$ EXTENDED_OS_ERROR | |
$ ^ F | 最大システムファイル記述子、通常は2。 |
$ SYSTEM_FD_MAX | |
$ ^ H | 特定の実用的なモジュールによって有効化される内部コンパイラヒントが含まれています。 |
$ ^ I | インプレース編集拡張機能の現在の値。undefを使用して、インプレース編集を無効にします。 |
$ INPLACE_EDIT | |
$ ^ M | の内容 $M can be used as an emergency memory pool in case Perl dies with an out-of-memory error. Use of $MにはPerlの特別なコンパイルが必要です。詳細については、INSTALLドキュメントを参照してください。 |
$ ^ O | 現在のPerlバイナリがコンパイルされたオペレーティングシステムの名前が含まれています。 |
$ OSNAME | |
$ ^ P | デバッガーがそれ自体をデバッグしないようにクリアする内部フラグ。 |
$ PERLDB | |
$ ^ T | スクリプトの実行が開始された時刻(エポックからの秒数)。 |
$ BASETIME | |
$ ^ W | 警告スイッチの現在の値(trueまたはfalse)。 |
$警告 | |
$ ^ X | Perlバイナリ自体が実行された名前。 |
$ EXECUTABLE_NAME | |
$ ARGV | <ARGV>から読み取るときの現在のファイルの名前が含まれます。 |
グローバル配列特殊変数
@ARGV | スクリプト用のコマンドライン引数を含む配列。 |
@INC | do、require、またはuse構造によって評価されるPerlスクリプトを検索する場所のリストを含む配列。 |
@F | -aコマンドラインスイッチが指定されたときに入力行が分割される配列。 |
グローバルハッシュ特殊変数
%INC | doまたはrequireを介してインクルードされた各ファイルのファイル名のエントリを含むハッシュ。 |
%ENV | 現在の環境を含むハッシュ。 |
%SIG | さまざまなシグナルのシグナルハンドラーを設定するために使用されるハッシュ。 |
グローバルスペシャルファイルハンドル
ARGV | @ARGVのコマンドラインファイル名を反復処理する特別なファイルハンドル。通常、<>ではnullファイルハンドルとして記述されます。 |
STDERR | 任意のパッケージの標準エラー用の特別なファイルハンドル。 |
STDIN | 任意のパッケージの標準入力用の特別なファイルハンドル。 |
STDOUT | 任意のパッケージの標準出力用の特別なファイルハンドル。 |
データ | スクリプトを含むファイル内の__END__トークンに続くものを参照する特別なファイルハンドル。または、__ DATA__がで見つかったのと同じパッケージ内のデータを読み取っている限り、必要なファイルの__DATA__トークンに続くものの特別なファイルハンドル。 |
_(アンダースコア) | 最後のstat、lstat、またはファイルテストオペレーターからの情報をキャッシュするために使用される特別なファイルハンドル。 |
グローバル特殊定数
__終わり__ | プログラムの論理的な終わりを示します。以下のテキストは無視されますが、DATAファイルハンドルを介して読み取ることができます。 |
__ファイル__ | プログラム内で使用されているポイントのファイル名を表します。文字列に補間されません。 |
__ライン__ | 現在の行番号を表します。文字列に補間されません。 |
__パッケージ__ | コンパイル時の現在のパッケージ名を表します。現在のパッケージがない場合は未定義です。文字列に補間されません。 |
正規表現の特殊変数
$ digit | 最後に一致したパターンの対応する括弧のセットと一致するテキストが含まれます。たとえば、$ 1は、前の正規表現の最初の括弧のセットに含まれていたものと一致します。 |
$& | 最後に成功したパターン一致によって一致した文字列。 |
$ MATCH | |
$ ` | 最後に成功したパターン一致によって一致したものの前にある文字列。 |
$ PREMATCH | |
$ ' | 最後に成功したパターン一致によって一致したものに続く文字列。 |
$ POSTMATCH | |
$ + | 最後の検索パターンと一致する最後の角かっこ。これは、代替パターンのセットのどれが一致したかわからない場合に役立ちます。例:/バージョン:(。*)|リビジョン:(。*)/ &&($rev = $+); |
$ LAST_PAREN_MATCH |
Filehandle特殊変数
$ | | ゼロ以外に設定すると、現在選択されている出力チャネルでの書き込みまたは印刷のたびにfflush(3)が強制されます。 |
$ OUTPUT_AUTOFLUSH | |
$% | 現在選択されている出力チャネルの現在のページ番号。 |
$ FORMAT_PAGE_NUMBER | |
$ = | 現在選択されている出力チャネルの現在のページ長(印刷可能な行)。デフォルトは60です。 |
$ FORMAT_LINES_PER_PAGE | |
$- | 現在選択されている出力チャネルのページに残っている行数。 |
$ FORMAT_LINES_LEFT | |
$〜 | 現在選択されている出力チャネルの現在のレポート形式の名前。デフォルトはファイルハンドルの名前です。 |
$ FORMAT_NAME | |
$ ^ | 現在選択されている出力チャネルの現在のページ上部フォーマットの名前。デフォルトは、_TOPが追加されたファイルハンドルの名前です。 |
$ FORMAT_TOP_NAME |
もちろん、各プログラマーはフォーマットに関して独自の好みを持っていますが、プログラムを読み、理解し、保守しやすくするための一般的なガイドラインがいくつかあります。
最も重要なことは、常に-wフラグの下でプログラムを実行することです。必要に応じて、警告なしプラグマまたは$ ^ W変数を使用して、コードの特定の部分に対して明示的にオフにすることができます。また、常に厳密な使用の下で実行するか、その理由を知っておく必要があります。sigtrapを使用し、診断プラグマを使用することも役立つ場合があります。
コードレイアウトの美学に関して、ラリーが強く気にかけているのは、複数行のBLOCKの閉じ中括弧が、構成を開始したキーワードと一致していることだけです。それを超えて、彼はそれほど強くない他の好みを持っています-
- 4列のインデント。
- 可能であればキーワードと同じ行でカーリーを開き、それ以外の場合は並べます。
- 複数行のブロックのカーリーを開く前のスペース。
- カーリーを含め、1行のブロックを1行に配置できます。
- セミコロンの前にスペースはありません。
- 「短い」1行のブロックではセミコロンが省略されています。
- ほとんどのオペレーターの周りのスペース。
- 「複雑な」添え字の周りのスペース(角かっこ内)。
- 異なることを行うチャンク間の空白行。
- 抱きしめられていない他の人。
- 関数名とその開き括弧の間にスペースはありません。
- 各コンマの後にスペースを入れます。
- 演算子の後に長い行が壊れています(andおよびorを除く)。
- 現在の行で最後の括弧が一致した後のスペース。
- 対応するアイテムを縦に並べます。
- 明瞭さが損なわれない限り、冗長な句読点は省略してください。
考えるべき他のより実質的なスタイルの問題がいくつかあります。特定の方法で何かを実行できるからといって、その方法で実行する必要があるとは限りません。Perlは、何かを行うためのいくつかの方法を提供するように設計されているため、最も読みやすい方法を選択することを検討してください。たとえば-
open(FOO,$foo) || die "Can't open $foo: $!";
−よりも優れている
die "Can't open $foo: $!" unless open(FOO,$foo);
2番目の方法は、ステートメントの要点を修飾子で隠すためです。一方、
print "Starting analysis\n" if $verbose;
−よりも優れている
$verbose && print "Starting analysis\n";
重要なのは、ユーザーが-vを入力したかどうかではないからです。
Perlが最後の演算子を提供しているので、途中で終了できる場合は、愚かなゆがみを経て上部または下部のループを終了しないでください。少しだけ「インデント」して、見やすくします-
LINE:
for (;;) {
statements;
last LINE if $foo;
next LINE if /^#/;
statements;
}
さらにいくつかの重要なポイントを見てみましょう-
ループラベルを使用することを恐れないでください。ループラベルは、読みやすさを向上させ、マルチレベルのループブレークを可能にするためにあります。前の例を参照してください。
無効なコンテキストで、つまり戻り値を破棄する場合は、grep()(またはmap())または `backticks`を使用しないでください。これらの関数はすべて戻り値を持っているので、それらを使用してください。それ以外の場合は、代わりにforeach()ループまたはsystem()関数を使用してください。
移植性のために、すべてのマシンに実装されていない可能性のある機能を使用する場合は、evalで構成をテストして、失敗するかどうかを確認してください。特定の機能が実装されたバージョンまたはパッチレベルがわかっている場合は、$](英語では$ PERL_VERSION)をテストして、そこにあるかどうかを確認できます。Configモジュールを使用すると、Perlのインストール時にConfigureプログラムによって決定された値を調べることもできます。
ニーモニック識別子を選択します。ニーモニックの意味を思い出せない場合は、問題があります。
$ gotitのような短い識別子はおそらく問題ありませんが、長い識別子の単語を区切るにはアンダースコアを使用してください。一般的に読みやすいです$var_names_like_this than $VarNamesLikeThis、特に英語を母国語としない人向け。これは、VAR_NAMES_LIKE_THISと一貫して機能する単純なルールでもあります。
パッケージ名は、この規則の例外である場合があります。Perlは、integerやstrictなどの「プラグマ」モジュール用に小文字のモジュール名を非公式に予約しています。他のモジュールは大文字で始まり、大文字と小文字を混在させる必要がありますが、プリミティブファイルシステムのモジュール名を数バイトに収まらなければならないファイルとして表現する際の制限により、おそらくアンダースコアは使用しません。
非常に毛深い正規表現がある場合は、/ x修飾子を使用し、空白を入れて、ラインノイズのように見えないようにします。正規表現にスラッシュまたはバックスラッシュがある場合は、区切り文字としてスラッシュを使用しないでください。
システムコールの戻りコードを常に確認してください。適切なエラーメッセージはSTDERRに送信され、問題の原因となったプログラム、失敗したシステムコールと引数が含まれ、(非常に重要)問題の原因に関する標準のシステムエラーメッセージが含まれている必要があります。これは単純ですが十分な例です-
opendir(D, $dir) or die "can't opendir $dir: $!";
再利用性について考えてください。もう一度そのようなことをしたいと思うかもしれないのに、なぜワンショットで頭脳を無駄にするのですか?コードを一般化することを検討してください。モジュールまたはオブジェクトクラスの作成を検討してください。厳密に使用し、警告(または-w)を有効にして、コードをクリーンに実行することを検討してください。コードを配布することを検討してください。全世界観を変えることを検討してください。考えてみてください...ああ、気にしないでください。
一貫性を保つ。
優しくしてください。
正規表現は、表示している1つまたは複数のパターンを定義する文字列です。Perlの正規表現の構文は、他の正規表現内にあるものと非常によく似ています。sed、 grep、および awk。
正規表現を適用するための基本的な方法は、パターンバインディング演算子=〜およびを使用することです。 !〜。最初の演算子は、テストおよび代入演算子です。
Perlには3つの正規表現演算子があります。
- 正規表現に一致-m //
- 正規表現の置換-s ///
- 文字変換正規表現-tr ///
いずれの場合も、スラッシュは、指定する正規表現(regex)の区切り文字として機能します。他の区切り文字に慣れている場合は、スラッシュの代わりに使用できます。
一致演算子
一致演算子m //は、文字列またはステートメントを正規表現に一致させるために使用されます。たとえば、文字シーケンス「foo」をスカラー$ barと照合するには、次のようなステートメントを使用します。
#!/usr/bin/perl
$bar = "This is foo and again foo"; if ($bar =~ /foo/) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo"; if ($bar =~ /foo/) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
上記のプログラムを実行すると、次の結果が得られます。
First time is matching
Second time is matching
m //は、実際にはq //演算子シリーズと同じように機能します。自然に一致する文字の任意の組み合わせを使用して、式の区切り文字として機能させることができます。たとえば、m {}、m()、およびm> <はすべて有効です。したがって、上記の例は次のように書き直すことができます-
#!/usr/bin/perl
$bar = "This is foo and again foo"; if ($bar =~ m[foo]) {
print "First time is matching\n";
} else {
print "First time is not matching\n";
}
$bar = "foo"; if ($bar =~ m{foo}) {
print "Second time is matching\n";
} else {
print "Second time is not matching\n";
}
区切り文字がスラッシュの場合はm //からmを省略できますが、他のすべての区切り文字にはmプレフィックスを使用する必要があります。
一致式全体、つまり=〜または!〜の左側の式と一致演算子は、式が一致した場合に(スカラーコンテキストで)trueを返すことに注意してください。したがって、ステートメント-
$true = ($foo =~ m/foo/);
設定します $true to 1 if $fooは正規表現に一致します。一致が失敗した場合は0です。リストコンテキストでは、一致はグループ化された式の内容を返します。たとえば、時間文字列から時間、分、秒を抽出する場合、-を使用できます。
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
一致演算子修飾子
一致演算子は、独自の修飾子のセットをサポートします。/ g修飾子を使用すると、グローバルマッチングが可能になります。/ i修飾子は、大文字と小文字を区別しません。これが修飾子の完全なリストです
シニア番号 | 修飾子と説明 |
---|---|
1 | i 大文字と小文字を区別しないようにします。 |
2 | m 文字列に改行文字またはキャリッジリターン文字がある場合、^および$演算子が、文字列の境界ではなく、改行の境界と一致するようになることを指定します。 |
3 | o 式を1回だけ評価します。 |
4 | s の使用を許可します。改行文字と一致します。 |
5 | x わかりやすくするために、式で空白を使用できます。 |
6 | g すべての一致をグローバルに検索します。 |
7 | cg グローバル一致が失敗した後でも検索を続行できるようにします。 |
一度だけマッチング
一致演算子のより単純なバージョンである「PATTERN」もあります。オペレーター。これは基本的にm //演算子と同じですが、リセットする各呼び出しの間に検索する文字列内で1回だけ一致する点が異なります。
たとえば、これを使用して、リスト内の最初と最後の要素を取得できます-
#!/usr/bin/perl
@list = qw/food foosball subeo footnote terfoot canic footbrdige/;
foreach (@list) {
$first = $1 if /(foo.*?)/; $last = $1 if /(foo.*)/; } print "First: $first, Last: $last\n";
上記のプログラムを実行すると、次の結果が得られます。
First: foo, Last: footbrdige
正規表現変数
正規表現変数には次のものがあります $、最後に一致したグループ化の一致が含まれます。 $&、一致した文字列全体が含まれます。 $`、一致した文字列の前のすべてが含まれます。そして$'、一致した文字列の後のすべてが含まれます。次のコードは結果を示しています-
#!/usr/bin/perl
$string = "The food is in the salad bar";
$string =~ m/foo/; print "Before: $`\n";
print "Matched: $&\n"; print "After: $'\n";
上記のプログラムを実行すると、次の結果が得られます。
Before: The
Matched: foo
After: d is in the salad bar
代替オペレーター
置換演算子s ///は、実際には一致演算子の単なる拡張であり、一致したテキストを新しいテキストに置き換えることができます。演算子の基本的な形式は次のとおりです。
s/PATTERN/REPLACEMENT/;
PATTERNは、探しているテキストの正規表現です。REPLACEMENTは、見つかったテキストを置き換えるために使用するテキストまたは正規表現の仕様です。たとえば、次のすべてのオカレンスを置き換えることができますdog と cat 次の正規表現を使用する-
#/user/bin/perl
$string = "The cat sat on the mat"; $string =~ s/cat/dog/;
print "$string\n";
上記のプログラムを実行すると、次の結果が得られます。
The dog sat on the mat
置換演算子修飾子
置換演算子で使用されるすべての修飾子のリストは次のとおりです。
シニア番号 | 修飾子と説明 |
---|---|
1 | i 大文字と小文字を区別しないようにします。 |
2 | m 文字列に改行文字またはキャリッジリターン文字がある場合、^および$演算子が、文字列の境界ではなく、改行の境界と一致するようになることを指定します。 |
3 | o 式を1回だけ評価します。 |
4 | s の使用を許可します。改行文字と一致します。 |
5 | x わかりやすくするために、式で空白を使用できます。 |
6 | g 見つかった式のすべての出現箇所を置換テキストで置き換えます。 |
7 | e Perlステートメントであるかのように置換を評価し、その戻り値を置換テキストとして使用します。 |
翻訳演算子
翻訳は置換の原則と似ていますが、同一ではありませんが、置換とは異なり、変換(または音訳)は置換値の検索に正規表現を使用しません。並進演算子は-
tr/SEARCHLIST/REPLACEMENTLIST/cds
y/SEARCHLIST/REPLACEMENTLIST/cds
変換により、SEARCHLIST内のすべての出現箇所の文字が、REPLACEMENTLIST内の対応する文字に置き換えられます。たとえば、「猫はマットの上に座っていました」を使用します。この章で使用している文字列-
#/user/bin/perl
$string = 'The cat sat on the mat'; $string =~ tr/a/o/;
print "$string\n";
上記のプログラムを実行すると、次の結果が得られます。
The cot sot on the mot.
標準のPerl範囲も使用できるため、文字または数値のいずれかで文字の範囲を指定できます。文字列の大文字と小文字を変更するには、の代わりに次の構文を使用できます。uc 関数。
$string =~ tr/a-z/A-Z/;
並進演算子修飾子
以下は、翻訳に関連する演算子のリストです。
シニア番号 | 修飾子と説明 |
---|---|
1 | c SEARCHLISTを補完します。 |
2 | d 見つかったが置き換えられていない文字を削除します。 |
3 | s 置き換えられた文字を重複して押しつぶします。 |
/ d修飾子は、REPLACEMENTLISTに対応するエントリがないSEARCHLISTに一致する文字を削除します。例-
#!/usr/bin/perl
$string = 'the cat sat on the mat.'; $string =~ tr/a-z/b/d;
print "$string\n";
上記のプログラムを実行すると、次の結果が得られます。
b b b.
最後の修飾子/ sは、置き換えられた文字の重複シーケンスを削除するため、-
#!/usr/bin/perl
$string = 'food';
$string = 'food'; $string =~ tr/a-z/a-z/s;
print "$string\n";
上記のプログラムを実行すると、次の結果が得られます。
fod
より複雑な正規表現
固定文字列で一致する必要はありません。実際、より複雑な正規表現を使用することで、夢見ることができるほぼすべてのものに一致させることができます。これが簡単なチートシートです-
次の表に、Pythonで使用できる正規表現の構文を示します。
シニア番号 | パターンと説明 |
---|---|
1 | ^ 行頭に一致します。 |
2 | $ 行末に一致します。 |
3 | . 改行以外の任意の1文字に一致します。mオプションを使用すると、改行にも一致させることができます。 |
4 | [...] 角かっこ内の任意の1文字に一致します。 |
5 | [^...] 角かっこで囲まれていない任意の1文字に一致します。 |
6 | * 先行する式の0回以上の出現に一致します。 |
7 | + 前の式の1つ以上のオカレンスに一致します。 |
8 | ? 前の式の0または1回の出現に一致します。 |
9 | { n} 先行する式のn回の出現に正確に一致します。 |
10 | { n,} 先行する式のn回以上の出現に一致します。 |
11 | { n, m} 先行する式の少なくともn回および最大m回の出現に一致します。 |
12 | a| b aまたはbのいずれかに一致します。 |
13 | \w 単語の文字に一致します。 |
14 | \W 単語以外の文字に一致します。 |
15 | \s 空白に一致します。[\ t \ n \ r \ f]と同等です。 |
16 | \S 非空白に一致します。 |
17 | \d 数字と一致します。[0-9]に相当します。 |
18 | \D 数字以外に一致します。 |
19 | \A 文字列の先頭に一致します。 |
20 | \Z 文字列の終わりに一致します。改行が存在する場合は、改行の直前と一致します。 |
21 | \z 文字列の終わりに一致します。 |
22 | \G 最後の試合が終了した試合ポイント。 |
23 | \b 角かっこで囲まれていない場合、単語の境界に一致します。角かっこ内の場合、バックスペース(0x08)に一致します。 |
24 | \B 単語以外の境界に一致します。 |
25 | \n, \t, etc. 改行、キャリッジリターン、タブなどに一致します。 |
26 | \1...\9 n番目のグループ化された部分式に一致します。 |
27 | \10 すでに一致している場合は、n番目のグループ化された部分式に一致します。それ以外の場合は、文字コードの8進表現を指します。 |
28 | [aeiou] 指定されたセットの1文字に一致します |
29 | [^aeiou] 指定されたセット外の単一の文字に一致します |
^メタ文字は文字列の先頭に一致し、$メタ記号は文字列の末尾に一致します。ここにいくつかの簡単な例があります。
# nothing in the string (start and end are adjacent)
/^$/
# a three digits, each followed by a whitespace
# character (eg "3 4 5 ")
/(\d\s) {3}/
# matches a string in which every
# odd-numbered letter is a (eg "abacadaf")
/(a.)+/
# string starts with one or more digits
/^\d+/
# string that ends with one or more digits
/\d+$/
別の例を見てみましょう。
#!/usr/bin/perl
$string = "Cats go Catatonic\nWhen given Catnip";
($start) = ($string =~ /\A(.*?) /);
@lines = $string =~ /^(.*?) /gm; print "First word: $start\n","Line starts: @lines\n";
上記のプログラムを実行すると、次の結果が得られます。
First word: Cats
Line starts: Cats When
一致する境界
ザ・ \b\ wクラスと\ Wクラスの違いによって定義されるように、任意の単語境界で一致します。\ wには単語の文字が含まれ、\ Wにはその逆であるため、これは通常、単語の終了を意味します。ザ・\Bアサーションは、単語の境界ではない任意の位置に一致します。例-
/\bcat\b/ # Matches 'the cat sat' but not 'cat on the mat'
/\Bcat\B/ # Matches 'verification' but not 'the cat on the mat'
/\bcat\B/ # Matches 'catatonic' but not 'polecat'
/\Bcat\b/ # Matches 'polecat' but not 'catatonic'
選択肢の選択
| 文字は、Perl内の標準またはビット単位のORとまったく同じです。正規表現またはグループ内の代替一致を指定します。たとえば、式の「cat」または「dog」を照合するには、次のように使用します。
if ($string =~ /cat|dog/)
複雑な一致をサポートするために、式の個々の要素をグループ化できます。2人の名前の検索は、次のように2つの別々のテストで実行できます。
if (($string =~ /Martin Brown/) || ($string =~ /Sharon Brown/)) This could be written as follows if ($string =~ /(Martin|Sharon) Brown/)
グループ化マッチング
正規表現の観点からは、前者がわずかに明確であることを除いて、違いはありません。
$string =~ /(\S+)\s+(\S+)/; and $string =~ /\S+\s+\S+/;
ただし、グループ化の利点は、正規表現からシーケンスを抽出できることです。グループ化は、元のグループに表示されている順序でリストとして返されます。たとえば、次のフラグメントでは、文字列から時間、分、秒を取り出しています。
my ($hours, $minutes, $seconds) = ($time =~ m/(\d+):(\d+):(\d+)/);
この直接法に加えて、一致したグループは、特別な$ x変数内でも使用できます。ここで、xは正規表現内のグループの番号です。したがって、前の例を次のように書き直すことができます。
#!/usr/bin/perl
$time = "12:05:30";
$time =~ m/(\d+):(\d+):(\d+)/; my ($hours, $minutes, $seconds) = ($1, $2, $3); print "Hours : $hours, Minutes: $minutes, Second: $seconds\n";
上記のプログラムを実行すると、次の結果が得られます。
Hours : 12, Minutes: 05, Second: 30
置換式でグループを使用する場合、置換テキストで$ x構文を使用できます。したがって、これを使用して日付文字列を再フォーマットできます。
#!/usr/bin/perl
$date = '03/26/1999';
$date =~ s#(\d+)/(\d+)/(\d+)#$3/$1/$2#;
print "$date\n";
上記のプログラムを実行すると、次の結果が得られます。
1999/03/26
\ Gアサーション
\ Gアサーションを使用すると、最後の一致が発生したポイントから検索を続行できます。たとえば、次のコードでは、\ Gを使用して、より複雑な単一の正規表現を作成しなくても、正しい位置を検索して情報を抽出できるようにしています。
#!/usr/bin/perl
$string = "The time is: 12:31:02 on 4/12/00";
$string =~ /:\s+/g; ($time) = ($string =~ /\G(\d+:\d+:\d+)/); $string =~ /.+\s+/g;
($date) = ($string =~ m{\G(\d+/\d+/\d+)});
print "Time: $time, Date: $date\n";
上記のプログラムを実行すると、次の結果が得られます。
Time: 12:31:02, Date: 4/12/00
\ Gアサーションは、実際にはpos関数と同等のメタシンボルであるため、正規表現の呼び出し間で引き続きposを使用でき、posを左辺値サブルーチンとして使用してposの値(したがって\ G)を変更することもできます。
正規表現の例
リテラル文字
シニア番号 | 例と説明 |
---|---|
1 | Perl 「Perl」に一致します。 |
キャラクタークラス
シニア番号 | 例と説明 |
---|---|
1 | [Pp]ython 「Python」または「python」に一致 |
2 | rub[ye] 「ルビー」または「ルビー」に一致 |
3 | [aeiou] 任意の1つの小文字の母音に一致します |
4 | [0-9] 任意の数字に一致します。[0123456789]と同じ |
5 | [a-z] 任意の小文字のASCII文字に一致します |
6 | [A-Z] 任意の大文字のASCII文字に一致します |
7 | [a-zA-Z0-9] 上記のいずれかに一致します |
8 | [^aeiou] 小文字の母音以外に一致します |
9 | [^0-9] 数字以外のものと一致します |
特殊文字クラス
シニア番号 | 例と説明 |
---|---|
1 | . 改行以外のすべての文字に一致します |
2 | \d 数字に一致:[0-9] |
3 | \D 数字以外に一致:[^ 0-9] |
4 | \s 空白文字に一致します:[\ t \ r \ n \ f] |
5 | \S 非空白に一致:[^ \ t \ r \ n \ f] |
6 | \w 1つの単語の文字に一致します:[A-Za-z0-9_] |
7 | \W 単語以外の文字に一致します:[^ A-Za-z0-9_] |
繰り返しの場合
シニア番号 | 例と説明 |
---|---|
1 | ruby? 「rub」または「ruby」に一致:yはオプションです |
2 | ruby* 「摩擦」に0以上のysを加えたものに一致します |
3 | ruby+ 「摩擦」と1つ以上のysに一致 |
4 | \d{3} 正確に3桁に一致 |
5 | \d{3,} 3桁以上に一致 |
6.6。 | \d{3,5} 3、4、または5桁に一致 |
貪欲でない繰り返し
これは最小の繰り返し数に一致します-
シニア番号 | 例と説明 |
---|---|
1 | <.*> 貪欲な繰り返し:「<python> perl>」に一致 |
2 | <.*?> 貪欲でない:「<python> perl>」の「<python>」に一致します |
括弧でグループ化
シニア番号 | 例と説明 |
---|---|
1 | \D\d+ グループなし:+繰り返し\ d |
2 | (\D\d)+ グループ化:+ \ D \ dペアを繰り返す |
3 | ([Pp]ython(, )?)+ 「Python」、「Python、python、python」などに一致します。 |
後方参照
これは、以前に一致したグループと再び一致します-
シニア番号 | 例と説明 |
---|---|
1 | ([Pp])ython&\1ails python&pailsまたはPython&Pailsに一致します |
2 | (['"])[^\1]*\1 一重引用符または二重引用符で囲まれた文字列。\ 1は、最初のグループが一致したものに一致します。\ 2は、2番目のグループが一致したものに一致します。 |
代替案
シニア番号 | 例と説明 |
---|---|
1 | python|perl 「python」または「perl」に一致します |
2 | rub(y|le)) 「ルビー」または「ルーブル」に一致 |
3 | Python(!+|\?) 「Python」の後に1つ以上!または1つ? |
アンカー
これは一致位置を指定する必要があります。
シニア番号 | 例と説明 |
---|---|
1 | ^Python 文字列または内部行の先頭にある「Python」と一致します |
2 | Python$ 文字列または行の末尾の「Python」に一致します |
3 | \APython 文字列の先頭にある「Python」と一致します |
4 | Python\Z 文字列の末尾の「Python」に一致します |
5 | \bPython\b 単語の境界で「Python」に一致 |
6 | \brub\B \ Bは単語以外の境界です:「rube」と「ruby」の「rub」に一致しますが、単独では一致しません |
7 | Python(?=!) 感嘆符が続く場合は、「Python」に一致します |
8 | Python(?!!) 感嘆符が続かない場合は、「Python」に一致します |
括弧付きの特別な構文
シニア番号 | 例と説明 |
---|---|
1 | R(?#comment) 「R」に一致します。残りはすべてコメントです |
2 | R(?i)uby 「uby」との照合では大文字と小文字を区別しない |
3 | R(?i:uby) 同上 |
4 | rub(?:y|le)) \ 1後方参照を作成せずにグループ化のみ |
sendmailユーティリティの使用
プレーンメッセージの送信
Linux / Unixマシンで作業している場合は、単に使用できます sendmail電子メールを送信するためのPerlプログラム内のユーティリティ。これは、特定の電子メールIDに電子メールを送信できるサンプルスクリプトです。sendmailユーティリティの指定されたパスが正しいことを確認してください。これは、Linux / Unixマシンによって異なる場合があります。
#!/usr/bin/perl
$to = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
実際、上記のスクリプトはクライアントの電子メールスクリプトであり、電子メールのドラフトを作成し、Linux / Unixマシンでローカルに実行されているサーバーに送信します。このスクリプトは、実際の宛先に電子メールを送信する責任を負いません。したがって、指定された電子メールIDに電子メールを送信するには、電子メールサーバーが適切に構成され、マシン上で実行されていることを確認する必要があります。
HTMLメッセージの送信
sendmailを使用してHTML形式の電子メールを送信する場合は、追加するだけです。 Content-type: text/html\n 次のように電子メールのヘッダー部分に-
#!/usr/bin/perl
$to = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; open(MAIL, "|/usr/sbin/sendmail -t"); # Email Header print MAIL "To: $to\n";
print MAIL "From: $from\n"; print MAIL "Subject: $subject\n\n";
print MAIL "Content-type: text/html\n";
# Email Body
print MAIL $message;
close(MAIL);
print "Email Sent Successfully\n";
MIME :: Liteモジュールの使用
Windowsマシンで作業している場合は、sendmailユーティリティにアクセスできません。ただし、MIME:Liteperlモジュールを使用して独自の電子メールクライアントを作成する方法もあります。このモジュールはMIME-Lite-3.01.tar.gzからダウンロードして、WindowsまたはLinux / Unixのいずれかのマシンにインストールできます。インストールするには、簡単な手順に従ってください-
$tar xvfz MIME-Lite-3.01.tar.gz
$cd MIME-Lite-3.01 $perl Makefile.PL
$make $make install
これで、MIME :: Liteモジュールがマシンにインストールされます。これで、以下で説明する簡単なスクリプトを使用してメールを送信する準備が整いました。
プレーンメッセージの送信
次に、指定された電子メールIDに電子メールを送信するスクリプトを示します-
#!/usr/bin/perl
use MIME::Lite;
$to = '[email protected]'; $cc = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = 'This is test email sent by Perl Script'; $msg = MIME::Lite->new(
From => $from, To => $to,
Cc => $cc, Subject => $subject,
Data => $message ); $msg->send;
print "Email Sent Successfully\n";
HTMLメッセージの送信
sendmailを使用してHTML形式の電子メールを送信する場合は、追加するだけです。 Content-type: text/html\nメールのヘッダー部分にあります。以下は、HTML形式の電子メールの送信を処理するスクリプトです-
#!/usr/bin/perl
use MIME::Lite;
$to = '[email protected]'; $cc = '[email protected]';
$from = '[email protected]'; $subject = 'Test Email';
$message = '<h1>This is test email sent by Perl Script</h1>'; $msg = MIME::Lite->new(
From => $from, To => $to,
Cc => $cc, Subject => $subject,
Data => $message ); $msg->attr("content-type" => "text/html");
$msg->send;
print "Email Sent Successfully\n";
添付ファイルの送信
添付ファイルを送信したい場合は、次のスクリプトが目的を果たします-
#!/usr/bin/perl
use MIME::Lite;
$to = '[email protected]';
$cc = '[email protected]'; $from = '[email protected]';
$subject = 'Test Email'; $message = 'This is test email sent by Perl Script';
$msg = MIME::Lite->new( From => $from,
To => $to, Cc => $cc,
Subject => $subject, Type => 'multipart/mixed' ); # Add your text message. $msg->attach(Type => 'text',
Data => $message ); # Specify your file as attachement. $msg->attach(Type => 'image/gif',
Path => '/tmp/logo.gif',
Filename => 'logo.gif',
Disposition => 'attachment'
);
$msg->send;
print "Email Sent Successfully\n";
attach()メソッドを使用して、電子メールに必要な数のファイルを添付できます。
SMTPサーバーの使用
マシンが電子メールサーバーを実行していない場合は、リモートの場所で利用可能な他の電子メールサーバーを使用できます。ただし、他の電子メールサーバーを使用するには、ID、パスワード、URLなどが必要です。必要な情報がすべて揃ったら、その情報をで提供するだけです。send() 次のような方法-
$msg->send('smtp', "smtp.myisp.net", AuthUser=>"id", AuthPass=>"password" );
電子メールサーバーの管理者に連絡して、上記の使用情報を入手できます。ユーザーIDとパスワードがまだ利用できない場合は、管理者が数分で作成できます。
ソケットとは何ですか?
Socketは、異なるプロセス間に仮想二重接続を作成するBerkeleyUNIXメカニズムです。これは後にすべての既知のOSに移植され、異なるOSソフトウェアで実行されている地理的な場所にまたがるシステム間の通信が可能になりました。ソケットがなければ、システム間のネットワーク通信のほとんどは発生しませんでした。
よく見てください。ネットワーク上の一般的なコンピュータシステムは、その上で実行されているさまざまなアプリケーションの必要に応じて情報を送受信します。一意のIPアドレスが指定されているため、この情報はシステムにルーティングされます。システムでは、この情報は、さまざまなポートでリッスンする関連アプリケーションに提供されます。たとえば、インターネットブラウザは、Webサーバーから受信した情報をポート80でリッスンします。また、特定のポート番号で情報をリッスンおよび送受信できるカスタムアプリケーションを作成することもできます。
とりあえず、ソケットはIPアドレスとポートであり、接続がネットワークを介してデータを送受信できるようにすることを要約しましょう。
上記のソケットの概念を説明するために、クライアントの例を取り上げます-Perlを使用したサーバープログラミング。クライアントサーバーアーキテクチャを完成させるには、次の手順を実行する必要があります。
サーバーを作成するには
を使用してソケットを作成します socket コール。
を使用してソケットをポートアドレスにバインドします bind コール。
を使用してポートアドレスでソケットをリッスンします listen コール。
を使用してクライアント接続を受け入れる accept コール。
クライアントを作成するには
でソケットを作成します socket コール。
を使用して(ソケット)をサーバーに接続します connect コール。
次の図は、クライアントとサーバーが相互に通信するために使用する呼び出しの完全なシーケンスを示しています。
サーバー側のソケット呼び出し
socket()呼び出し
ザ・ socket()呼び出しは、ネットワーク接続を確立する最初の呼び出しであり、ソケットを作成します。この呼び出しの構文は次のとおりです-
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
上記の呼び出しはSOCKETを作成し、他の3つの引数は整数であり、TCP / IP接続に対して次の値を持つ必要があります。
DOMAINPF_INETである必要があります。お使いのコンピュータではおそらく2です。
TYPE TCP / IP接続の場合はSOCK_STREAMである必要があります。
PROTOCOL する必要があります (getprotobyname('tcp'))[2]。ソケットを介して話されるのは、TCPなどの特定のプロトコルです。
したがって、サーバーによって発行されるソケット関数呼び出しは次のようになります-
use Socket # This defines PF_INET and SOCK_STREAM
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
bind()呼び出し
socket()呼び出しによって作成されたソケットは、ホスト名とポート番号にバインドされるまで役に立ちません。サーバーは以下を使用しますbind() クライアントからの接続を受け入れるポートを指定する関数。
bind( SOCKET, ADDRESS );
ここで、SOCKETはsocket()呼び出しによって返される記述子であり、ADDRESSは3つの要素を含むソケットアドレス(TCP / IPの場合)です。
アドレスファミリ(TCP / IPの場合、AF_INET、おそらくシステムでは2)。
ポート番号(たとえば21)。
コンピューターのインターネットアドレス(たとえば、10.12.12.168)。
bind()はサーバーによって使用されるため、サーバーは自身のアドレスを知る必要がないため、引数リストは次のようになります。
use Socket # This defines PF_INET and SOCK_STREAM
$port = 12345; # The unique port used by the sever to listen requests $server_ip_address = "10.12.12.168";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address)))
or die "Can't bind to port $port! \n";
ザ・ or die サーバーが未処理の接続なしで停止した場合、オプションSO_REUSEADDRを使用しない限り、ポートはすぐに再利用できないため、この句は非常に重要です。 setsockopt()関数。ここにpack_sockaddr_in() 関数は、ポートとIPアドレスをバイナリ形式にパックするために使用されています。
listen()呼び出し
これがサーバープログラムの場合は、に呼び出しを発行する必要があります listen()指定されたポートでリッスンします。つまり、着信要求を待ちます。この呼び出しの構文は次のとおりです-
listen( SOCKET, QUEUESIZE );
上記の呼び出しは、socket()呼び出しによって返されるSOCKET記述子を使用します。QUEUESIZEは、同時に許可される未処理の接続要求の最大数です。
accept()呼び出し
これがサーバープログラムの場合は、に呼び出しを発行する必要があります access()着信接続を受け入れる機能。この呼び出しの構文は次のとおりです-
accept( NEW_SOCKET, SOCKET );
accept呼び出しはsocket()関数によって返されるSOCKET記述子を受信し、正常に完了すると、クライアントとサーバー間の今後のすべての通信のために新しいソケット記述子NEW_SOCKETが返されます。access()呼び出しが失敗すると、最初に使用したSocketモジュールで定義されているFLASEが返されます。
一般に、accept()は無限ループで使用されます。1つの接続が到着するとすぐに、サーバーはそれを処理するための子プロセスを作成するか、それを自分で提供してから、さらに接続をリッスンするために戻ります。
while(1) {
accept( NEW_SOCKET, SOCKT );
.......
}
これで、サーバーに関連するすべての呼び出しが終了し、クライアントが必要とする呼び出しを確認できます。
クライアント側のソケット呼び出し
connect()呼び出し
クライアントプログラムを準備する場合は、最初に使用します socket() ソケットを作成するために呼び出すと、使用する必要があります connect()サーバーに接続するために呼び出します。すでにsocket()呼び出しの構文を見てきましたが、サーバーのsocket()呼び出しと同様のままですが、ここに次の構文があります。connect() 呼び出し-
connect( SOCKET, ADDRESS );
ここで、SCOKETは、クライアントによって発行されたsocket()呼び出しによって返されるソケット記述子であり、ADDRESSは、リモートサーバーのIPアドレスが含まれていることを除いて、バインド呼び出しと同様のソケットアドレスです。
$port = 21; # For example, the ftp port
$server_ip_address = "10.12.12.168"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "Can't connect to port $port! \n";
サーバーに正常に接続できれば、SOCKET記述子を使用してサーバーへのコマンドの送信を開始できます。そうしないと、エラーメッセージが表示されてクライアントが出てきます。
クライアント-サーバーの例
以下は、Perlソケットを使用して単純なクライアントサーバープログラムを実装するためのPerlコードです。ここで、サーバーは着信要求をリッスンし、接続が確立されると、サーバーからSmileに応答するだけです。クライアントはそのメッセージを読み、画面に印刷します。サーバーとクライアントが同じマシン上にあると仮定して、それがどのように行われたかを見てみましょう。
サーバーを作成するためのスクリプト
#!/usr/bin/perl -w
# Filename : server.pl
use strict;
use Socket;
# use port 7890 as default
my $port = shift || 7890; my $proto = getprotobyname('tcp');
my $server = "localhost"; # Host IP running the server # create a socket, make it reusable socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't open socket $!\n"; setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";
# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't bind to port $port! \n"; listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n"; # accepting a connection my $client_addr;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) { # send them a message, close connection my $name = gethostbyaddr($client_addr, AF_INET ); print NEW_SOCKET "Smile from the server"; print "Connection recieved from $name\n";
close NEW_SOCKET;
}
サーバーをバックグラウンドモードで実行するには、Unixプロンプトで次のコマンドを発行します-
$perl sever.pl&
クライアントを作成するためのスクリプト
!/usr/bin/perl -w
# Filename : client.pl
use strict;
use Socket;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890; my $server = "localhost"; # Host IP running the server
# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $!\n"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "Can't connect to port $port! \n";
my $line; while ($line = <SOCKET>) {
print "$line\n"; } close SOCKET or die "close: $!";
次に、コマンドプロンプトでクライアントを起動します。コマンドプロンプトはサーバーに接続し、サーバーから送信されたメッセージを読み取り、次のように画面に表示します。
$perl client.pl
Smile from the server
NOTE −実際のIPアドレスをドット表記で指定する場合は、混乱を避けるために、クライアントとサーバーの両方で同じ形式のIPアドレスを指定することをお勧めします。
PerlおよびPerlの匿名配列とハッシュでの参照についてはすでに検討しました。Perlのオブジェクト指向の概念は、参照と匿名の配列とハッシュに非常に基づいています。オブジェクト指向Perlの基本的な概念を学び始めましょう。
オブジェクトの基本
Perlがオブジェクトを処理する方法の観点から説明される、3つの主要な用語があります。用語は、オブジェクト、クラス、およびメソッドです。
アン objectPerl内では、それがどのクラスに属しているかを知っているデータ型への参照にすぎません。オブジェクトは、参照としてスカラー変数に格納されます。スカラーにはオブジェクトへの参照のみが含まれるため、同じスカラーが異なるクラスの異なるオブジェクトを保持できます。
A class Perl内には、オブジェクトの作成と操作に必要な対応するメソッドを含むパッケージがあります。
A methodPerl内には、パッケージで定義されたサブルーチンがあります。メソッドの最初の引数は、メソッドが現在のオブジェクトまたはクラスのどちらに影響するかに応じて、オブジェクト参照またはパッケージ名です。
Perlは bless() 最終的にオブジェクトになる参照を返すために使用される関数。
クラスの定義
Perlでクラスを定義するのは非常に簡単です。クラスは、最も単純な形式のPerlパッケージに対応しています。Perlでクラスを作成するには、最初にパッケージを作成します。
パッケージは、ユーザー定義の変数とサブルーチンの自己完結型のユニットであり、何度も再利用できます。
Perlパッケージは、Perlプログラム内に別個の名前空間を提供し、サブルーチンと変数が他のパッケージのものと競合しないようにします。
PerlでPersonという名前のクラスを宣言するには、次のようにします。
package Person;
パッケージ定義の範囲は、ファイルの終わりまで、または別のパッケージキーワードが見つかるまで拡張されます。
オブジェクトの作成と使用
クラス(オブジェクト)のインスタンスを作成するには、オブジェクトコンストラクターが必要です。このコンストラクターは、パッケージ内で定義されたメソッドです。ほとんどのプログラマーは、このオブジェクトコンストラクターメソッドにnewという名前を付けることを選択しますが、Perlでは任意の名前を使用できます。
Perlでは、あらゆる種類のPerl変数をオブジェクトとして使用できます。ほとんどのPerlプログラマーは、配列またはハッシュへの参照を選択します。
Perlハッシュ参照を使用してPersonクラスのコンストラクターを作成しましょう。オブジェクトを作成するときは、コンストラクターを指定する必要があります。コンストラクターは、オブジェクト参照を返すパッケージ内のサブルーチンです。オブジェクト参照は、パッケージのクラスへの参照を祝福することによって作成されます。例-
package Person;
sub new {
my $class = shift;
my $self = { _firstName => shift, _lastName => shift, _ssn => shift, }; # Print all the values just for clarification. print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n"; print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
次に、オブジェクトを作成する方法を見てみましょう。
$object = new Person( "Mohammad", "Saleem", 23234345);
クラス変数に値を割り当てたくない場合は、コンストラクターで単純なハッシュを使用できます。例-
package Person;
sub new {
my $class = shift; my $self = {};
bless $self, $class;
return $self;
}
メソッドの定義
他のオブジェクト指向言語には、プログラマーがオブジェクトデータを直接変更することを防ぐためのデータのセキュリティの概念があり、オブジェクトデータを変更するためのアクセサーメソッドを提供します。Perlにはプライベート変数はありませんが、ヘルパーメソッドの概念を使用してオブジェクトデータを操作することはできます。
人の名を取得するためのヘルパーメソッドを定義しましょう-
sub getFirstName {
return $self->{_firstName};
}
人の名を設定する別のヘルパー関数-
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}
次に、完全な例を見てみましょう。Personパッケージとヘルパー関数をPerson.pmファイルに保持します。
#!/usr/bin/perl
package Person;
sub new {
my $class = shift; my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# Print all the values just for clarification.
print "First Name is $self->{_firstName}\n"; print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n"; bless $self, $class; return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName); return $self->{_firstName};
}
sub getFirstName {
my( $self ) = @_; return $self->{_firstName};
}
1;
それでは、employee.plファイルのPersonオブジェクトを次のように利用しましょう-
#!/usr/bin/perl
use Person;
$object = new Person( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
上記のプログラムを実行すると、次の結果が得られます。
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
継承
オブジェクト指向プログラミングには、継承と呼ばれる非常に優れた便利な概念があります。継承とは、親クラスのプロパティとメソッドが子クラスで使用できることを意味します。したがって、同じコードを何度も記述する必要はなく、親クラスを継承するだけで済みます。
たとえば、Personから継承するクラスEmployeeを作成できます。従業員は人であるため、これは「isa」関係と呼ばれます。Perlには、これを支援するための特別な変数@ISAがあります。@ISAは(メソッド)継承を管理します。
継承を使用する際に考慮すべき重要なポイントは次のとおりです-
Perlは、指定されたオブジェクトのクラスで、指定されたメソッドまたは属性、つまり変数を検索します。
Perlは、オブジェクトクラスの@ISA配列で定義されたクラスを検索します。
手順1または2でメソッドが見つからない場合、@ ISAツリーでメソッドが見つかった場合、PerlはAUTOLOADサブルーチンを使用します。
それでも一致するメソッドが見つからない場合、Perlは標準のPerlライブラリの一部として提供されるUNIVERSALクラス(パッケージ)内のメソッドを検索します。
それでもメソッドが見つからない場合、Perlはあきらめて、ランタイム例外を発生させます。
したがって、Personクラスからメソッドと属性を継承する新しいEmployeeクラスを作成するには、次のようにコーディングするだけです。このコードをEmployee.pmに保持します。
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
これで、EmployeeクラスにはPersonクラスから継承されたすべてのメソッドと属性があり、次のように使用できます。main.plファイルを使用してテストします-
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345); # Get first name which is set using constructor. $firstName = $object->getFirstName(); print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." ); # Now get first name set by helper function. $firstName = $object->getFirstName(); print "After Setting First Name is : $firstName\n";
上記のプログラムを実行すると、次の結果が得られます。
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
メソッドのオーバーライド
子クラスEmployeeは、親クラスPersonからすべてのメソッドを継承します。ただし、子クラスのこれらのメソッドをオーバーライドする場合は、独自の実装を指定することでオーバーライドできます。子クラスに関数を追加したり、親クラスの既存のメソッドの機能を追加または変更したりできます。これは次のように実行できます。Employee.pmファイルを変更します。
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
# Override constructor
sub new {
my ($class) = @_; # Call the constructor of the parent class, Person. my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
# Add few more attributes
$self->{_id} = undef; $self->{_title} = undef;
bless $self, $class;
return $self; } # Override helper function sub getFirstName { my( $self ) = @_;
# This is child class function.
print "This is child class helper function\n";
return $self->{_firstName}; } # Add more methods sub setLastName{ my ( $self, $lastName ) = @_; $self->{_lastName} = $lastName if defined($lastName);
return $self->{_lastName}; } sub getLastName { my( $self ) = @_;
return $self->{_lastName};
}
1;
ここで、main.plファイルのEmployeeオブジェクトをもう一度使用して、実行してみましょう。
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n"; # Now Set first name using helper function. $object->setFirstName( "Mohd." );
# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "After Setting First Name is : $firstName\n";
上記のプログラムを実行すると、次の結果が得られます。
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
This is child class helper function
Before Setting First Name is : Mohammad
This is child class helper function
After Setting First Name is : Mohd.
デフォルトの自動読み込み
Perlは、他のプログラミング言語にはない機能、つまりデフォルトのサブルーチンを提供します。つまり、と呼ばれる関数を定義するとAUTOLOAD(),その後、未定義のサブルーチンを呼び出すと、AUTOLOAD()関数が自動的に呼び出されます。欠落しているサブルーチンの名前は、このサブルーチン内で$ AUTOLOADとしてアクセスできます。
デフォルトの自動ロード機能は、エラー処理に非常に役立ちます。AUTOLOADを実装する例を次に示します。この関数は、独自の方法で実装できます。
sub AUTOLOAD {
my $self = shift; my $type = ref ($self) || croak "$self is not an object";
my $field = $AUTOLOAD;
$field =~ s/.*://; unless (exists $self->{$field}) { croak "$field does not exist in object/class $type"; } if (@_) { return $self->($name) = shift; } else { return $self->($name);
}
}
デストラクタとガベージコレクション
以前にオブジェクト指向プログラミングを使用してプログラミングしたことがある場合は、を作成する必要があることに気付くでしょう。 destructorオブジェクトの使用が終了したときに、オブジェクトに割り当てられたメモリを解放します。オブジェクトがスコープから外れるとすぐに、Perlはこれを自動的に行います。
ファイルのクローズや追加の処理を行うデストラクタを実装する場合は、次のような特別なメソッドを定義する必要があります。 DESTROY。このメソッドは、Perlが割り当てられたメモリを解放する直前にオブジェクトに対して呼び出されます。他のすべての点で、DESTROYメソッドは他のメソッドとまったく同じであり、このメソッド内に必要なロジックを実装できます。
デストラクタメソッドは、DESTROYという名前のメンバー関数(サブルーチン)であり、次の場合に自動的に呼び出されます。
- オブジェクト参照の変数がスコープ外になったとき。
- オブジェクト参照の変数が定義されていない場合。
- スクリプトが終了したとき
- Perlインタプリタが終了したとき
たとえば、次のメソッドDESTROYをクラスに配置するだけです。
package MyClass;
...
sub DESTROY {
print "MyClass::DESTROY called\n";
}
オブジェクト指向のPerlの例
これは、Perlのオブジェクト指向の概念を理解するのに役立つもう1つの良い例です。このソースコードを任意のperlファイルに入れて実行します。
#!/usr/bin/perl
# Following is the implementation of simple Class.
package MyClass;
sub new {
print "MyClass::new called\n";
my $type = shift; # The package/type name
my $self = {}; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MyClass::DESTROY called\n"; } sub MyMethod { print "MyClass::MyMethod called!\n"; } # Following is the implemnetation of Inheritance. package MySubClass; @ISA = qw( MyClass ); sub new { print "MySubClass::new called\n"; my $type = shift; # The package/type name
my $self = MyClass->new; # Reference to empty hash return bless $self, $type; } sub DESTROY { print "MySubClass::DESTROY called\n"; } sub MyMethod { my $self = shift;
$self->SUPER::MyMethod(); print " MySubClass::MyMethod called!\n"; } # Here is the main program using above classes. package main; print "Invoke MyClass method\n"; $myObject = MyClass->new();
$myObject->MyMethod(); print "Invoke MySubClass method\n"; $myObject2 = MySubClass->new();
$myObject2->MyMethod(); print "Create a scoped object\n"; { my $myObject2 = MyClass->new();
}
# Destructor is called automatically here
print "Create and undef an object\n";
$myObject3 = MyClass->new(); undef $myObject3;
print "Fall off the end of the script...\n";
# Remaining destructors are called automatically here
上記のプログラムを実行すると、次の結果が得られます。
Invoke MyClass method
MyClass::new called
MyClass::MyMethod called!
Invoke MySubClass method
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
MySubClass::MyMethod called!
Create a scoped object
MyClass::new called
MyClass::DESTROY called
Create and undef an object
MyClass::new called
MyClass::DESTROY called
Fall off the end of the script...
MyClass::DESTROY called
MySubClass::DESTROY called
この章では、Perlスクリプト内のデータベースにアクセスする方法について説明します。Perl 5以降、を使用してデータベースアプリケーションを作成するのが非常に簡単になりました。DBIモジュール。DBIの略Database Independent Interface Perlの場合、これはDBIがPerlコードと基礎となるデータベースの間に抽象化レイヤーを提供し、データベースの実装を非常に簡単に切り替えることができることを意味します。
DBIは、Perlプログラミング言語用のデータベースアクセスモジュールです。これは、使用されている実際のデータベースに関係なく、一貫したデータベースインターフェイスを提供する一連のメソッド、変数、および規則を提供します。
DBIアプリケーションのアーキテクチャ
DBIは、バックエンドで使用可能なデータベースから独立しています。Oracle、MySQL、Informixなどを使用している場合でも、DBIを使用できます。これは次のアーキテクチャ図から明らかです。
ここで、DBIは、API(つまり、アプリケーションプログラミングインターフェイス)を介してすべてのSQLコマンドを取得し、実際に実行するためにそれらを適切なドライバーにディスパッチする責任があります。そして最後に、DBIはドライバーから結果を取得し、それを呼び出し元のスクリプトに返す責任があります。
表記法と規則
この章全体を通して、次の表記法が使用されます。同じ規則に従うことをお勧めします。
$dsn Database source name $dbh Database handle object
$sth Statement handle object $h Any of the handle types above ($dbh, $sth, or $drh) $rc General Return Code (boolean: true=ok, false=error)
$rv General Return Value (typically an integer) @ary List of values returned from the database. $rows Number of rows processed (if available, else -1)
$fh A filehandle
undef NULL values are represented by undefined values in Perl
\%attr Reference to a hash of attribute values passed to methods
データベース接続
MySQLデータベースを使用することを想定しています。データベースに接続する前に、次のことを確認してください。MySQLデータベースでデータベースとテーブルを作成する方法がわからない場合は、MySQLチュートリアルを利用できます。
TESTDBという名前のデータベースを作成しました。
TESTDBにTEST_TABLEという名前のテーブルを作成しました。
このテーブルには、FIRST_NAME、LAST_NAME、AGE、SEX、およびINCOMEのフィールドがあります。
TESTDBにアクセスするためのユーザーID「testuser」とパスワード「test123」が設定されています。
PerlモジュールDBIがマシンに正しくインストールされています。
MySQLの基本を理解するためにMySQLチュートリアルを完了しました。
以下は、MySQLデータベース「TESTDB」との接続例です。
#!/usr/bin/perl
use DBI
use strict;
my $driver = "mysql";
my $database = "TESTDB"; my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser"; my $password = "test123";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
データソースとの接続が確立された場合、データベースハンドルが返され、さらに使用するために$ dbhに保存されます。それ以外の場合、$ dbhはundef値に設定され、$ DBI :: errstrはエラー文字列を返します。
INSERT操作
一部のレコードをテーブルに作成する場合は、INSERT操作が必要です。ここでは、テーブルTEST_TABLEを使用してレコードを作成しています。したがって、データベース接続が確立されると、TEST_TABLEにレコードを作成する準備が整います。以下は、TEST_TABLEに単一のレコードを作成する手順です。同じ概念を使用して、必要な数のレコードを作成できます。
レコードの作成には次の手順があります-
INSERTステートメントを使用したSQLステートメントの準備。これはを使用して行われますprepare() API。
SQLクエリを実行して、データベースからすべての結果を選択します。これはを使用して行われますexecute() API。
スタッテメントハンドルを解放します。これはを使用して行われますfinish() API。
すべてがうまくいけば、 commit この操作以外の場合はできます rollbackトランザクションを完了します。コミットとロールバックについては、次のセクションで説明します。
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish(); $dbh->commit or die $DBI::errstr;
バインド値の使用
入力する値が事前に指定されていない場合があります。したがって、実行時に必要な値をとるバインド変数を使用できます。Perl DBIモジュールは、実際の値の代わりに疑問符を使用し、実行時に実際の値がexecute()APIを介して渡されます。以下は例です-
my $first_name = "john";
my $last_name = "poul"; my $sex = "M";
my $income = 13000; my $age = 30;
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
(?,?,?,?)");
$sth->execute($first_name,$last_name,$sex, $age, $income)
or die $DBI::errstr; $sth->finish();
$dbh->commit or die $DBI::errstr;
READ操作
データベースに対するREAD操作とは、データベースからいくつかの有用な情報、つまり1つ以上のテーブルから1つ以上のレコードをフェッチすることを意味します。したがって、データベース接続が確立されると、このデータベースにクエリを実行する準備が整います。以下は、AGEが20を超えるすべてのレコードをクエリする手順です。これには4つの手順が必要です。
必要な条件に基づいてSQLSELECTクエリを準備します。これはを使用して行われますprepare() API。
SQLクエリを実行して、データベースからすべての結果を選択します。これはを使用して行われますexecute() API。
すべての結果を1つずつフェッチし、それらの結果を印刷します。これは、 fetchrow_array() API。
スタッテメントハンドルを解放します。これはを使用して行われますfinish() API。
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > 20");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows; while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
バインド値の使用
事前に条件が定められていない場合があります。したがって、実行時に必要な値をとるバインド変数を使用できます。Perl DBIモジュールは、実際の値の代わりに疑問符を使用し、実行時に実際の値がexecute()APIを介して渡されます。以下は例です-
$age = 20;
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > ?");
$sth->execute( $age ) or die $DBI::errstr; print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) { my ($first_name, $last_name ) = @row; print "First Name = $first_name, Last Name = $last_name\n"; } $sth->finish();
UPDATE操作
UPDATE操作は、データベーステーブルですでに使用可能な1つ以上のレコードを更新することを意味します。以下は、SEXが「M」であるすべてのレコードを更新する手順です。ここでは、すべての男性の年齢を1年増やします。これには3つのステップが必要です-
必要な条件に基づいてSQLクエリを準備します。これはを使用して行われますprepare() API。
SQLクエリを実行して、データベースからすべての結果を選択します。これはを使用して行われますexecute() API。
スタッテメントハンドルを解放します。これはを使用して行われますfinish() API。
すべてがうまくいけば、 commit この操作以外の場合はできます rollbackトランザクションを完了します。コミットおよびロールバックAPIについては、次のセクションを参照してください。
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = 'M'");
$sth->execute() or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
バインド値の使用
事前に条件が定められていない場合があります。したがって、実行時に必要な値をとるバインド変数を使用できます。Perl DBIモジュールは、実際の値の代わりに疑問符を使用し、実行時に実際の値がexecute()APIを介して渡されます。以下は例です-
$sex = 'M'; my $sth = $dbh->prepare("UPDATE TEST_TABLE SET AGE = AGE + 1 WHERE SEX = ?"); $sth->execute('$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
場合によっては、事前に指定されていない値を設定して、次のようにバインディング値を使用できるようにします。この例では、すべての男性の収入は10000に設定されます。
$sex = 'M'; $income = 10000;
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET INCOME = ?
WHERE SEX = ?");
$sth->execute( $income, '$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows; $sth->finish();
DELETE操作
データベースから一部のレコードを削除する場合は、DELETE操作が必要です。以下は、AGEが30に等しいTEST_TABLEからすべてのレコードを削除する手順です。この操作は次の手順を実行します。
必要な条件に基づいてSQLクエリを準備します。これはを使用して行われますprepare() API。
SQLクエリを実行して、データベースから必要なレコードを削除します。これはを使用して行われますexecute() API。
スタッテメントハンドルを解放します。これはを使用して行われますfinish() API。
すべてがうまくいけば、 commit この操作以外の場合はできます rollback トランザクションを完了します。
$age = 30; my $sth = $dbh->prepare("DELETE FROM TEST_TABLE WHERE AGE = ?"); $sth->execute( $age ) or die $DBI::errstr;
print "Number of rows deleted :" + $sth->rows; $sth->finish();
$dbh->commit or die $DBI::errstr;
doステートメントの使用
UPDATE、INSERT、またはDELETEを実行している場合、データベースから返されるデータはないため、この操作を実行するためのショートカットがあります。使用できますdo 次のようにコマンドのいずれかを実行するステートメント。
$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');
do成功した場合はtrue値を返し、失敗した場合はfalse値を返します。実際には、成功すると、影響を受ける行の数が返されます。この例では、実際に削除された行数を返します。
COMMIT操作
コミットは、変更を確定するためにデータベースに緑色の信号を与える操作であり、この操作の後、変更を元の位置に戻すことはできません。
これが呼び出す簡単な例です commit API。
$dbh->commit or die $dbh->errstr;
ロールバック操作
すべての変更に満足できない場合、または操作の間にエラーが発生した場合は、それらの変更を元に戻して使用できます。 rollback API。
これが呼び出す簡単な例です rollback API。
$dbh->rollback or die $dbh->errstr;
トランザクションを開始します
多くのデータベースはトランザクションをサポートしています。これは、データベースを変更する一連のクエリを実行できることを意味しますが、実際には変更は行われません。次に、最後に、特別なSQLクエリを発行しますCOMMIT、およびすべての変更が同時に行われます。または、クエリROLLBACKを発行することもできます。この場合、すべての変更が破棄され、データベースは変更されません。
提供されるPerlDBIモジュール begin_workAPI。コミットまたはロールバックの次の呼び出しまで(AutoCommitをオフにすることで)トランザクションを有効にします。次のコミットまたはロールバックの後、AutoCommitは自動的に再びオンになります。
$rc = $dbh->begin_work or die $dbh->errstr;
自動コミットオプション
トランザクションが単純な場合は、多くのコミットを発行する手間を省くことができます。接続呼び出しを行うときに、を指定できますAutoCommitクエリが成功するたびに自動コミット操作を実行するオプション。これがどのように見えるかです-
my $dbh = DBI->connect($dsn, $userid, $password,
{AutoCommit => 1})
or die $DBI::errstr;
ここで、AutoCommitは値1または0を取ることができます。ここで、1はAutoCommitがオンであることを意味し、0はAutoCommitがオフであることを意味します。
自動エラー処理
接続呼び出しを行うときに、エラーを自動的に処理するRaiseErrorsオプションを指定できます。エラーが発生すると、DBIは失敗コードを返す代わりにプログラムを中止します。エラーが発生したときにプログラムを中止するだけの場合は、これが便利です。これがどのように見えるかです-
my $dbh = DBI->connect($dsn, $userid, $password, {RaiseError => 1}) or die $DBI::errstr;
ここで、RaiseErrorは値1または0を取ることができます。
データベースの切断
データベース接続を切断するには、 disconnect 次のようなAPI-
$rc = $dbh->disconnect or warn $dbh->errstr;
残念ながら、切断メソッドのトランザクション動作は未定義です。一部のデータベースシステム(OracleやIngresなど)は未処理の変更を自動的にコミットしますが、他のデータベースシステム(Informixなど)は未処理の変更をロールバックします。AutoCommitを使用しないアプリケーションは、disconnectを呼び出す前に、commitまたはrollbackを明示的に呼び出す必要があります。
NULL値の使用
未定義の値、またはundefは、NULL値を示すために使用されます。NULL以外の値と同じように、NULL値で列を挿入および更新できます。これらの例では、列の経過時間をNULL値で挿入および更新します-
$sth = $dbh->prepare(qq { INSERT INTO TEST_TABLE (FIRST_NAME, AGE) VALUES (?, ?) }); $sth->execute("Joe", undef);
ここに qq{} 引用符で囲まれた文字列をに返すために使用されます prepareAPI。ただし、WHERE句でNULL値を使用する場合は注意が必要です。考えてください-
SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?
undef(NULL)をプレースホルダーにバインドしても、年齢がNULLの行は選択されません。少なくともSQL標準に準拠するデータベースエンジンの場合。この理由については、データベースエンジンのSQLマニュアルまたはSQLブックを参照してください。NULLを明示的に選択するには、「年齢がNULLである」と言う必要があります。
一般的な問題は、実行時に定義または定義解除(NULLまたはNULL以外)のいずれかである可能性のある値をコードフラグメントで処理することです。簡単な手法は、必要に応じて適切なステートメントを準備し、NULL以外の場合の代わりにプレースホルダーを使用することです。
$sql_clause = defined $age? "age = ?" : "age IS NULL";
$sth = $dbh->prepare(qq {
SELECT FIRST_NAME FROM TEST_TABLE WHERE $sql_clause }); $sth->execute(defined $age ? $age : ());
その他のDBI関数
available_drivers
@ary = DBI->available_drivers;
@ary = DBI->available_drivers($quiet);
@INCのディレクトリからDBD :: *モジュールを検索して、使用可能なすべてのドライバのリストを返します。デフォルトでは、一部のドライバーが以前のディレクトリで同じ名前の他のドライバーによって非表示になっている場合、警告が表示されます。$ quickに真の値を渡すと、警告が抑制されます。
インストールされたドライバー
%drivers = DBI->installed_drivers();
現在のプロセスに「インストール」(ロード)されたすべてのドライバーのドライバー名とドライバーハンドルのペアのリストを返します。ドライバ名には「DBD ::」プレフィックスは含まれていません。
data_sources
@ary = DBI->data_sources($driver);
指定されたドライバーを介して使用可能なデータソース(データベース)のリストを返します。$ driverが空またはundefの場合、DBI_DRIVER環境変数の値が使用されます。
見積もり
$sql = $dbh->quote($value); $sql = $dbh->quote($value, $data_type);
文字列内に含まれる特殊文字(引用符など)をエスケープし、必要なタイプの外部引用符を追加して、SQLステートメントでリテラル値として使用する文字列リテラルを引用します。
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
ほとんどのデータベースタイプでは、quoteは「Don」「t」(外側の引用符を含む)を返します。quote()メソッドが目的の文字列に評価されるSQL式を返すことは有効です。例-
$quoted = $dbh->quote("one\ntwo\0three")
may produce results which will be equivalent to
CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')
すべてのハンドルに共通のメソッド
エラー
$rv = $h->err; or $rv = $DBI::err or $rv = $h->err
最後に呼び出されたドライバメソッドからネイティブデータベースエンジンのエラーコードを返します。コードは通常整数ですが、それを想定するべきではありません。これは、$ DBI :: errまたは$ h-> errと同等です。
errstr
$str = $h->errstr; or $str = $DBI::errstr or $str = $h->errstr
最後に呼び出されたDBIメソッドからネイティブデータベースエンジンのエラーメッセージを返します。これには、上記の「err」メソッドと同じ寿命の問題があります。これは、$ DBI :: errstrまたは$ h-> errstrと同等です。
行
$rv = $h->rows; or $rv = $DBI::rows
これは、前のSQLステートメントによって影響を受け、$ DBI :: rowsと同等の行数を返します。
痕跡
$h->trace($trace_settings);
DBIは、実行中の実行時トレース情報を生成する非常に便利な機能を備えています。これは、DBIプログラムの奇妙な問題を追跡しようとするときに大幅な時間の節約になります。さまざまな値を使用して、トレースレベルを設定できます。これらの値は0から4まで変化します。値0はトレースを無効にすることを意味し、4は完全なトレースを生成することを意味します。
補間されたステートメントは禁止されています
次のように補間されたステートメントを使用しないことを強くお勧めします-
while ($first_name = <>) { my $sth = $dbh->prepare("SELECT * FROM TEST_TABLE WHERE FIRST_NAME = '$first_name'");
$sth->execute();
# and so on ...
}
したがって、補間されたステートメントを使用せず、代わりに使用してください bind value 動的SQLステートメントを準備します。
CGIとは何ですか?
Common Gateway Interface(CGI)は、Webサーバーとカスタムスクリプトの間で情報を交換する方法を定義する一連の標準です。
CGI仕様は現在NCSAによって維持されており、NCSAはCGIを次のように定義しています。
Common Gateway Interface(CGI)は、外部ゲートウェイプログラムがHTTPサーバーなどの情報サーバーとインターフェイスするための標準です。
現在のバージョンはCGI / 1.1であり、CGI /1.2は進行中です。
Webブラウジング
CGIの概念を理解するために、Webページで利用可能なハイパーリンクをクリックして特定のWebページまたはURLを参照するとどうなるかを見てみましょう。
ブラウザはHTTPプロトコルを使用してWebサーバーに接続し、URL、つまりWebページのファイル名を要求します。
WebサーバーはURLをチェックし、要求されたファイル名を探します。Webサーバーがそのファイルを見つけると、それ以上実行せずにファイルをブラウザーに送り返します。それ以外の場合は、間違ったファイルを要求したことを示すエラーメッセージを送信します。
WebブラウザはWebサーバーから応答を受け取り、受信したファイルの内容またはファイルが見つからない場合はエラーメッセージを表示します。
ただし、特定のディレクトリ内のファイルが要求されたときにそのファイルが返送されないようにHTTPサーバーを設定することは可能です。代わりに、プログラムとして実行され、そのプログラムが結果として出力するものはすべて、ブラウザに表示するために送り返されます。これは、Webサーバーで利用可能な特別な機能を使用して実行できます。Common Gateway Interfaceまたは、サーバーが最終結果を生成するために実行するCGIおよびそのようなプログラムは、CGIスクリプトと呼ばれます。これらのCGIプログラムは、PERLスクリプト、シェルスクリプト、CまたはC ++プログラムなどです。
CGIアーキテクチャ図
Webサーバーのサポートと構成
CGIプログラミングを続行する前に、WebサーバーがCGI機能をサポートし、CGIプログラムを処理するように構成されていることを確認してください。Webサーバーによって実行されるすべてのCGIプログラムは、事前設定されたディレクトリに保存されます。このディレクトリはCGIディレクトリと呼ばれ、慣例により/ cgi-binという名前が付けられています。慣例により、PerlCGIファイルは次のように拡張されます。.cgi。
最初のCGIプログラム
これは、hello.cgiと呼ばれるCGIスクリプトにリンクされている単純なリンクです。このファイルは保存されています/cgi-bin/ディレクトリとそれは次の内容を持っています。CGIプログラムを実行する前に、を使用してファイルのモードを変更していることを確認してくださいchmod 755 hello.cgi UNIXコマンド。
#!/usr/bin/perl
print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';
1;
今クリックすると hello.cgi リンクしてからリクエストは、/ cgi-binディレクトリでhello.cgiを検索するWebサーバーに送信され、それを実行すると、生成された結果が何であれ、Webサーバーはその結果をWebブラウザに送り返します。
Hello Word! This is my first CGI program
このhello.cgiスクリプトは、STDOUTファイル(画面)に出力を書き込んでいる単純なPerlスクリプトです。印刷される最初の行である利用可能な1つの重要で追加の機能がありますContent-type:text/html\r\n\r\n。この行はブラウザに返送され、ブラウザ画面に表示されるコンテンツタイプを指定します。これで、CGIの基本概念を理解し、Perlを使用して多くの複雑なCGIプログラムを作成できるようになりました。このスクリプトは、データベース、Webサービス、またはその他の複雑なインターフェイスなどの情報を交換するために、他の実行システムと対話することもできます。
HTTPヘッダーを理解する
一番最初の行 Content-type:text/html\r\n\r\nはHTTPヘッダーの一部であり、ブラウザがサーバー側からの受信コンテンツを理解できるようにブラウザに送信されます。すべてのHTTPヘッダーは次の形式になります-
HTTP Field Name: Field Content
例-
Content-type:text/html\r\n\r\n
CGIプログラミングで頻繁に使用する重要なHTTPヘッダーは他にもいくつかあります。
シニア番号 | ヘッダーと説明 |
---|---|
1 | Content-type: String 返されるコンテンツの形式を定義するMIME文字列。例はContent-type:text / htmlです |
2 | Expires: Date String 情報が無効になる日付。これは、ページを更新する必要がある時期を決定するためにブラウザが使用する必要があります。有効な日付文字列は、1998年1月1日12:00:00GMTの形式である必要があります。 |
3 | Location: URL String 要求されたURLの代わりに返されるURL。このファイルを使用して、リクエストを他の場所にリダイレクトできます。 |
4 | Last-modified: String ファイルが最後に変更された日付。 |
5 | Content-length: String 返されるデータの長さ(バイト単位)。ブラウザはこの値を使用して、ファイルの推定ダウンロード時間を報告します。 |
6 | Set-Cookie: String 文字列を介して渡されるCookieを設定します |
CGI環境変数
すべてのCGIプログラムは、次の環境変数にアクセスできます。これらの変数は、CGIプログラムを作成する際に重要な役割を果たします。
シニア番号 | 変数の名前と説明 |
---|---|
1 | CONTENT_TYPE コンテンツのデータ型。クライアントが添付コンテンツをサーバーに送信するときに使用されます。たとえば、ファイルのアップロードなど。 |
2 | CONTENT_LENGTH クエリ情報の長さ。POSTリクエストでのみ使用できます |
3 | HTTP_COOKIE 設定されたCookieをキーと値のペアの形式で返します。 |
4 | HTTP_USER_AGENT User-Agent request-headerフィールドには、リクエストを発信したユーザーエージェントに関する情報が含まれています。Webブラウザの名前。 |
5 | PATH_INFO CGIスクリプトのパス。 |
6 | QUERY_STRING GETメソッドリクエストで送信されるURLエンコードされた情報。 |
7 | REMOTE_ADDR リクエストを行っているリモートホストのIPアドレス。これは、ロギングまたは認証の目的で役立ちます。 |
8 | REMOTE_HOST 要求を行っているホストの完全修飾名。この情報が利用できない場合は、REMOTE_ADDRを使用してIRアドレスを取得できます。 |
9 | REQUEST_METHOD リクエストの作成に使用されたメソッド。最も一般的なメソッドはGETとPOSTです。 |
10 | SCRIPT_FILENAME CGIスクリプトへのフルパス。 |
11 | SCRIPT_NAME CGIスクリプトの名前。 |
12 | SERVER_NAME サーバーのホスト名またはIPアドレス。 |
13 | SERVER_SOFTWARE サーバーが実行しているソフトウェアの名前とバージョン。 |
これは、WebサーバーでサポートされているすべてのCGI変数を一覧表示する小さなCGIプログラムです。結果は表示するには、このリンクをクリックして環境を手に入れよう
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
print "<b>$_</b>: $ENV{$_}<br>\n";
}
1;
「ファイルのダウンロード」ダイアログボックスを表示しますか?
ユーザーがリンクをクリックすると、実際のコンテンツを表示する代わりに、「ファイルのダウンロード」ダイアログボックスがポップアップ表示されるオプションを指定したい場合があります。これは非常に簡単で、HTTPヘッダーを介して実現されます。
このHTTPヘッダーは、前のセクションで説明したヘッダーとは異なります。たとえば、FileName 特定のリンクからダウンロード可能なファイルの場合、その構文は次のようになります-
#!/usr/bin/perl
# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";
# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) { print("$buffer");
}
GETメソッドとPOSTメソッド
ブラウザからWebサーバーに、そして最終的にはリクエストを処理するCGIプログラムに情報を渡す必要がある場合、多くの状況に遭遇したに違いありません。ほとんどの場合、ブラウザは2つの方法を使用してこの情報をWebサーバーに渡します。これらの方法はGET 方法と POST方法。一つずつチェックしていきましょう。
GETメソッドを使用して情報を渡す
GETメソッドは、ページURL自体に追加されたエンコードされたユーザー情報を送信します。ページとエンコードされた情報は?で区切られます 次のような文字-
http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2
GETメソッドは、ブラウザからWebサーバーに情報を渡すためのデフォルトのメソッドであり、ブラウザのLocation:boxに表示される長い文字列を生成します。サーバーに渡すパスワードやその他の機密情報がある場合は、GETメソッドを使用しないでください。GETメソッドにはサイズ制限があります。リクエスト文字列で渡すことができるのは1024文字のみです。
この情報はを使用して渡されます QUERY_STRING ヘッダーであり、CGIプログラムで解析して使用できるQUERY_STRING環境変数を介してCGIプログラムでアクセスできます。
キーと値のペアを任意のURLと連結するだけで情報を渡すか、HTML <FORM>タグを使用してGETメソッドを使用して情報を渡すことができます。
単純なURLの例:Getメソッド
これは、GETメソッドを使用してhello_get.cgiプログラムに2つの値を渡す単純なURLです。
http://www.tutorialspoint.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALI以下であり hello_get.cgi Webブラウザからの入力を処理するスクリプト。
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "GET") {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value; } $first_name = $FORM{first_name}; $last_name = $FORM{last_name}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Hello - Second CGI Program</title>"; print "</head>"; print "<body>"; print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
単純なFORMの例:GETメソッド
これは簡単な例で、HTMLFORMと送信ボタンを使用して2つの値を渡します。同じCGIスクリプトhello_get.cgiを使用してこの入力を処理します。
<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
上記のフォームコーディングの実際の出力は次のとおりです。これで、姓名を入力し、[送信]ボタンをクリックして結果を確認できます。
POSTメソッドを使用して情報を渡す
CGIプログラムに情報を渡すためのより信頼性の高い方法は、 POST方法。これは、GETメソッドとまったく同じ方法で情報をパッケージ化しますが、情報をテキスト文字列として送信する代わりに?URLでは、HTTPヘッダーの一部として個別のメッセージとして送信します。Webサーバーは、このメッセージを標準入力の形式でCGIスクリプトに提供します。
以下は変更されたものです hello_post.cgiWebブラウザからの入力を処理するスクリプト。このスクリプトは、GETメソッドとPOSTメソッドを処理します。
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name = $FORM{last_name};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";
1;
上記と同じ例をもう一度見てみましょう。HTMLFORMと送信ボタンを使用して2つの値を渡します。この入力を処理するために、CGIスクリプトhello_post.cgiを使用します。
<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name"> <br>
Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>
上記のフォームコーディングの実際の出力は次のとおりです。姓名を入力し、送信ボタンをクリックして結果を確認します。
チェックボックスデータをCGIプログラムに渡す
チェックボックスは、複数のオプションを選択する必要がある場合に使用されます。これは、2つのチェックボックスがあるフォームのHTMLコードの例です。
<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>
このコードの結果は次の形式になります-
以下であり checkbox.cgi ラジオボタンのWebブラウザからの入力を処理するスクリプト。
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer); foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair); $value =~ tr/+/ /;
$value =~ s/%(..)/pack("C", hex($1))/eg;
$FORM{$name} = $value; } if( $FORM{maths} ) {
$maths_flag ="ON"; } else { $maths_flag ="OFF";
}
if( $FORM{physics} ) { $physics_flag ="ON";
} else {
$physics_flag ="OFF"; } print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print "<title>Checkbox - Third CGI Program</title>"; print "</head>"; print "<body>"; print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";
1;
ラジオボタンデータをCGIプログラムに渡す
ラジオボタンは、1つのオプションのみを選択する必要がある場合に使用されます。これは、2つのラジオボタンがあるフォームのHTMLコードの例です-
<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>
このコードの結果は次の形式になります-
以下であり radiobutton.cgi ラジオボタンのWebブラウザからの入力を処理するスクリプト。
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{subject};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
テキストエリアデータをCGIプログラムに渡す
textarea要素は、複数行のテキストをCGIプログラムに渡す必要がある場合に使用されます。TEXTAREAボックスのあるフォームのHTMLコードの例を次に示します-
<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>
このコードの結果は次の形式になります-
以下は textarea.cgi Webブラウザからの入力を処理するスクリプト。
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";
1;
ドロップダウンボックスデータをCGIプログラムに渡す
ドロップダウンボックスは、利用可能なオプションが多数あるが、1つまたは2つだけが選択される場合に使用されます。ドロップダウンボックスが1つあるフォームのHTMLコードの例を次に示します。
<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>
このコードの結果は次の形式になります-
以下は dropdown.cgi Webブラウザからの入力を処理するスクリプト。
#!/usr/bin/perl
local ($buffer, @pairs, $pair, $name, $value, %FORM); # Read in text $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } # Split information into name/value pairs @pairs = split(/&/, $buffer);
foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value;
}
$subject = $FORM{dropdown};
print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";
1;
CGIでのCookieの使用
HTTPプロトコルはステートレスプロトコルです。ただし、商用Webサイトの場合、異なるページ間でセッション情報を維持する必要があります。たとえば、1人のユーザー登録は、多くのページにまたがるトランザクションの後に終了します。しかし、すべてのWebページでユーザーのセッション情報を維持するにはどうすればよいでしょうか。
多くの場合、Cookieを使用することは、訪問者のエクスペリエンスやサイトの統計を向上させるために必要な設定、購入、手数料、およびその他の情報を記憶および追跡するための最も効率的な方法です。
使い方
サーバーは、Cookieの形式で訪問者のブラウザにデータを送信します。ブラウザはCookieを受け入れる場合があります。含まれている場合は、訪問者のハードドライブにプレーンテキストレコードとして保存されます。これで、訪問者がサイトの別のページにアクセスすると、Cookieを取得できるようになります。取得されると、サーバーは何が保存されたかを認識/記憶します。
Cookieは、5つの可変長フィールドのプレーンテキストデータレコードです-
Expires−Cookieの有効期限が切れる日付。これが空白の場合、訪問者がブラウザを終了するとCookieは期限切れになります。
Domain −サイトのドメイン名。
Path−Cookieを設定したディレクトリまたはWebページへのパス。任意のディレクトリまたはページからCookieを取得する場合は、これを空白にすることができます。
Secure−このフィールドに「セキュア」という単語が含まれている場合、Cookieはセキュアサーバーでのみ取得できます。このフィールドが空白の場合、そのような制限はありません。
Name = Value − Cookieは、キーと値のペアの形式で設定および再表示されます。
クッキーの設定
ブラウザにCookieを送信するのは非常に簡単です。これらのCookieは、HTTPヘッダーと一緒に送信されます。ユーザーIDとパスワードをCookieとして設定するとします。したがって、次のように実行されます-
#!/usr/bin/perl
print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....
ここで使用しました Set-CookieCookieを設定するためのHTTPヘッダー。Expires、Domain、PathなどのCookie属性を設定することはオプションです。マジックラインを送信する前にCookieが設定されていることに注意することが重要です"Content-type:text/html\r\n\r\n。
クッキーの取得
設定されたすべてのCookieを取得するのは非常に簡単です。CookieはCGI環境変数HTTP_COOKIEに保存され、次の形式になります。
key1 = value1;key2 = value2;key3 = value3....
これは、Cookieを取得する方法の例です。
#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'}; @cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) { ($key, $val) = split(/=/, $cookie); # splits on the first =.
$key =~ s/^\s+//; $val =~ s/^\s+//;
$key =~ s/\s+$//;
$val =~ s/\s+$//;
if( $key eq "UserID" ) { $user_id = $val; } elsif($key eq "Password") {
$password = $val;
}
}
print "User ID = $user_id\n"; print "Password = $password\n";
これにより、取得Cookieスクリプトを呼び出す前に上記のCookieが設定されている場合、次の結果が生成されます。
User ID = XYZ
Password = XYZ123
CGIモジュールとライブラリ
インターネット上には、CGIプログラムで使用する直接関数を提供する多くの組み込みモジュールがあります。以下は一度重要です。
CGIモジュール
バークレーcgi-lib.pl
パッケージとは何ですか?
ザ・ packageステートメントは、現在の命名コンテキストを指定された名前空間(シンボルテーブル)に切り替えます。したがって、−
パッケージは、独自の名前空間に存在するコードのコレクションです。
名前空間は、一意の変数名の名前付きコレクションです(シンボルテーブルとも呼ばれます)。
名前空間は、パッケージ間の変数名の衝突を防ぎます。
パッケージを使用すると、モジュールを構築できます。モジュールを使用すると、モジュール自体の名前空間の外部で変数や関数が破壊されることはありません。
パッケージは、別のパッケージステートメントが呼び出されるか、現在のブロックまたはファイルが終了するまで有効です。
を使用して、パッケージ内の変数を明示的に参照できます。 :: パッケージ修飾子。
以下は、ファイルにmainパッケージとFooパッケージがある例です。ここでは、特別な変数__PACKAGE__がパッケージ名を出力するために使用されています。
#!/usr/bin/perl
# This is main package
$i = 1; print "Package name : " , __PACKAGE__ , " $i\n";
package Foo;
# This is Foo package
$i = 10; print "Package name : " , __PACKAGE__ , " $i\n";
package main;
# This is again main package
$i = 100; print "Package name : " , __PACKAGE__ , " $i\n";
print "Package name : " , __PACKAGE__ , " $Foo::i\n";
1;
上記のコードを実行すると、次の結果が得られます。
Package name : main 1
Package name : Foo 10
Package name : main 100
Package name : main 10
BEGINブロックとENDブロック
BEGINおよびENDという名前のコードブロックをいくつでも定義できます。これらはそれぞれコンストラクタおよびデストラクタとして機能します。
BEGIN { ... }
END { ... }
BEGIN { ... }
END { ... }
すべて BEGIN ブロックは、perlスクリプトがロードおよびコンパイルされた後、他のステートメントが実行される前に実行されます。
すべてのENDブロックは、perlインタープリターが終了する直前に実行されます。
BEGINブロックとENDブロックは、Perlモジュールを作成するときに特に役立ちます。
次の例はその使用法を示しています-
#!/usr/bin/perl
package Foo;
print "Begin and Block Demo\n";
BEGIN {
print "This is BEGIN Block\n"
}
END {
print "This is END Block\n"
}
1;
上記のコードを実行すると、次の結果が得られます。
This is BEGIN Block
Begin and Block Demo
This is END Block
Perlモジュールとは何ですか?
Perlモジュールは、ライブラリファイルで定義された再利用可能なパッケージであり、その名前は、拡張子が.pmのパッケージの名前と同じです。
と呼ばれるPerlモジュールファイル Foo.pm このようなステートメントが含まれる場合があります。
#!/usr/bin/perl
package Foo;
sub bar {
print "Hello $_[0]\n"
}
sub blat {
print "World $_[0]\n"
}
1;
Perlモジュールに関するいくつかの重要なポイント
機能 require そして use モジュールをロードします。
どちらも検索パスのリストを使用します @INC モジュールを見つけるために。
両方の機能 require そして use を呼び出す eval コードを処理する関数。
ザ・ 1; 下部にあると、evalはTRUEと評価されます(したがって失敗しません)。
要求関数
モジュールは、を呼び出すことによってロードできます require 次のように機能します-
#!/usr/bin/perl
require Foo;
Foo::bar( "a" );
Foo::blat( "b" );
サブルーチン名は、それらを呼び出すために完全に修飾されている必要があることに注意してください。サブルーチンを有効にするといいでしょうbar そして blat Foo ::修飾子を使用する必要がないように、独自の名前空間にインポートされます。
使用機能
モジュールは、を呼び出すことによってロードできます use 関数。
#!/usr/bin/perl
use Foo;
bar( "a" );
blat( "b" );
パッケージの関数名を完全に修飾する必要がないことに注意してください。ザ・use 関数は、モジュール内にいくつかのステートメントが追加されている場合、モジュールからシンボルのリストをエクスポートします。
require Exporter;
@ISA = qw(Exporter);
次に、次の名前のリスト変数に入力して、シンボル(スカラー、リスト、ハッシュ、サブルーチンなど)のリストを提供します。 @EXPORT:例-
package Module;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(bar blat);
sub bar { print "Hello $_[0]\n" }
sub blat { print "World $_[0]\n" } sub splat { print "Not $_[0]\n" } # Not exported!
1;
Perlモジュールツリーを作成する
Perlモジュールを出荷する準備ができたら、Perlモジュールツリーを作成する標準的な方法があります。これはを使用して行われますh2xsユーティリティ。このユーティリティはPerlに付属しています。h2xsを使用するための構文は次のとおりです-
$h2xs -AX -n ModuleName
たとえば、モジュールがで利用可能な場合 Person.pm ファイルを作成し、次のコマンドを発行します-
$h2xs -AX -n Person
これにより、次の結果が生成されます-
Writing Person/lib/Person.pm
Writing Person/Makefile.PL
Writing Person/README
Writing Person/t/Person.t
Writing Person/Changes
Writing Person/MANIFEST
これらのオプションの説明は次のとおりです-
-A オートローダーコードを省略します(使用頻度の低い多数のサブルーチンを定義するモジュールで使用するのが最適です)。
-X XS要素を省略します(eXternalサブルーチン。eXternalはPerlの外部、つまりCを意味します)。
-n モジュールの名前を指定します。
したがって、上記のコマンドは、Personディレクトリ内に次の構造を作成します。実際の結果は上に示されています。
- Changes
- Makefile.PL
- MANIFEST(パッケージ内のすべてのファイルのリストが含まれています)
- README
- t /(テストファイル)
- lib /(実際のソースコードはここにあります
だから最後に、あなたは tarこのディレクトリ構造をファイルPerson.tar.gzに入れて、出荷できます。適切な手順でREADMEファイルを更新する必要があります。tディレクトリにいくつかのテスト例ファイルを提供することもできます。
Perlモジュールのインストール
Perlモジュールをtar.gzファイルの形式でダウンロードします。次のシーケンスを使用して、PerlモジュールをインストールしますPerson.pm としてダウンロードされています Person.tar.gz ファイル。
tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install
Perlインタプリタには、モジュールを検索するディレクトリのリストがあります(グローバル配列@INC)。
Perlをさまざまな方法で使用して、要件に応じて新しいプロセスを作成できます。このチュートリアルでは、Perlプロセスを作成および管理するためのいくつかの重要で最も頻繁に使用される方法をリストします。
特別な変数を使用できます $$ または $PROCESS_ID 現在のプロセスIDを取得します。
上記の方法のいずれかを使用して作成されたすべてのプロセスは、独自の仮想環境を維持します。 %ENV 変数。
ザ・ exit() 関数は常にこの関数を実行する子プロセスのみを終了し、実行中のすべての子プロセスが終了しない限り、メインプロセス全体は終了しません。
開いているすべてのハンドルは子プロセスでdup()されているため、1つのプロセスでハンドルを閉じても、他のプロセスには影響しません。
バックスティックオペレーター
Unixコマンドを実行するこの最も簡単な方法は、バックスティック演算子を使用することです。コマンドをバックスティック演算子内に置くだけで、コマンドが実行され、次のように保存できる結果が返されます。
#!/usr/bin/perl
@files = `ls -l`;
foreach $file (@files) { print $file;
}
1;
上記のコードを実行すると、現在のディレクトリで使用可能なすべてのファイルとディレクトリが一覧表示されます-
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm
drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
system()関数
使用することもできます system()Unixコマンドを実行する関数。その出力はperlスクリプトの出力に送られます。デフォルトでは、これは画面、つまりSTDOUTですが、リダイレクト演算子> −を使用して任意のファイルにリダイレクトできます。
#!/usr/bin/perl
system( "ls -l")
1;
上記のコードを実行すると、現在のディレクトリで使用可能なすべてのファイルとディレクトリが一覧表示されます-
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14
drwxr-xr-x 4 root root 4096 Sep 13 07:54 android
-rw-r--r-- 1 root root 574 Sep 17 15:16 index.htm
drwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01
-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl
drwx------ 2 root root 4096 Sep 17 15:11 vAtrJdy
コマンドに次のようなシェル環境変数が含まれている場合は注意してください $PATH or $ホーム。次の3つのシナリオを試してください-
#!/usr/bin/perl
$PATH = "I am Perl Variable"; system('echo $PATH'); # Treats $PATH as shell variable system("echo $PATH"); # Treats $PATH as Perl variable system("echo \$PATH"); # Escaping $ works.
1;
上記のコードを実行すると、シェル変数$ PATHに設定されている内容に応じて、次のような結果が得られます。
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
I am Perl Variable
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
fork()関数
Perlは fork()同じ名前のUnixシステムコールに対応する関数。fork()システムコールが利用可能なほとんどのUnixライクなプラットフォームでは、Perlのfork()は単にそれを呼び出します。fork()システムコールが利用できないWindowsなどの一部のプラットフォームでは、Perlをビルドして、インタープリターレベルでfork()をエミュレートできます。
fork()関数は、現在のプロセスのクローンを作成するために使用されます。この呼び出しにより、同じプログラムを同じポイントで実行する新しいプロセスが作成されます。子pidを親プロセスに返し、0を子プロセスに返し、フォークが失敗した場合はundefを返します。
使用できます exec() 要求された実行可能ファイルを起動するプロセス内の関数。これは別のプロセス領域で実行され、exec()はそれが完了するのを待ってから、そのプロセスと同じ終了ステータスで終了します。
#!/usr/bin/perl
if(!defined($pid = fork())) { # fork returned undef, so unsuccessful die "Cannot fork a child: $!";
} elsif ($pid == 0) { print "Printed by child process\n"; exec("date") || die "can't exec date: $!";
} else {
# fork returned 0 nor undef
# so this branch is parent
print "Printed by parent process\n";
$ret = waitpid($pid, 0);
print "Completed process id: $ret\n";
}
1;
上記のコードを実行すると、次の結果が得られます。
Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777
ザ・ wait() そして waitpid()fork()によって返される疑似プロセスIDとして渡すことができます。これらの呼び出しは、疑似プロセスの終了を適切に待機し、そのステータスを返します。あなたがあなたの子供を使用するのを待つことなくフォークした場合waitpid()機能、あなたはゾンビを蓄積します。Unixシステムでは、次のように$ SIG {CHLD}を「IGNORE」に設定することでこれを回避できます。
#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE"; if(!defined($pid = fork())) {
# fork returned undef, so unsuccessful
die "Cannot fork a child: $!"; } elsif ($pid == 0) {
print "Printed by child process\n";
exec("date") || die "can't exec date: $!"; } else { # fork returned 0 nor undef # so this branch is parent print "Printed by parent process\n"; $ret = waitpid($pid, 0); print "Completed process id: $ret\n";
}
1;
上記のコードを実行すると、次の結果が得られます。
Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1
kill()関数
Perl kill('KILL', (Process List)) 関数を使用して、fork()によって返されたIDを渡すことにより、疑似プロセスを終了できます。
疑似プロセスを実装するスレッドはリソースをクリーンアップする機会がないため、疑似プロセス()でkill( 'KILL'、(プロセスリスト))を使用すると、通常、メモリリークが発生する可能性があることに注意してください。
使用できます kill() 他のシグナルをターゲットプロセスに送信する関数。たとえば、次のようにSIGINTをプロセスID104および102に送信します。
#!/usr/bin/perl
kill('INT', 104, 102);
1;
ポッド(プレーンオールドテキスト)ドキュメントをPerlモジュールとスクリプトに埋め込むことができます。以下は、Perlコードに埋め込まれたドキュメントを使用するためのルールです-
空の行a =でドキュメントを開始しますhead1 最初にコマンドを実行し、a =で終了しますcut
Perlは、コードに入力したポッドテキストを無視します。以下は、Perlコード内に埋め込まれたドキュメントを使用する簡単な例です-
#!/usr/bin/perl
print "Hello, World\n";
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
=cut
print "Hello, Universe\n";
上記のコードを実行すると、次の結果が得られます。
Hello, World
Hello, Universe
ポッドをファイルの最後に配置し、__ END__または__DATA__カットマークを使用している場合は、次のように最初のポッドコマンドの前に空の行を配置してください。それ以外の場合は、前に空の行を配置しないでください。 =head1、多くの翻訳者は=を認識していなかったでしょうhead1 ポッドブロックの開始として。
#!/usr/bin/perl
print "Hello, World\n";
while(<DATA>) {
print $_;
}
__END__
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
上記のコードを実行すると、次の結果が得られます。
Hello, World
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
DATAの部分を読まずに、同じコードの例をもう1つ取り上げましょう。
#!/usr/bin/perl
print "Hello, World\n";
__END__
=head1 Hello, World Example
This example demonstrate very basic syntax of Perl.
print "Hello, Universe\n";
上記のコードを実行すると、次の結果が得られます。
Hello, World
PODとは何ですか?
Podは、Perl、Perlプログラム、およびPerlモジュールのドキュメントを作成するために使用される使いやすいマークアップ言語です。ポッドをプレーンテキスト、HTML、マニュアルページなどのさまざまな形式に変換するために利用できるさまざまなトランスレータがあります。ポッドマークアップは、3つの基本的な種類の段落で構成されています-
Ordinary Paragraph −太字、斜体、コードスタイル、ハイパーリンクなど、通常の段落で書式設定コードを使用できます。
Verbatim Paragraph −逐語的な段落は通常、特別な解析やフォーマットを必要とせず、折り返されるべきではないコードブロックまたはその他のテキストを提示するために使用されます。
Command Paragraph−コマンド段落は、通常は見出しまたはリストの一部として、テキストのチャンク全体を特別に処理するために使用されます。すべてのコマンド段落は、=で始まり、識別子が続き、コマンドが好きなように使用できる任意のテキストが続きます。現在認識されているコマンドは次のとおりです。
=pod
=head1 Heading Text
=head2 Heading Text
=head3 Heading Text
=head4 Heading Text
=over indentlevel
=item stuff
=back
=begin format
=end format
=for format text...
=encoding type
=cut
PODの例
次のPODを検討してください-
=head1 SYNOPSIS
Copyright 2005 [TUTORIALSOPOINT].
=cut
使用できます pod2html Linuxで利用可能なユーティリティを使用して上記のPODをHTMLに変換すると、次の結果が得られます-
次に、次の例を考えてみましょう-
=head2 An Example List
=over 4
=item * This is a bulleted list.
=item * Here's another item.
=back
=begin html
<p>
Here's some embedded HTML. In this block I can
include images, apply <span style="color: green">
styles</span>, or do anything else I can do with
HTML. pod parsers that aren't outputting HTML will
completely ignore it.
</p>
=end html
上記のPODをpod2htmlを使用してHTMLに変換すると、次の結果が生成されます-
An Example List
This is a bulleted list.
Here's another item.
Here's some embedded HTML. In this block I can include images, apply
styles, or do anything else I can do with HTML. pod parsers that aren't
outputting HTML will completely ignore it.
これは、標準のPerlでサポートされているすべての重要な機能のリストです。
abs-絶対値関数
accept-着信ソケット接続を受け入れます
アラーム-SIGALRMをスケジュールします
atan2 -PIからPIの範囲のY / Xのアークタンジェント
bind-アドレスをソケットにバインドします
binmode -I / O用のバイナリファイルを準備します
祝福-オブジェクトを作成する
呼び出し元-現在のサブルーチン呼び出しのコンテキストを取得します
chdir-現在の作業ディレクトリを変更します
chmod-ファイルのリストのパーミッションを変更します
chomp-文字列から末尾のレコード区切り文字を削除します
chop-文字列から最後の文字を削除します
chownコマンド-ファイルのリストにowershipを変更
chr-この数字が表す文字を取得する
chroot-パスルックアップ用にディレクトリを新しいルートにします
close-ファイル(またはパイプまたはソケット)ハンドルを閉じます
Closedir-ディレクトリハンドルを閉じる
接続-リモートソケットに接続します
続行-しばらくの間またはforeachのオプションの末尾ブロック
cos-余弦関数
crypt-一方向のpasswdスタイルの暗号化
dbmclose-結合されたdbmファイルのバインディングを解除します
dbmopen-タイのdbmファイルにバインディングを作成します
定義済み-値、変数、または関数が定義されているかどうかをテストします
delete-ハッシュから値を削除します
死ぬ-例外を提起するか、救済する
やる- TERMにBLOCKを回します
ダンプ-即時コアダンプを作成します
各-ハッシュから次のキー/値のペアを取得
endgrent-グループファイルを使用して実行
endhostent -hostsファイルを使用して実行
endnetent-ネットワークファイルを使用して実行
endprotoent-プロトコルファイルを使用して実行
endpwent -passwdファイルを使用して実行
エンダーベント-サービスファイルを使用して実行
eof-ファイルハンドルの終わりをテストします
eval-例外をキャッチするか、コードをコンパイルして実行します
exec-このプログラムを破棄して別のプログラムを実行する
存在する-ハッシュキーが存在するかどうかをテストする
終了-このプログラムを終了
exp-私を上げる
力に fcntl-ファイル制御システムコール
fileno-ファイルハンドルからファイル記述子を返します
flock-アドバイザリロックでファイル全体をロックします
fork-このような新しいプロセスを作成します
format -write()関数で使用して画像フォーマットを宣言します
formline-フォーマットに使用される内部関数
getc-ファイルハンドルから次の文字を取得します
getgrent-次のグループレコードを取得します
getgrgid-グループユーザーIDを指定してグループレコードを取得します
getgrnam-グループ名を指定してグループレコードを取得します
gethostbyaddr-アドレスを指定してホストレコードを取得します
gethostbyname-ホストレコードの指定された名前を取得します
gethostent-次のホストレコードを取得します
getlogin-このttyにログインしたユーザーを返します
getnetbyaddr-アドレスを指定してネットワークレコードを取得します
getnetbyname-ネットワークレコードの指定された名前を取得します
getnetent-次のネットワークレコードを取得します
getpeername-ソケット接続のもう一方の端を検索します
getpgrp-プロセスグループを取得します
getppid-親プロセスIDを取得します
getpriority-現在の素敵な値を取得する
getprotobyname-指定された名前のプロトコルレコードを取得します
getprotobynumber-プロトコルレコード数値プロトコルを取得します
getprotoent-次のプロトコルレコードを取得します
getpwent-次のpasswdレコードを取得します
getpwnam-ユーザーログイン名を指定してpasswdレコードを取得します
getpwuid-ユーザーIDを指定してpasswdレコードを取得します
getservbyname-名前を指定してサービスレコードを取得します
getservbyport-数値ポートを指定してサービスレコードを取得します
getervent-次のサービスレコードを取得します
Getsockname-指定されたソケットのsockaddrを取得します
Getsockopt-指定されたソケットのソケットオプションを取得します
glob-ワイルドカードを使用してファイル名を展開します
gmtime-グリニッジ時間形式を使用してUNIX時間をレコードまたは文字列に変換します。
goto-スパゲッティコードを作成する
grep-指定された基準に対して真のリストテストで要素を検索します
hex-文字列を16進数に変換します
import-モジュールの名前空間にパッチを適用します
インデックス-文字列内の部分を見つけます
int-数値の整数部分を取得します
ioctl-システム依存のデバイス制御システムコール
参加-分離器を使用して文字列にリストに参加
キー-ハッシュからインデックスのリストを取得します
kill-プロセスまたはプロセスグループにシグナルを送信します
最後-ブロックを途中で終了します
lc-文字列の小文字バージョンを返します
lcfirst-次の文字だけを小文字で含む文字列を返します
length-文字列のバイト数を返します
リンク-ファイルシステムにハードリンクを作成します
リッスン-ソケットをサーバーとして登録します
ローカル-グローバル変数の一時値を作成します(動的スコープ)
localtime-ローカル時間を使用してUNIX時間をレコードまたは文字列に変換します
lock-変数、サブルーチン、またはメソッドのスレッドロックを取得します
ログ-数の自然対数を取得
lstat-シンボリックリンクの統計
m-文字列を正規表現パターンと一致させます
map-リストに変更を適用して、変更を含む新しいリストを取得します
mkdir-ディレクトリを作成します
msgctl -SysVIPCメッセージ制御操作
msgget - SysVIPCメッセージキューを取得します
msgrcv-メッセージキューからSysVIPCメッセージを受信します
msgsnd -SysVIPCメッセージをメッセージキューに送信します
私の-宣言とは、ローカル変数(レキシカルスコープ)を割り当てます
次へ-ブロックを時期尚早に反復します
いいえ-コンパイル時に一部のモジュールシンボルまたはセマンティクスをインポート解除します
oct-文字列を8進数に変換します
open-ファイル、パイプ、または記述子を開きます
opendir-ディレクトリを開きます
ord-文字の数値表現を検索します
私たち-パッケージ変数を宣言して割り当てます(字句スコープ)
pack-リストをバイナリ表現に変換します
パッケージ-個別のグローバル名前空間を宣言します
パイプ-接続されたファイルハンドルのペアを開きます
pop-配列から最後の要素を削除して返します
pos-最後/次のm // g検索のオフセットを検索または設定します
印刷-出力をファイルハンドルにリストに
printf-フォーマットされたリストをファイルハンドルに出力します
プロトタイプ-サブルーチンのプロトタイプ(存在する場合)を取得します
push -1つ以上の要素を配列に追加します
q-文字列を単独で引用します
qq-文字列を二重引用符で囲みます
qr-コンパイルパターン
quotemeta-正規表現の魔法の文字を引用します
qw-単語のリストを引用する
qx-文字列を引用符で囲みます
rand-次の疑似乱数を取得します
読み取り-ファイルハンドルからの固定長のバッファ入力
readdir-ディレクトリハンドルからディレクトリを取得します
readline-ファイルからレコードをフェッチします
readlink-シンボリックリンクが指している場所を特定します
readpipe-システムコマンドを実行し、標準出力を収集します
recv-ソケットを介してメッセージを受信します
やり直し-このループの反復を最初からやり直します
ref-参照されているもののタイプを調べます
名前の変更-ファイル名を変更します
必要-外部関数で負荷を実行時にライブラリから
リセット-指定された名前のすべての変数をクリアします
return-関数から早く抜け出す
逆-文字列またはリストを反転します
rewinddir-ディレクトリハンドルをリセットします
rindex-右から左への部分文字列検索
rmdir-ディレクトリを削除します
s-パターンを文字列に置き換えます
スカラー-スカラーコンテキストを強制します
seek-ランダムアクセスI / Oのファイルポインタを再配置します
seekdir-ディレクトリポインタを再配置します
選択-デフォルト出力をリセットするか、I / O多重化を実行します
semctl -SysVセマフォ制御操作
semget -SysVセマフォのセットを取得します
semop -SysVセマフォ操作
send-ソケットを介してメッセージを送信します
setgrent-使用するグループファイルを準備します
sethostent-使用するhostsファイルを準備します
setnetent-使用するネットワークファイルを準備します
setpgrp-プロセスのプロセスグループを設定します
setpriority-プロセスの適切な値を設定します
setprotoent-使用するプロトコルファイルを準備します
setpwent-使用するためにpasswdファイルを準備します
setservent-使用するサービスファイルを準備します
setsockopt-いくつかのソケットオプションを設定します
shift-配列の最初の要素を削除し、それを返します
shmctl -SysV共有メモリ操作
shmget -SysV共有メモリセグメント識別子を取得します
shmread -SysV共有メモリを読み取ります
shmwrite -SysV共有メモリを書き込む
シャットダウン-ソケット接続の半分だけを閉じます
sin-数値の正弦を返します
スリープ-数秒間ブロックする
ソケット-ソケットを作成します
socketpair-ソケットのペアを作成します
sort-値のリストをソートします
スプライス-配列内の任意の場所に要素を追加または削除します
スプリット-正規表現の区切り文字を使用して文字列を分割
sprintf-文字列にフォーマットされた印刷
sqrt-平方根関数
srand-乱数ジェネレーターをシードします
stat-ファイルのステータス情報を取得します
調査-繰り返し検索するために入力データを最適化する
サブ-おそらく匿名で、サブルーチンを宣言
SUBSTR - stirngの一部を取得または変更
symlink-ファイルへのシンボリックリンクを作成します
syscall-任意のシステムコールを実行します
sysopen-ファイル、パイプ、または記述子を開きます
sysread-ファイルハンドルからの固定長のバッファなし入力
sysseek -sysreadおよびsyswriteで使用されるハンドル上のI / Oポインターの位置
システム-別のプログラムを実行する
syswrite-ファイルハンドルへの固定長のバッファなし出力
伝える-ファイルハンドルの上に現在のseekpointerを取得
telldir-ディレクトリハンドルで現在のseekpointerを取得します
tie-変数をオブジェクトクラスにバインドします
結合-結合された変数の基礎となるオブジェクトへの参照を取得します
時間-1970年からの戻り秒数
回-復帰は、自己と子プロセスのための経過時間
tr-文字列を音訳します
切り捨て-ファイルを短くします
uc-文字列の大文字バージョンを返します
ucfirst-次の文字だけが大文字の文字列を返します
umask-ファイル作成モードマスクを設定します
undef-変数または関数の定義を削除します
リンク解除-ファイルへのリンクを1つ削除します
unpack-バイナリ構造を通常のperl変数に変換します
unshift-リストの先頭にさらに要素を追加します
untie-変数へのタイバインディングを解除します
使用-コンパイル時にモジュールにロードする
utime-ファイルの最終アクセスと変更時間を設定します
値-ハッシュの値のリストを返します
vec-文字列の特定のビットをテストまたは設定します
待つ-子プロセスが死ぬのを待つ
waitpid-特定の子プロセスが死ぬのを待つ
wantarray-現在のサブルーチン呼び出しのvoidvsスカラーvsリストコンテキストを取得します
警告-デバッグ情報を出力します
書き込み-画像レコードを印刷します
-X-ファイルテスト(-r、-xなど)
y-文字列を音訳します