Perl-quick-guide

提供:Dev Guides
移動先:案内検索

Perl-はじめに

Perlはもともとテキスト操作用に開発された汎用プログラミング言語であり、現在ではシステム管理、Web開発、ネットワークプログラミング、GUI開発などを含む幅広いタスクに使用されています。

Perlとは何ですか?

  • Perlは、安定したクロスプラットフォームプログラミング言語です。
  • Perlは正式には頭字語ではありませんが、*実用的な抽出とレポート言語*として使用する人はほとんどいません。
  • 公共部門および民間部門のミッションクリティカルなプロジェクトに使用されます。
  • Perlは_Artistic License_または_GNU General Public License(GPL)_でライセンスされる_Open Source_ソフトウェアです。
  • PerlはLarry Wallによって作成されました。
  • Perl 1.0は、1987年にusenetのalt.comp.sourcesにリリースされました。
  • このチュートリアルを書いている時点では、perlの最新バージョンは5.16.2でした。
  • Perlは_Oxford English Dictionary_にリストされています。

PC Magazineは、1998年の開発ツール部門のTechnical Excellence AwardのファイナリストとしてPerlを発表しました。

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(https://cpan.perl.org [CPAN])から20,000を超えるサードパーティモジュールが利用可能です。
  • Perlインタープリターは他のシステムに組み込むことができます。

PerlとWeb

  • Perlは、テキスト操作機能と迅速な開発サイクルにより、最も人気のあるWebプログラミング言語でした。
  • Perlは「https://www.google.com/search?q=the%20duct-tape%20of%20the%20Internet [インターネットのダクトテープ]」として広く知られています。
  • Perlは、電子商取引を含む暗号化されたWebデータを処理できます。
  • PerlをWebサーバーに埋め込み、処理を2000%も高速化できます。
  • Perlのhttps://perl.apache.org [mod_perl]を使用すると、Apache WebサーバーでPerlインタープリターを埋め込むことができます。
  • Perlのhttps://dbi.perl.org [DBI]パッケージにより、Webデータベースの統合が容易になります。

Perlは解釈されます

Perlはインタープリター言語です。つまり、移植性のない実行可能プログラムを作成するコンパイルステージなしで、コードをそのまま実行できます。

従来のコンパイラは、プログラムを機械語に変換します。 Perlプログラムを実行すると、最初にバイトコードにコンパイルされ、次に(プログラムの実行時に)機械語命令に変換されます。 したがって、中間表現なしで*厳密*に解釈されるシェルまたはTclとはまったく異なります。

また、マシンに依存する形式に直接コンパイルされるCまたはC ++のほとんどのバージョンとは異なります。 _Python_と_awk_とEmacsの.elcファイルとともに、中間にあります。

Perl-環境

Perlプログラムの作成を始める前に、Perl環境のセットアップ方法を理解しましょう。 Perlはさまざまなプラットフォームで利用可能です-

  • Unix(Solaris、Linux、FreeBSD、AIX、HP/UX、SunOS、IRIXなど)
  • 9x/NT/2000/に勝つ
  • WinCE
  • Macintosh(PPC、68K)
  • Solaris(x86、SPARC)
  • OpenVMS
  • アルファ(7.2以降)
  • シンビアン
  • 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のドキュメントをダウンロードできます。

Perlをインストールする

Perlディストリビューションは、さまざまなプラットフォームで利用できます。 プラットフォームに適用可能なバイナリコードのみをダウンロードし、Perlをインストールする必要があります。

プラットフォームのバイナリコードが利用できない場合は、ソースコードを手動でコンパイルするCコンパイラが必要です。 ソースコードをコンパイルすると、インストールに必要な機能の選択に関して柔軟性が高まります。

以下は、さまざまなプラットフォームにPerlをインストールする簡単な概要です。

UnixおよびLinuxのインストール

Unix/LinuxマシンにPerlをインストールする簡単な手順を以下に示します。

  • Webブラウザーを開き、https://www.perl.org/getl [[[1]]]にアクセスします。
  • リンクに従って、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

-ここで、$はコマンドを入力するUnixプロンプトであるため、上記のコマンドを入力するときに$を入力しないでください。

これにより、Perlは標準の場所_/usr/local/bin_にインストールされ、そのライブラリは_/usr/local/lib/perlXX_にインストールされます。XXは使用しているPerlのバージョンです。

*make* コマンドを発行した後、ソースコードをコンパイルするには時間がかかります。 インストールが完了したら、$プロンプトで *perl -v* コマンドを発行して、perlのインストールを確認できます。 すべてが正常であれば、上に示したようなメッセージが表示されます。

Windowsインストール

WindowsマシンにPerlをインストールする手順は次のとおりです。

  • WindowsでのStrawberry Perlインストールのリンクをたどってくださいhttp://strawberryperl.com
  • 32ビットまたは64ビットバージョンのインストールをダウンロードします。
  • ダウンロードしたファイルをWindowsエクスプローラーでダブルクリックして実行します。 これにより、非常に使いやすいPerlインストールウィザードが表示されます。 デフォルト設定をそのまま使用し、インストールが完了するまで待ちます。これで準備完了です。

Macintoshインストール

独自のバージョンのPerlを構築するには、「make」が必要です。これは、通常Mac OSインストールDVDで提供されるApples開発者ツールの一部です。 makeをインストールするために、最新バージョンのXcode(現在は有料)は必要ありません。

Mac OS XマシンにPerlをインストールする簡単な手順を次に示します。

  • Webブラウザーを開き、https://www.perl.org/getlにアクセスします。
  • リンクをクリックして、Mac OS Xで使用可能な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

ここに利用可能なすべてのコマンドラインオプションのリストがあります-

Sr.No. Option & Description
1

-d[:debugger]

デバッガーの下でプログラムを実行します

2

-Idirectory

&commat; 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アプリケーションだけです。 Padre、Perl IDEをダウンロードできます。 Eclipseに精通している場合は、Eclipseプラグインhttps://www.epic-ide.org/[EPIC-Eclipse用PerlエディターおよびIDE]を使用することもできます。

次の章に進む前に、環境が適切に設定されており、正常に機能していることを確認してください。 環境を適切にセットアップできない場合は、システム管理者から支援を受けることができます。

以降の章で示されるすべての例は、LinuxのCentOSフレーバーで利用可能なバージョン5.16.2で実行されています。

Perl-構文の概要

Perlは、多くの言語(awk、sed、C、Bourne Shell、Smalltalk、Lisp、さらには英語)から構文と概念を借用しています。 ただし、言語間には明確な違いがあります。 この章は、Perlで期待される構文をすぐに理解できるように設計されています。

Perlプログラムは、宣言とステートメントのシーケンスで構成され、上から下に実行されます。 ループ、サブルーチン、およびその他の制御構造により、コード内をジャンプできます。 すべての単純なステートメントはセミコロン(;)で終わる必要があります。

Perlは自由形式の言語です。好きなようにフォーマットしてインデントできます。 ホワイトスペースは、構文の重要な部分であるPythonや、重要ではないFortranなどの言語とは異なり、主にトークンの分離に役立ちます。

最初のPerlプログラム

インタラクティブモードプログラミング

コマンドラインで -e オプションを指定してPerlインタープリターを使用すると、コマンドラインから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$

「ここ」のドキュメント

複数行のテキストを非常に快適に保存または印刷できます。 「here」ドキュメント内の変数を使用することもできます。 以下は簡単な構文です。<<と識別子の間にスペースがないように注意して確認してください。

識別子は、下の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は、バックスラッシュ(\)文字を使用して、コードに干渉する可能性のあるあらゆる種類の文字をエスケープします。 二重引用符と$記号を出力したい例を見てみましょう-

#!/usr/bin/perl

$result = "This is \"number\"";
print "$result\n";
print "\$result\n";

これは、次の結果を生成します-

This is "number"
$result

Perl識別子

Perl識別子は、変数、関数、クラス、モジュール、またはその他のオブジェクトを識別するために使用される名前です。 Perl変数名は、$、&commat;のいずれかで始まります。または%の後にゼロ個以上の文字、アンダースコア、および数字(0〜9)が続きます。

Perlでは、識別子内で&commat;、$、%などの句読点文字を使用できません。 Perlは、大文字と小文字を区別*するプログラミング言語です。 したがって、 *$ Manpower$ manpower はPerlの2つの異なる識別子です。

Perl-データ型

Perlは緩やかに型付けされた言語であり、プログラムでの使用中にデータの型を指定する必要はありません。 Perlインタープリターは、データ自体のコンテキストに基づいてタイプを選択します。

Perlには、スカラー、スカラーの配列、および連想配列とも呼ばれるスカラーのハッシュの3つの基本データ型があります。 これらのデータ型について少し詳しく説明します。

Sr.No. Types & Description
1

Scalar

スカラーは単純な変数です。 それらの前にはドル記号($)が付いています。 スカラーは、数値、文字列、または参照です。 参照は実際には変数のアドレスであり、これについては次の章で説明します。

2

Arrays

配列は、0で始まる数値インデックスでアクセスするスカラーの順序付きリストです。 それらの前には「アット」記号(&commat;)が付いています。

3

Hashes

ハッシュは、キーを添え字として使用してアクセスするキー/値ペアの順序付けられていないセットです。 これらの前にはパーセント記号(%)が付いています。

数値リテラル

Perlは、すべての数値を符号付き整数または倍精度浮動小数点値として内部に保存します。 数値リテラルは、次の浮動小数点または整数形式のいずれかで指定されています-

Type Value
Integer 1234
Negative integer -100
Floating point 2000
Scientific notation 16.12E14
Hexadecimal 0xffff
Octal 0577

文字列リテラル

文字列は文字の並びです。 通常は、単一引用符( ')または二重引用符( ")で区切られた英数字の値です。 これらは、単一引用符で囲まれた文字列と二重引用符で囲まれた文字列を使用できるUNIXシェル引用符のように機能します。

二重引用符で囲まれた文字列リテラルでは変数の補間が可能ですが、単一引用符で囲まれた文字列ではできません。 バックスラッシュが続く特定の文字があり、特別な意味を持ち、改行(\ n)またはタブ(\ t)のような表現に使用されます。

あなたは二重引用符で囲まれた文字列に改行または次のエスケープシーケンスのいずれかを直接埋め込むことができます-

Escape sequence Meaning
\\ Backslash
\' Single quote
\" Double quote
\a Alert or bell
\b Backspace
\f Form feed
\n Newline
\r Carriage return
\t Horizontal tab
\v Vertical tab
\0nn Creates Octal formatted numbers
\xnn Creates Hexideciamal formatted numbers
\cX Controls characters, x may be any character
\u Forces next character to uppercase
\l Forces next character to lowercase
\U Forces all following characters to uppercase
\L Forces all following characters to lowercase
\Q Backslash all following non-alphanumeric characters
\E End \U, \L, or \Q

文字列が一重引用符と二重引用符でどのように動作するかをもう一度見てみましょう。 ここでは、上記の表に記載されている文字列エスケープを使用し、スカラー変数を使用して文字列値を割り当てます。

#!/usr/bin/perl

# This is case of interpolation.
$str = "Welcome to \nfinddevguides.com!";
print "$str\n";

# This is case of non-interpolation.
$str = 'Welcome to \nfinddevguides.com!';
print "$str\n";

# Only W will become upper case.
$str = "\uwelcome to finddevguides.com!";
print "$str\n";

# Whole line will become capital.
$str = "\UWelcome to finddevguides.com!";
print "$str\n";

# A portion of line will become capital.
$str = "Welcome to \Ufinddevguides\E.com!";
print "$str\n";

# Backsalash non alpha-numeric including spaces.
$str = "\QWelcome to finddevguides's family";
print "$str\n";

これは、次の結果を生成します-

Welcome to
finddevguides.com!
Welcome to \nfinddevguides.com!
Welcome to finddevguides.com!
WELCOME TO finddevguides.COM!
Welcome to finddevguides.com!
Welcome\ to\ finddevguides\'s\ family

Perl-変数

変数は、値を保存するために予約されたメモリの場所です。 これは、変数を作成するときに、メモリ内にスペースを確保することを意味します。

変数のデータ型に基づいて、インタプリタはメモリを割り当て、予約メモリに保存できるものを決定します。 したがって、異なるデータ型を変数に割り当てることにより、整数、小数、または文字列をこれらの変数に格納できます。

Perlには次の3つの基本データ型があることがわかっています-

  • スカラー
  • 配列 *ハッシュ

したがって、Perlでは3種類の変数を使用します。* scalar 変数の前にはドル記号($)が付き、数値、文字列、または参照のいずれかを格納できます。 *array 変数の前には符号&commat;が付きます。そして、スカラーの順序付きリストを保存します。 最後に、 Hash 変数の前に符号%を付け、キー/値のペアのセットを保存するために使用します。

Perlは、すべての変数タイプを個別のネームスペースに保持します。 したがって、競合を恐れることなく、スカラー変数、配列、またはハッシュに同じ名前を使用できます。 これは、$ fooと&commat; 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ページ全体です。 単に何でもいいと言っているが、ただ一つのこと。

これはスカラー変数を使用した簡単な例です-

#!/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

配列変数

配列は、スカラー値の順序付きリストを格納する変数です。 配列変数の前には「アット」(&commat;)記号が付きます。 配列の1つの要素を参照するには、変数名にドル記号($)を使用し、その後に角括弧で要素のインデックスを続けます。

これは、配列変数を使用する簡単な例です-

#!/usr/bin/perl

&commat;ages = (25, 30, 40);
&commat;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

ハッシュ変数

ハッシュは*キー/値*のペアのセットです。 ハッシュ変数の前にはパーセント記号(%)が付きます。 ハッシュの単一の要素を参照するには、ハッシュ変数名の後に、中括弧で囲まれた値に関連付けられた「キー」を使用します。

ハッシュ変数を使用した簡単な例を次に示します-

#!/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

&commat;names = ('John Paul', 'Lisa', 'Kumar');

&commat;copy = &commat;names;
$size = &commat;names;

print "Given names are : &commat;copy\n";
print "Number of names are : $size\n";

これは、次の結果を生成します-

Given names are : John Paul Lisa Kumar
Number of names are : 3

ここで&commat; namesは配列であり、2つの異なるコンテキストで使用されています。 最初に、それを他の配列、つまりリストにコピーしたので、コンテキストがリストコンテキストであると仮定してすべての要素を返しました。 次に、同じ配列を使用し、この配列をスカラーに格納しようとしたため、この場合、コンテキストがスカラーコンテキストであると仮定して、この配列の要素数のみを返しました。 次の表は、さまざまなコンテキストを示しています-

Sr.No. Context & Description
1

Scalar

スカラー変数への代入は、スカラーコンテキストの右側を評価します。

2

List

配列またはハッシュへの割り当ては、リストコンテキストの右側を評価します。

3

Boolean

ブールコンテキストは、式がtrueまたはfalseであるかどうかを確認するために式が評価される場所です。

4

Void

このコンテキストは、戻り値が何であるかを気にしないだけでなく、戻り値も必要としません。

5

Interpolative

このコンテキストは、引用符、または引用符のように機能するものの内部でのみ発生します。

Perl-スカラー

スカラーは、単一のデータ単位です。 そのデータは、整数、浮動小数点、文字、文字列、段落、または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 "mul = $mul\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

以下のように「here」ドキュメント構文を使用して、複数行を保存または印刷できます-

#!/usr/bin/perl

print <<EOF;
This is
a multiline
string
EOF

これも同じ結果を生成します-

This is
a multiline
string

Vストリング

v1.20.300.4000形式のリテラルは、指定された序数の文字で構成される文字列として解析されます。 この形式はv-stringsとして知られています。

v-stringは、やや読みにくい補間形式 "\ x \ {1} \ x \ {14} \ x \ {12c} \ x \ {fa0}"を使用するのではなく、文字列を構築するための代替の読みやすい方法を提供します。

これらは、vで始まり、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つの特別なリテラルFILELINE、および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__

Perl-配列

配列は、スカラー値の順序付きリストを格納する変数です。 配列変数の前には「アット」(&commat;)記号が付きます。 配列の1つの要素を参照するには、変数名にドル記号($)を使用し、その後に角括弧で要素のインデックスを続けます。

これは、配列変数を使用する簡単な例です-

#!/usr/bin/perl

&commat;ages = (25, 30, 40);
&commat;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では、リストと配列の用語はしばしば交換可能として使用されます。 しかし、リストはデータであり、配列は変数です。

配列作成

配列変数の先頭には&commat;が付きます署名し、かっこまたはqw演算子を使用して入力します。 たとえば-

&commat;array = (1, 2, 'Hello');
&commat;array = qw/This is an array/;

2行目はqw//演算子を使用します。これは、区切り文字列を空白で区切った文字列のリストを返します。 この例では、これにより4要素配列になります。最初の要素は「this」で、最後(4番目)は「array」です。 これは、次のように異なる行を使用できることを意味します-

&commat;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

ここで、二重ドット(..)は*範囲演算子*と呼ばれます。 これは、次の結果を生成します-

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

配列サイズ

配列のサイズは、配列上のスカラーコンテキストを使用して決定することができます-返される値は、配列内の要素の数になります-

&commat;array = (1,2,3);
print "Size: ",scalar &commat;array,"\n";

返される値は、有効な要素の数ではなく、常に配列の物理サイズになります。 あなたはこれを実証することができ、このフラグメントを使用して、スカラー&commat; 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 関数を使用してさまざまな値を印刷してきました。 同様に、さまざまな他の機能またはサブルーチンと呼ばれることもありますが、これらはさまざまな他の機能に使用できます。

Sr.No. Types & Description
1

push COMMATARRAY, LIST

リストの値を配列の最後にプッシュします。

2

pop COMMATARRAY

ポップオフし、配列の最後の値を返します。

3

shift COMMATARRAY

配列の最初の値をシフトオフして返し、配列を1だけ短くしてすべてを下に移動します。

4

unshift COMMATARRAY, LIST

リストの先頭に配列の先頭を付け、新しい配列の要素数を返します。

#!/usr/bin/perl

# create a simple array
@coins = ("Quarter","Dime","Nickel");
print "1. \&commat;coins  = &commat;coins\n";

# add one element at the end of the array
push(&commat;coins, "Penny");
print "2. \&commat;coins  = &commat;coins\n";

# add one element at the beginning of the array
unshift(&commat;coins, "Dollar");
print "3. \&commat;coins  = &commat;coins\n";

# remove one element from the last of the array.
pop(&commat;coins);
print "4. \&commat;coins  = &commat;coins\n";

# remove one element from the beginning of the array.
shift(&commat;coins);
print "5. \&commat;coins  = &commat;coins\n";

これは、次の結果を生成します-

1. &commat;coins = Quarter Dime Nickel
2. &commat;coins = Quarter Dime Nickel Penny
3. &commat;coins = Dollar Quarter Dime Nickel Penny
4. &commat;coins = Dollar Quarter Dime Nickel
5. &commat;coins = Quarter Dime Nickel

配列要素のスライス

配列から「スライス」を抽出することもできます。つまり、配列から複数の項目を選択して、別の配列を作成できます。

#!/usr/bin/perl

&commat;days = qw/Mon Tue Wed Thu Fri Sat Sun/;

&commat;weekdays = &commat;days[3,4,5];

print "&commat;weekdays\n";

これは、次の結果を生成します-

Thu Fri Sat

スライスの仕様には、それぞれがコンマで区切られた正または負の有効なインデックスのリストが必要です。 速度のために、 .. 範囲演算子も使用できます-

#!/usr/bin/perl

&commat;days = qw/Mon Tue Wed Thu Fri Sat Sun/;

&commat;weekdays = &commat;days[3..5];

print "&commat;weekdays\n";

これは、次の結果を生成します-

Thu Fri Sat

配列要素の置き換え

今、私たちは* splice()*と呼ばれるもう1つの関数を紹介しようとしています。

splice &commat;ARRAY, OFFSET [ , LENGTH [ , LIST ] ]

この関数は、OFFSETおよびLENGTHで指定された@ARRAYの要素を削除し、指定されている場合はLISTに置き換えます。 最後に、配列から削除された要素を返します。 以下は例です-

#!/usr/bin/perl

&commat;nums = (1..20);
print "Before - &commat;nums\n";

splice(&commat;nums, 5, 5, 21..25);
print "After - &commat;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

ここで、実際の置換は5番目の要素が6から10に21、22、23、24、25の数字に置き換えられた後、6番目の数字から始まります。

文字列を配列に変換する

次の構文を持つ* split()*と呼ばれるもう1つの関数を見てみましょう-

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.
&commat;string = split('-', $var_string);
&commat;names  = split(',', $var_names);

$string1 = join( '-', &commat;string );
$string2 = join( ',', &commat;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
&commat;foods = qw(pizza steak chicken burgers);
print "Before: &commat;foods\n";

# sort this array
@foods = sort(&commat;foods);
print "After: &commat;foods\n";

これは、次の結果を生成します-

Before: pizza steak chicken burgers
After: burgers chicken pizza steak

ソートは単語のASCII数値に基づいて実行されることに注意してください。 したがって、最適なオプションは、最初に配列のすべての要素を小文字に変換してから、ソート機能を実行することです。

$ [特殊変数

これまでに、プログラムで定義した単純な変数を見て、それらを使用してスカラー値と配列値を保存および印刷しました。 Perlは、定義済みの意味を持つ多数の特殊変数を提供します。

  • $ [*と記述された特別な変数があります。 この特殊変数は、すべての配列の最初のインデックスを含むスカラーです。 Perl配列にはゼロベースのインデックス付けがあるため、$ [はほとんど常に0になります。 ただし、$ [を1に設定すると、すべての配列でオンベースのインデックスが使用されます。 ゼロ以外のインデックスを使用しないことをお勧めします。 ただし、$ [変数の使用法を示すために例を見てみましょう-
#!/usr/bin/perl

# define an array
&commat;foods = qw(pizza steak chicken burgers);
print "Foods: &commat;foods\n";

# Let's reset first index of all the arrays.
$[ = 1;

print "Food at \&commat;foods[1]: $foods[1]\n";
print "Food at \&commat;foods[2]: $foods[2]\n";

これは、次の結果を生成します-

Foods: pizza steak chicken burgers
Food at &commat;foods[1]: pizza
Food at &commat;foods[2]: steak

配列のマージ

配列は単なるコンマ区切りの値のシーケンスであるため、以下に示すようにそれらを組み合わせることができます-

#!/usr/bin/perl

&commat;numbers = (1,3,(4,5,6));

print "numbers = &commat;numbers\n";

これは、次の結果を生成します-

numbers = 1 3 4 5 6

埋め込み配列は、以下に示すようにメイン配列の一部になります-

#!/usr/bin/perl

&commat;odd = (1,3,5);
&commat;even = (2, 4, 6);

&commat;numbers = (&commat;odd, &commat;even);

print "numbers = &commat;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

同様に、先頭の&commat;を必要とせずに、スライスを抽出できます。文字-

#!/usr/bin/perl

&commat;list = (5,4,3,2,1)[1..3];

print "Value of list = &commat;list\n";

これは、次の結果を生成します-

Value of list = 4 3 2

Perl-ハッシュ

ハッシュは*キー/値*のペアのセットです。 ハッシュ変数の前にはパーセント記号(%)が付きます。 ハッシュの単一の要素を参照するには、「$」記号が前にあり、中括弧内の値に関連付けられた「キー」が後に続くハッシュ変数名を使用します。

ハッシュ変数を使用した簡単な例を次に示します-

#!/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);

しかし、単一の単語があることに注意することが重要です。つまり、スペースなしでこの形式のハッシュ形成でキーが使用されており、この方法でハッシュを構築する場合、キーは以下に示すようにハイフンのみを使用してアクセスされます。

$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

スライスの抽出

配列からスライスを抽出できるように、ハッシュのスライスを抽出できます。 &commat;を使用する必要があります。値のリストになるため、返された値を保存する変数のプレフィックス-

#!/uer/bin/perl


%data = (-JohnPaul => 45, -Lisa => 30, -Kumar => 40);

&commat;array = &commat;data{-JohnPaul, -Lisa};

print "Array : &commat;array\n";

これは、次の結果を生成します-

Array : 45 30

キーと値の抽出

あなたは、次の構文を持つ*キー*関数を使用して、ハッシュからすべてのキーのリストを取得することができます-

keys %HASH

この関数は、名前付きハッシュのすべてのキーの配列を返します。 以下は例です-

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

&commat;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);

&commat;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 パーツが実行されます。 上記のプログラムを実行すると、次の結果が生成されます。ここで、指定された条件_exists($ data \ {'Lisa'} _はtrueを返すためです-

Lisa is 30 years old

ハッシュサイズの取得

サイズ、つまり、キーまたは値のスカラーコンテキストを使用してハッシュから要素の数を取得できます。 単に最初にあなたがキーまたは値のいずれかの配列を取得する必要があると言ってから、次のように配列のサイズを取得できます

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);

&commat;keys = keys %data;
$size = &commat;keys;
print "1 - Hash size:  is $size\n";

@values = values %data;
$size = &commat;values;
print "2 - Hash size:  is $size\n";

これは、次の結果を生成します-

1 - Hash size: is 3
2 - Hash size: is 3

ハッシュ内の要素の追加と削除

新しいキー/値のペアの追加は、単純な代入演算子を使用して1行のコードで実行できます。 しかし、ハッシュから要素を削除するには、例で以下に示すように*削除*機能を使用する必要があります-

#!/usr/bin/perl

%data = ('John Paul' => 45, 'Lisa' => 30, 'Kumar' => 40);
&commat;keys = keys %data;
$size = &commat;keys;
print "1 - Hash size:  is $size\n";

# adding an element to the hash;
$data{'Ali'} = 55;
&commat;keys = keys %data;
$size = &commat;keys;
print "2 - Hash size:  is $size\n";

# delete the same element from the hash;
delete $data{'Ali'};
&commat;keys = keys %data;
$size = &commat;keys;
print "3 - Hash size:  is $size\n";

これは、次の結果を生成します-

1 - Hash size: is 3
2 - Hash size: is 4
3 - Hash size: is 3

Perl条件ステートメント-IF …​ ELSE

Perl条件ステートメントは、意思決定を支援します。これは、プログラマーが、プログラムによって評価またはテストされる1つ以上の条件と、条件が真であると判断された場合に実行されるステートメントを指定する必要があります。条件が偽と判断された場合に実行されるステートメント。

以下は、ほとんどのプログラミング言語で見られる典型的な意思決定構造の一般的なものです-

Perlでの意思決定ステートメント

数値0、文字列 '0’および ""、空のリスト()、およびundefはすべてブールコンテキストで false であり、他のすべての値は true です。 !*または *not による真の値の否定は、特別な偽の値を返します。

Perlプログラミング言語は、次のタイプの条件ステートメントを提供します。

Sr.No. Statement & Description
1

if statement

  • ifステートメント*は、ブール式とそれに続く1つ以上のステートメントで構成されます。
2

if…​else statement

  • ifステートメント*の後にオプションの* elseステートメント*を続けることができます。
3

if…​elsif…​else statement

  • ifステートメント*の後にオプションの* elsifステートメント*を続けてから、オプションの* elseステートメント*を続けることができます。
4

unless statement

  • unlessステートメント*は、ブール式とそれに続く1つ以上のステートメントで構成されます。
5

unless…​else statement

  • unlessステートメント*の後にオプションの* elseステートメント*を続けることができます。
6

unless…​elsif..else statement

  • unlessステートメント*の後には、オプションの* elsifステートメント*が続き、その後にオプションの* elseステートメント*が続きます。
7

switch statement

Perlの最新バージョンでは、 switch ステートメントを使用できます。 これにより、変数値をさまざまな条件と簡単に比較できます。

は? :オペレーター

条件演算子を確認しましょうか? : if …​ else ステートメントを置き換えるために使用できます。 それは次の一般的な形式を持っています-

Exp1 ? Exp2 : Exp3;

Exp1、Exp2、およびExp3は式です。 コロンの使用と配置に注意してください。

aの値 式は次のように決定されます:Exp1が評価されます。 真の場合、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

Perl-ループ

コードのブロックを数回実行する必要がある場合があります。 一般に、ステートメントは順番に実行されます。関数の最初のステートメントが最初に実行され、次に2番目のステートメントが実行されます。

プログラミング言語は、より複雑な実行パスを可能にするさまざまな制御構造を提供します。

ループステートメントを使用すると、ステートメントまたはステートメントのグループを複数回実行できます。ほとんどのプログラミング言語では、ループステートメントの一般的な形式は次のとおりです-

Perlのループアーキテクチャ

Perlプログラミング言語は、ループ要件を処理するために次のタイプのループを提供します。

Sr.No. Loop Type & Description
1

while loop

特定の条件が真の間、ステートメントまたはステートメントのグループを繰り返します。 ループ本体を実行する前に条件をテストします。

2

until loop

特定の条件が真になるまで、ステートメントまたはステートメントのグループを繰り返します。 ループ本体を実行する前に条件をテストします。

3

for loop

一連のステートメントを複数回実行し、ループ変数を管理するコードを短縮します。

4

foreach loop

foreachループは、通常のリスト値を反復処理し、変数VARをリストの各要素に順番に設定します。

5

do…​while loop

while文と似ていますが、ループ本体の最後で条件をテストします

6

nested loops

while、for、またはdo..whileループ内で1つ以上のループを使用できます。

ループ制御ステートメント

ループ制御ステートメントは、通常のシーケンスから実行を変更します。 実行がスコープを離れると、そのスコープで作成されたすべての自動オブジェクトが破棄されます。

Perlは、次の制御ステートメントをサポートしています。 詳細を確認するには、次のリンクをクリックしてください。

Sr.No. Control Statement & Description
1

next statement

ループがその本体の残りをスキップし、反復する前にその状態をすぐに再テストします。

2

last statement

ループステートメントを終了し、ループの直後のステートメントに実行を転送します。

3

continue statement

継続ブロック。条件が再び評価される直前に常に実行されます。

4

redo statement

redoコマンドは、条件を再度評価せずにループブロックを再起動します。 continueブロック(存在する場合)は実行されません。

5

goto statement

Perlは、goto label、goto expr、およびgoto&nameの3つの形式でgotoコマンドをサポートしています。

無限ループ

条件が決して偽にならない場合、ループは無限ループになります。 for ループは伝統的にこの目的に使用されます。 for ループを形成する3つの式はいずれも必要ないため、条件式を空のままにして無限ループを作成できます。

#!/usr/local/bin/perl

for( ; ; ) {
   printf "This loop will run forever.\n";
}

Ctrl + Cキーを押すと、上記の無限ループを終了できます。

条件式が存在しない場合、trueと見なされます。 初期化式と増分式を使用できますが、プログラマはより一般的にfor(;;)構造を使用して無限ループを示します。

Perl-演算子

オペレーターとは?

式_4 + 5 is equal to 9_を使用して簡単な答えを出すことができます。 ここで、4と5はオペランドと呼ばれ、+は演算子と呼ばれます。 Perl言語は多くの演算子タイプをサポートしていますが、以下は重要で最も頻繁に使用される演算子のリストです-

  • 算術演算子
  • 平等演算子
  • 論理演算子
  • 割り当て演算子
  • ビット演算子
  • 論理演算子
  • 引用のような演算子 *その他の演算子

すべての演算子を1つずつ見てみましょう。

Perlの算術演算子

変数$ aが10を保持し、変数$ bが20を保持すると仮定すると、以下はPerlの算術演算子です-

リンク:/perl/arithmetic_operators_example [例を表示]

Sr.No. Operator & Description
1
  • + ( Addition )*

演算子の両側に値を追加します

-$ a + $ bは30を与える

2
  • (減算)*

左側のオペランドから右側のオペランドを減算します

-$ a-$ bは-10になります

3
  • (乗算)*

演算子の両側の値を乗算します

-$ a *$ bは200を与える

4

/(Division)

左オペランドを右オペランドで除算します

-$ b/$ aは2を与える

5

% (Modulus)

左オペランドを右オペランドで除算し、剰余を返します

-$ b%$ aは0を与える

6
  • (指数)*

演算子で指数(パワー)計算を実行します

-$ a * *$ bは10の20乗になります

Perlの等価演算子

これらは関係演算子とも呼ばれます。 変数$ aが10を保持し、変数$ bが20を保持すると仮定して、次の数値等式演算子をチェックします-

リンク:/perl/numeric_equality_operators_example [例を表示]

Sr.No. Operator & Description
1
  • == (equal to)*

2つのオペランドの値が等しいかどうかを確認し、等しい場合は条件が真になります。

-($ a == $ b)は正しくありません。

2

!= (not equal to)

2つのオペランドの値が等しいかどうかをチェックし、値が等しくない場合は条件が真になります。

-($ a!= $ b)はtrueです。

3

<⇒

2つのオペランドの値が等しいかどうかをチェックし、左の引数が右の引数より数値的に小さいか、等しいか、大きいかによって-1、0、または1を返します。

-($ a <⇒ $ b)は-1を返します。

4

> (greater than)

左のオペランドの値が右のオペランドの値よりも大きいかどうかをチェックし、そうであれば条件が真になります。

-($ a> $ b)は正しくありません。

5

< (less than)

左のオペランドの値が右のオペランドの値よりも小さいかどうかを確認し、そうであれば条件が真になります。

-($ a <$ b)は真です。

6

>= (greater than or equal to)

左のオペランドの値が右のオペランドの値以上かどうかをチェックし、はいの場合は条件が真になります。

-($ a> = $ b)は正しくありません。

7

⇐ (less than or equal to)

左のオペランドの値が右のオペランドの値以下かどうかをチェックし、そうであれば条件が真になります。

-($ a ⇐ $ b)はtrueです。

以下はエクイティ演算子のリストです。 変数$ aが「abc」を保持し、変数$ bが「xyz」を保持すると仮定して、次の文字列等式演算子をチェックします-

link:/perl/string_equality_operators_example [例を表示]

Sr.No. Operator & Description
1

lt

左引数が文字列単位で右引数よりも小さい場合にtrueを返します。

-($ a lt $ b)はtrueです。

2

gt

左の引数が右の引数よりも文字列的に大きい場合、trueを返します。

-($ a gt $ b)はfalseです。

3

le

左引数が文字列単位で右引数以下の場合にtrueを返します。

-($ a le $ b)はtrueです。

4

ge

左引数が文字列単位で右引数以上の場合にtrueを返します。

-($ a ge $ b)はfalseです。

5

eq

左の引数が右の引数と文字列的に等しい場合にtrueを返します。

-($ a eq $ b)はfalseです。

6

ne

左引数が文字列単位で右引数と等しくない場合にtrueを返します。

-($ a ne $ b)はtrueです。

7

cmp

左の引数が右の引数よりも文字列的に小さいか、等しいか、大きいかによって、-1、0、または1を返します。

-($ a cmp $ b)は-1です。

Perl割り当て演算子

変数$ aが10を保持し、変数$ bが20を保持すると仮定すると、Perlで使用可能な代入演算子とその使用法は次のとおりです-

リンク:/perl/assignment_operators_example [例を表示]

Sr.No. Operator & Description
1

=

単純な代入演算子、右側のオペランドから左側のオペランドに値を割り当てます

-$ c = $ a + $ bは、$ a + $ bの値を$ cに割り当てます。

2

=* *=

AND代入演算子を追加します。左オペランドに右オペランドを追加し、結果を左オペランドに割り当てます

-$ c + = $ aは$ c = $ c + $ aと同等

3

-=

AND代入演算子を減算します。左オペランドから右オペランドを減算し、結果を左オペランドに割り当てます

-$ c-= $ aは$ c = $ c-$ aと同等です

4

=*=*

AND代入演算子を乗算します。右オペランドと左オペランドを乗算し、結果を左オペランドに割り当てます。

-$ c = $ aは$ c = $ c $ aと同等

5

/= /=

除算AND代入演算子。左オペランドを右オペランドで除算し、結果を左オペランドに割り当てます。

-$ c/= $ aは$ c = $ c/$ aと同等

6

%=

モジュラスAND代入演算子。2つのオペランドを使用してモジュラスを取り、結果を左のオペランドに割り当てます。

-$ c%= $ aは$ c = $ c%aと同等

7

*=*

指数AND代入演算子、演算子で指数(べき乗)計算を実行し、左のオペランドに値を割り当てます

-$ 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の場合を想定しています。および$ b = 13

リンク:/perl/bitwise_operators_example [例を表示]

[width="100%",cols="50%,50%",options="header",]
|===
|Sr.No. |Operator & Description |1 a|* &*

バイナリAND演算子は、両方のオペランドに存在する場合、結果にビットをコピーします。

*例*-($ a&$ b)は12を与えます。これは0000 1100です

|2 a| *|*

バイナリOR演算子は、eatherオペランドにビットが存在する場合、それをコピーします。

*例*-($ a | $ b)は0011 1101である61を与える

|3 a| *^*

バイナリXOR演算子は、両方ではなく1つのオペランドにビットが設定されている場合、ビットをコピーします。

*例*-($ a ^ $ b)は49を返します。これは0011 0001です

|4 a| *~*

Binary Ones Complement Operatorは単項で、「反転」ビットの効果があります。

*例*-(〜$ a)は、-61を返します。これは、符号付き2進数のため、2の補数形式で1100 0011です。

|5 a| *<<*

バイナリ左シフト演算子。 左のオペランドの値は、右のオペランドで指定されたビット数だけ左に移動します。

*例*-$ a << 2は240となり、1111 0000になります

|6 a| *>>*

バイナリ右シフト演算子。 左のオペランドの値は、右のオペランドで指定されたビット数だけ右に移動します。

*例*-$ a >> 2は0000 1111である15を与える

|===

=== Perlの論理演算子

Perl言語でサポートされている論理演算子は次のとおりです。 変数$ aがtrueを保持し、変数$ bがfalseを保持すると仮定します-

リンク:/perl/logical_operators_example [例を表示]

[width="100%",cols="50%,50%",options="header",]
|===
|Sr.No. |Operator & Description |1 a| *and*

論理AND演算子が呼び出されました。 両方のオペランドが真の場合、条件は真になります。

*例*-($ aおよび$ b)はfalseです。

|2 a| *&&*

Cスタイルの論理AND演算子は、両方のオペランドに存在する場合、結果にビットをコピーします。

*例*-($ a && $ b)はfalseです。

|3 a| *or*

論理OR演算子と呼ばれます。 2つのオペランドのいずれかがゼロ以外の場合、条件は真になります。

*例*-($ aまたは$ b)はtrueです。

|4 a| *||*

Cスタイルの論理OR演算子は、eatherオペランドにビットが存在する場合、それをコピーします。

*例*-($ a || $ b)はtrueです。

|5 a| *not*

論理否定演算子と呼ばれます。 オペランドの論理状態を反転するために使用します。 条件が真の場合、論理否定演算子は偽になります。

*例*-not($ a and $ b)はtrueです。

|===

=== 引用のような演算子

Perl言語でサポートされている次の引用のような演算子があります。 次の表では、\ {}は選択した区切り文字のペアを表します。

リンク:/perl/quote_like_operators_example [例を表示]

[width="100%",cols="50%,50%",options="header",]
|===
|Sr.No. |Operator & Description |1 a| *q\{ }*

単一引用符で文字列を囲みます

*例*-q \ {abcd}は 'abcd'を与える

|2 a| *qq\{ }*

文字列を二重引用符で囲みます

*例*-qq \ {abcd}は「abcd」を与える

|3 a| *qx\{ }*

引用符を含む文字列を囲みます

*例*-qx \ {abcd}は `abcd`を与える

|===

=== その他の演算子

Perl言語でサポートされている以下のその他の演算子があります。 変数aが10を保持し、変数bが20を保持すると仮定します-

リンク:/perl/miscellaneous_operators_example [例を表示]

[width="100%",cols="50%,50%",options="header",]
|===
|Sr.No. |Operator & Description |1 a| *.*

二項演算子ドット(。)は、2つの文字列を連結します。

*例*-$ a = "abc"、$ b = "def"の場合、$ a。$ bは "abcdef"を返します。

|2 a| *x*

繰り返し演算子xは、右のオペランドで指定された回数だけ繰り返された左のオペランドで構成される文字列を返します。

*例*-( '-' x 3)は---を返します。

|3 a|
*..* *..*

範囲演算子.. 左の値から右の値まで(1ずつ)カウントする値のリストを返します

*例*-(2..5)は(2、3、4、5)を与える

|4 a|
*++* *++*

自動インクリメント演算子は整数値を1増加させます

*例*-$ a ++は11を返します

|5 a| *--*

自動デクリメント演算子は整数値を1つ減らします

*例*-$ a--は9になります

|6 a| *->*

矢印演算子は、主にオブジェクトまたはクラス名からメソッドまたは変数を逆参照する際に使用されます

*例*-$ obj-> $ aは、オブジェクト$ objから変数$ aにアクセスする例です。

|===

=== Perl演算子の優先順位

次の表に、優先順位の高いものから低いものまで、すべての演算子を示します。

リンク:/perl/operators_precedence_example [例を表示]

[source,result,notranslate]
----
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-日付と時刻

この章では、Perlで日付と時刻を処理および操作する方法に関する基本的な理解を提供します。

現在の日付と時刻

引数を指定しない場合、現在の日付と時刻の値を返す* localtime()関数から始めましょう。 以下は、リストコンテキストで使用中に *localtime 関数によって返される9要素のリストです-

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()関数を使用してエポック時間を取得できます。つまり、1970年1月1日のUnixでは、特定の日付から経過した秒数です。

#!/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()を使用して、次の表を使用して日付と時刻をフォーマットできます。 アスタリスク()でマークされた指定子はロケールに依存することに注意してください。

Specifier Replaced by Example
%a Abbreviated weekday name * Thu
%A Full weekday name* Thursday
%b Abbreviated month name * Aug
%B Full month name* August
%c Date and time representation * Thu Aug 23 14:55:02 2001
%C Year divided by 100 and truncated to integer (00-99) 20
%d Day of the month, zero-padded (01-31) 23
%D Short MM/DD/YY date, equivalent to %m/%d/%y 08/23/01
%e Day of the month, space-padded (+ 1-31+) 23
%F Short YYYY-MM-DD date, equivalent to %Y-%m-%d 2001-08-23
%g Week-based year, last two digits (00-99) 01
%G Week-based year 2001
%h Abbreviated month name* (same as %b) Aug
%H Hour in 24h format (00-23) 14
%I Hour in 12h format (01-12) 02
%j Day of the year (001-366) 235
%m Month as a decimal number (01-12) 08
%M Minute (00-59) 55
%n New-line character ('\n')
%p AM or PM designation PM
%r 12-hour clock time * 02:55:02 pm
%R 24-hour HH:MM time, equivalent to %H:%M 14:55
%S Second (00-61) 02
%t Horizontal-tab character ('\t')
%T ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S 14:55
%u ISO 8601 weekday as number with Monday as 1 (1-7) 4
%U Week number with the first Sunday as the first day of week one (00-53) 33
%V ISO 8601 week number (00-53) 34
%w Weekday as a decimal number with Sunday as 0 (0-6) 4
%W Week number with the first Monday as the first day of week one (00-53) 34
%x Date representation* 08/23/01
%X Time representation * 14:55:02
%y Year, last two digits (00-99) 01
%Y Year 2001
%z

ISO 8601 offset from UTC in timezone (1 minute = 1, 1 hour = 100)

タイムゾーンを終了できない場合、文字はありません

+100
%Z

Timezone name or abbreviation*

タイムゾーンを終了できない場合、文字はありません

CDT
%% A % sign %

使用法を理解するために、次の例をチェックしましょう-

#!/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は、サブルーチン、メソッド、および関数という用語を同じ意味で使用します。

サブルーチンを定義して呼び出す

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]にあり、2番目の引数は$ _ [1]にあります。

スカラーと同様に引数として配列とハッシュを渡すことができますが、通常、複数の配列またはハッシュを渡すと、それらは別々のアイデンティティを失います。 そのため、参照(次の章で説明)を使用して、配列またはハッシュを渡します。

次の例を試してみましょう。これは、数値のリストを取り、その平均を出力します-

#!/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

サブルーチンから値を返す

他のプログラミング言語で行うように、サブルーチンから値を返すことができます。 サブルーチンから値を返さない場合、サブルーチンで最後に実行された計算はすべて自動的に戻り値にもなります。

スカラーと同様にサブルーチンから配列とハッシュを返すことができますが、通常、複数の配列またはハッシュを返すと、それらは別々のアイデンティティを失います。 したがって、参照(次の章で説明)を使用して、関数から配列またはハッシュを返します。

数字のリストを取り、それらの平均を返す次の例を試してみましょう-

#!/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のすべての変数はグローバル変数です。つまり、プログラム内のどこからでもアクセスできます。 ただし、 my 演算子を使用すると、 lexical variables と呼ばれる private 変数をいつでも作成できます。

*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* は、変数の現在値が呼び出されたサブルーチンから見えるようにする必要がある場合に主に使用されます。 ローカルは単にグローバル(パッケージを意味する)変数に一時的な値を与えます。 これは_dynamic scoping_として知られています。 字句スコープは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 演算子を使用して定義され、Perl 5.9.4以降で使用可能です。

  • 状態*変数の使用を示すために、次の例をチェックしましょう-
#!/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:33 2000)。 逆に-

($sec,$min,$hour,$mday,$mon, $year,$wday,$yday,$isdst) = localtime(time);

現在、個々の変数には、localtime()サブルーチンによって返される対応する値が含まれています。

Perl-リファレンス

Perl参照は、別の値の場所を保持するスカラーデータ型で、スカラー、配列、またはハッシュの場合があります。 スカラーの性質のため、参照はどこでも使用でき、スカラーを使用できます。

他のリストへの参照を含むリスト、ハッシュへの参照を含むリストなどを作成できます。 これが、ネストされたデータ構造がPerlで構築される方法です。

参照を作成する

次のようにバックスラッシュを前に付けることで、変数、サブルーチン、または値の参照を作成するのは簡単です-

$scalarref = \$foo;
$arrayref  = \@ARGV;
$hashref   = \%ENV;
$coderef   = \&handler;
$globref   = \*foo;

あなたは、バックスラッシュ演算子を使用してI/Oハンドル(ファイルハンドルまたはdirhandle)に参照を作成することはできませんが、匿名配列への参照は、次のように角括弧を使用して作成することができます-

 $arrayref = [1, 2, ['a', 'b', 'c']];

同様に、次のように中括弧を使用して匿名ハッシュへの参照を作成できます-

$hashref = {
   'Adam'  => 'Eve',
   'Clyde' => 'Bonnie',
};

匿名サブルーチンへの参照は、次のようにサブ名なしでサブを使用して作成することができます-

$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のフォーマット機能を使用するには、最初にフォーマットを定義する必要があり、次にそのフォーマットを使用してフォーマットされたデータを書き込むことができます。

フォーマットを定義する

以下は、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;

問題は、通常、形式名が開いているファイルハンドルの名前であり、書き込みステートメントがこのファイルハンドルに出力を送信することです。 データを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には現在のヘッダー形式の名前が含まれていますが、フッターに対して同じことを自動的に行う対応するメカニズムはありません。 固定サイズのフッターがある場合、各write()の前に変数$-または$ FORMAT_LINES_LEFTをチェックしてフッターを取得し、必要に応じて次のように定義された別の形式を使用してフッターを自分で印刷します-

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

フォーマットに関連する変数の完全なセットについては、リンクを参照してください:/perl/perl特殊変数[Perl特殊変数]セクション。

Perl-ファイルI/O

ファイル処理の基本は簡単です。 filehandle を外部エンティティ(通常はファイル)に関連付け、Perl内のさまざまな演算子と関数を使用して、ファイルハンドルに関連付けられたデータストリーム内に格納されているデータを読み取り、更新します。

ファイルハンドルは、物理ファイルを名前に関連付ける名前付きの内部Perl構造です。 すべてのファイルハンドルは読み取り/書き込みアクセスが可能なため、ファイルハンドルに関連付けられたファイルまたはデバイスから読み取りおよび更新できます。 ただし、ファイルハンドルを関連付ける場合、ファイルハンドルを開くモードを指定できます。

3つの基本的なファイルハンドル- STDINSTDOUT 、および* 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, $!";

次の表は、さまざまなモードの可能な値を示しています

Sr.No. Entities & Definition
1

< or r

読み取り専用アクセス

2

> or w

作成、書き込み、切り捨て

3

>> or a

書き込み、追加、作成

4

< or r

読み取りと書き込み

5

> or w

読み取り、書き込み、作成、切り捨て

6

>> or a

読み取り、書き込み、追加、および作成

Sysopen関数

*sysopen* 関数は、システム関数のパラメータとして提供されたパラメータを使用して、システムの* open()*関数を使用することを除いて、メインのオープン関数に似ています-

たとえば、更新のためにファイルを開くには、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の可能な値を示しています。

Sr.No. Entities & Definition
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つの引数を取り、既存のファイルの名前を変更します。

既存のファイルを削除する

次に、 unlink 関数を使用してファイルfile1.txtを削除する方法を示す例を示します。

#!/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";
}

ここにファイルまたはディレクトリを確認できる機能のリストがあります-

Sr.No. Operator & Definition
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またはグループIDで読み取り可能ですか?

21

-s

ファイルのサイズを返します。ゼロサイズ=空のファイル。

22

-t

ファイルハンドルはTTY(端末)によって開かれていますか?

23

-u

ファイルにsetuidビットが設定されていますか?

24

-w

ファイルは有効なユーザーIDまたはグループIDで書き込み可能ですか?

25

-x

ファイルは有効なユーザーIDまたはグループIDで実行可能ですか?

26

-z

ファイルサイズはゼロですか?

Perl-ディレクトリ

以下は、ディレクトリで遊ぶために使用される標準関数です。

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-エラー処理

実行とエラーは常に一緒になります。 存在しないファイルを開いている場合。 この状況を適切に処理しなかった場合、プログラムは品質が悪いと見なされます。

エラーが発生すると、プログラムは停止します。 そのため、プログラムの実行中に発生し、プログラムを完全に停止する代わりに適切なアクションを実行するさまざまなタイプのエラーを処理するために、適切なエラー処理が使用されます。

さまざまな方法でエラーを識別してトラップできます。 Perlでエラーを簡単にトラップし、適切に処理します。 使用できる方法はいくつかあります。

ifステートメント

  • ifステートメント*は、ステートメントからの戻り値を確認する必要がある場合の明らかな選択肢です。例えば-
if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

ここで変数$! 実際のエラーメッセージを返します。 また、そうすることが理にかなっている状況では、ステートメントを1行に減らすことができます。例えば-

open(DATA, $file) || die "Error: Couldn't open the file $!";

except関数

*unless* 関数はif:と論理的に反対です。ステートメントは成功ステータスを完全にバイパスし、式がfalseを返す場合にのみ実行できます。 たとえば-
unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}
*unless* ステートメントは、式が失敗した場合にのみエラーまたは代替を発生させる場合に最適です。 ステートメントは、単一行のステートメントで使用する場合にも意味があります-
die "Error: Can't change directory!: $!" unless(chdir("/etc"));

ここでは、chdir操作が失敗し、うまく読み込めた場合にのみ死にます。

三項演算子

非常に短いテストでは、条件演算子*?:*を使用できます

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

ここで達成しようとしていることはそれほど明確ではありませんが、効果は if または unless ステートメントを使用した場合と同じです。 条件演算子は、式またはステートメント内の2つの値のいずれかをすばやく返す場合に最適です。

警告機能

warn関数は警告を発するだけで、メッセージは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関数

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* 関数は、呼び出し元を1レベル上に報告することを除いて、 *die* と同等です。 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

carpと同様に、warnおよびdie機能に応じた行およびファイル情報の組み込みに関して、同じ基本規則が適用されます。

告白機能

*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-特殊変数

Perlには、事前定義された特別な意味を持つ変数がいくつかあります。 これらは、$ _などの通常の変数インジケーター($、@、または%)の後に句読点文字を使用する変数です(以下で説明します)。

ほとんどの特別な変数には、英語のような長い名前があります。たとえば、オペレーティングシステムエラー変数$! $ OS_ERRORとして記述できます。 ただし、英語のような名前を使用する場合は、プログラムファイルの先頭に use English; を1行追加する必要があります。 これにより、インタープリターは変数の正確な意味をピックアップします。

最も一般的に使用される特殊変数は$ _で、デフォルトの入力とパターン検索文字列が含まれています。 たとえば、次の行で-

#!/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」が印刷されます。 これは、ループの各反復で、現在の文字列が$ _に配置され、デフォルトでprintによって使用されるためです。 以下は、Perlが指定しなくても$ _を想定する場所です-

  • ordやintなどの関数を含むさまざまな単項関数、およびデフォルトのSTDINである-tを除くすべてのファイルテスト(-f、-d)。
  • 印刷やリンク解除などのさまざまなリスト機能。
  • =〜演算子なしで使用した場合のパターンマッチング操作m//、s///、およびtr///。
  • 他の変数が指定されていない場合のforeachループのデフォルトの反復子変数。
  • grepおよびmap関数の暗黙的な反復子変数。
  • 行入力操作の結果がwhileテストの唯一の基準として単独でテストされるときに入力レコードを置くデフォルトの場所(つまり)。 whileテスト以外では、これは起こらないことに注意してください。

特別な変数タイプ

特殊変数の使用法と性質に基づいて、次のカテゴリに分類できます-

  • グローバルスカラーの特殊変数。
  • グローバル配列の特殊変数。
  • グローバルハッシュ特殊変数。
  • グローバルスペシャルファイルハンドル。
  • グローバル特殊定数。
  • 正規表現の特殊変数。
  • ファイルハンドルの特殊変数。

グローバルスカラーの特殊変数

すべてのスカラー特殊変数のリストを次に示します。 対応する英語のような名前と記号名をリストしました。

$_

デフォルトの入力およびパターン検索スペース。

$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または$ ERRNO

$@

最後のevalコマンドからのPerl構文エラーメッセージ。

$ EVAL_ERROR

$$

このスクリプトを実行しているPerlプロセスのpid。

$ PROCESS_IDまたは$ PID

$<

このプロセスの実際のユーザーID(uid)。

$ REAL_USER_IDまたは$ UID

$>

このプロセスの実効ユーザーID。

$ EFFECTIVE_USER_IDまたは$ EUID

$(

このプロセスの実際のグループID(gid)。

$ REAL_GROUP_IDまたは$ GID

$)

このプロセスの効果的なgid。

$ EFFECTIVE_GROUP_IDまたは$ EGID

$0

実行中のPerlスクリプトを含むファイルの名前が含まれます。

$ PROGRAM_NAME

$[

配列の最初の要素と部分文字列の最初の文字のインデックス。 デフォルトは0です。

$]

バージョンとパッチレベルを1000で割った値を返します。

$ PERL_VERSION

$^D

デバッグフラグの現在の値。

$デバッグ

$^E

一部のプラットフォームでの拡張エラーメッセージ。

$ EXTENDED_OS_ERROR

$^F

最大システムファイル記述子、通常は2。

$ SYSTEM_FD_MAX

$^H

特定の実用的なモジュールによって有効にされる内部コンパイラヒントが含まれています。

$^I

インプレース編集拡張機能の現在の値。 インプレース編集を無効にするには、undefを使用します。

$ INPLACE_EDIT

$^M

$ Mの内容は、Perlがメモリ不足エラーで終了した場合の緊急メモリプールとして使用できます。 $ Mを使用するには、Perlの特別なコンパイルが必要です。 詳細については、INSTALLドキュメントを参照してください。

$^O

現在のPerlバイナリがコンパイルされたオペレーティングシステムの名前が含まれています。

$ OSNAME

$^P

デバッガがそれ自体をデバッグしないようにクリアする内部フラグ。

$ PERLDB

$^T

スクリプトが実行を開始した時間(エポックからの秒単位)。

$ BASETIME

$^W

警告スイッチの現在の値、trueまたはfalse。

$警告

$^X

Perlバイナリ自体が実行された名前。

$ EXECUTABLE_NAME

$ ARGV

<ARGV>から読み取るときの現在のファイルの名前が含まれます。

グローバル配列の特殊変数

@ARGV The array containing the command-line arguments intended for the script.
@INC The array containing the list of places to look for Perl scripts to be evaluated by the do, require, or use constructs.
@F The array into which the input lines are split when the -a command-line switch is given.

グローバルハッシュ特殊変数

%INC The hash containing entries for the filename of each file that has been included via do or require.
%ENV The hash containing your current environment.
%SIG The hash used to set signal handlers for various signals.

グローバルスペシャルファイルハンドル

ARGV The special filehandle that iterates over command line filenames in @ARGV. Usually written as the null filehandle in <>.
STDERR The special filehandle for standard error in any package.
STDIN The special filehandle for standard input in any package.
STDOUT The special filehandle for standard output in any package.
DATA The special filehandle that refers to anything following the END token in the file containing the script. Or, the special filehandle for anything following the DATA token in a required file, as long as you’re reading data in the same package DATA was found in.
_ (underscore) The special filehandle used to cache the information from the last stat, lstat, or file test operator.

グローバル特殊定数

END Indicates the logical end of your program. Any following text is ignored, but may be read via the DATA filehandle.
FILE Represents the filename at the point in your program where it’s used. Not interpolated into strings.
LINE Represents the current line number. Not interpolated into strings.
PACKAGE Represents the current package name at compile time, or undefined if there is no current package. Not interpolated into strings.

正規表現の特殊変数

$ digit

最後に一致したパターンの対応する括弧のセットと一致したテキストが含まれます。 たとえば、$ 1は、前の正規表現の最初の括弧セットに含まれていたものに一致します。

$&

最後に成功したパターン一致で一致した文字列。

$ MATCH

$`

最後に成功したパターン一致で一致したものに先行する文字列。

$ PREMATCH

$'

最後に成功したパターン一致で一致したものに続く文字列。

$ POSTMATCH

$+

最後の検索パターンと一致した最後のブラケット。 これは、代替パターンのセットのどれが一致したかわからない場合に便利です。 例:/Version:(。)| Revision:(。)/&&($ rev = $ +);

$ LAST_PAREN_MATCH

ファイルハンドルの特殊変数

$|

ゼロ以外に設定すると、現在選択されている出力チャネルでの書き込みまたは印刷のたびに、fflush(3)を強制します。

$ OUTPUT_AUTOFLUSH

$%

現在選択されている出力チャンネルの現在のページ番号。

$ FORMAT_PAGE_NUMBER

$=

現在選択されている出力チャネルの現在のページ長(印刷可能な行)。 デフォルトは60です。

$ FORMAT_LINES_PER_PAGE

$-

現在選択されている出力チャンネルのページに残っている行数。

$ FORMAT_LINES_LEFT

$~

現在選択されている出力チャネルの現在のレポート形式の名前。 デフォルトはファイルハンドルの名前です。

$ FORMAT_NAME

$^

現在選択されている出力チャンネルの現在のページトップ形式の名前。 デフォルトは、_TOPが付加されたファイルハンドルの名前です。

$ FORMAT_TOP_NAME

Perl-コーディング標準

もちろん、各プログラマーはフォーマットに関して独自の好みを持っていますが、プログラムを読み、理解し、保守しやすくする一般的なガイドラインがいくつかあります。

最も重要なことは、プログラムを常に-wフラグの下で実行することです。 必要に応じて、no warningsプラグマまたは$ ^ W変数を使用して、コードの特定の部分に対して明示的にオフにすることができます。 また、常に厳格な使用の下で実行するか、そうでない理由を知っておく必要があります。 sigtrapを使用し、さらに診断プラグマを使用することも有用である可能性があります。

コードのレイアウトの美しさに関して、Larryが強く気をつけている唯一のことは、複数行のブロックの閉じ中括弧が、構造を開始したキーワードと並ぶことです。 それを超えて、彼はそれほど強くない他の好みを持っています-

  • 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;
}

さらにいくつかの重要なポイントを見てみましょう-

  • ループラベルを使用することをためらわないでください。読みやすさを向上させるためだけでなく、マルチレベルのループブレークを可能にするためにもあります。 前の例を参照してください。
  • voidコンテキストで、つまり戻り値を破棄するだけで、grep()(またはmap())または `backticks`を使用しないでください。 これらの関数にはすべて戻り値があるため、それらを使用します。 それ以外の場合は、代わりにforeach()ループまたはsystem()関数を使用します。
  • 移植性のために、すべてのマシンに実装されていない可能性がある機能を使用する場合は、evalでコンストラクトをテストして、失敗するかどうかを確認してください。 特定の機能が実装されたバージョンまたはパッチレベルがわかっている場合は、$](英語では$ PERL_VERSION)をテストして、そこにあるかどうかを確認できます。 Configモジュールでは、Perlのインストール時にConfigureプログラムによって決定された値を調べることもできます。
  • ニーモニック識別子を選択します。 ニーモニックの意味を思い出せない場合は、問題が発生しています。
  • $ gotitなどの短い識別子はおそらく大丈夫ですが、アンダースコアを使用して長い識別子の単語を区切ります。 一般的に、$ VarNamesLikeThisよりも$ var_names_like_thisの方が読みやすく、特に英語を母国語としない人にとっては読みやすいです。 また、VAR_NAMES_LIKE_THISと一貫して機能する単純なルールです。
  • パッケージ名は、この規則の例外になる場合があります。 Perlは、integerやstrictなどの「プラグマ」モジュールの小文字のモジュール名を非公式に予約しています。 他のモジュールは大文字で始め、大文字と小文字を混ぜて使用する必要がありますが、原始ファイルシステムのモジュール名の表現がスパースバイトに収まる必要があるファイルであるため、アンダースコアは使用しないでください。
  • 本当に毛むくじゃらの正規表現がある場合は、/x修飾子を使用し、空白を入れて、ラインノイズのように見えないようにします。 正規表現にスラッシュまたはバックスラッシュが含まれる場合は、スラッシュを区切り文字として使用しないでください。
  • システムコールのリターンコードを常に確認してください。 適切なエラーメッセージはSTDERRに送られ、問題を引き起こしたプログラム、失敗したシステムコールと引数、および(非常に重要な)失敗したものに関する標準システムエラーメッセージを含める必要があります。 これはシンプルだが十分な例です-
opendir(D, $dir) or die "can't opendir $dir: $!";
  • 再利用性について考えてください。 もう一度同じようなことをしたいのに、なぜ一発で頭脳力を浪費するのですか? コードを一般化することを検討してください。 モジュールまたはオブジェクトクラスの作成を検討してください。 use strictおよびuse warnings(または-w)を有効にしてコードをきれいに実行することを検討してください。 コードを提供することを検討してください。 全世界の見方を変えることを検討してください。 検討してください…​ ああ気にしません。
  • 一貫性を保ってください。
  • いいね。

Perl-regular-expressions

Perl-メールの送信

sendmailユーティリティの使用

プレーンメッセージの送信

Linux/Unixマシンで作業している場合は、Perlプログラム内で sendmail ユーティリティを使用してメールを送信できます。 特定のメール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:Lite perlモジュールを使用して独自のメールクライアントを作成することもできます。 このモジュールは、http://search.cpan.org/CPAN/authors/id/Y/YV/YVES/MIME-Lite-3.01.tar.gz [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とパスワードがまだ利用できない場合は、管理者が数分で作成できます。

Perl-ソケットプログラミング

ソケットとは何ですか?

ソケットは、異なるプロセス間で仮想二重接続を作成するBerkeley UNIXメカニズムです。 これは後に、既知のすべてのOSに移植され、異なるOSソフトウェアで実行されている地理的な場所にあるシステム間の通信を可能にしました。 ソケットを使用しない場合、システム間のネットワーク通信のほとんどは発生しませんでした。

よく見てください。ネットワーク上の一般的なコンピューターシステムは、その上で実行されているさまざまなアプリケーションが必要とする情報を送受信します。 一意のIPアドレスが指定されているため、この情報はシステムにルーティングされます。 システムでは、この情報は、さまざまなポートでリッスンする関連アプリケーションに提供されます。 たとえば、インターネットブラウザはポート80でWebサーバーから受信した情報をリッスンします。 また、特定のポート番号で情報をリッスンおよび送受信できるカスタムアプリケーションを作成することもできます。

とりあえず、ソケットはIPアドレスとポートであり、ネットワークを介してデータを送受信するための接続を可能にします。

上記のソケットの概念を説明するために、Perlを使用したクライアント-サーバープログラミングの例を取り上げます。 クライアントサーバーアーキテクチャを完了するには、次の手順を実行する必要があります-

サーバーを作成するには

  • socket 呼び出しを使用してソケットを作成します。
  • bind 呼び出しを使用して、ソケットをポートアドレスにバインドします。
  • listen 呼び出しを使用して、ポートアドレスでソケットをリッスンします。
  • accept 呼び出しを使用してクライアント接続を受け入れます。

クライアントを作成するには

  • socket 呼び出しでソケットを作成します。
  • connect 呼び出しを使用して、サーバーに(ソケット)を接続します。

次の図は、クライアントとサーバーが互いに通信するために使用する呼び出しの完全なシーケンスを示しています-

Perl Socket

サーバー側のソケット呼び出し

socket()呼び出し

  • socket()*呼び出しは、ネットワーク接続を確立してソケットを作成する最初の呼び出しです。 この呼び出しには、次の構文があります-
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );

上記の呼び出しはSOCKETを作成し、他の3つの引数は整数であり、TCP/IP接続に対して次の値を持つ必要があります。

  • DOMAIN はPF_INETである必要があります。 お使いのコンピューターではおそらく2です。
  • TCP/IP接続の場合、 TYPE は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* 句は非常に重要です。サーバーが未処理の接続なしで停止した場合、* setsockopt()*関数を使用してオプションSO_REUSEADDRを使用しない限り、ポートはすぐに再利用できないためです。 ここで、* pack_sockaddr_in()*関数は、ポートとIPアドレスをバイナリ形式にパックするために使用されています。

listen()呼び出し

これがサーバープログラムの場合、指定されたポートで* listen()*を呼び出してリッスンする、つまり、着信要求を待つ必要があります。 この呼び出しには、次の構文があります-

listen( SOCKET, QUEUESIZE );

上記の呼び出しは、socket()呼び出しによって返されるSOCKET記述子を使用し、QUEUESIZEは同時に許可される未処理の接続要求の最大数です。

accept()呼び出し

これがサーバープログラムの場合、* access()*関数の呼び出しを発行して、着信接続を受け入れる必要があります。 この呼び出しには、次の構文があります-

accept( NEW_SOCKET, SOCKET );

socket()関数によって返されるSOCKET記述子を受け取るaccept呼び出しは、正常に完了すると、クライアントとサーバー間の今後のすべての通信に対して新しいソケット記述子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は_bind_呼び出しと同様のソケットアドレスです。ただし、リモートサーバーの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コードです。 ここで、サーバーは着信要求をリッスンし、接続が確立されると、_サーバーからのスマイル_を単に返信します。 クライアントはそのメッセージを読み取り、画面に印刷します。 サーバーとクライアントが同じマシン上にあると仮定して、どのように行われたかを見てみましょう。

サーバーを作成するスクリプト

#!/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

-実際のIPアドレスをドット表記で指定する場合、混乱を避けるために、クライアントとサーバーの両方で同じ形式のIPアドレスを提供することをお勧めします。

PERLでのオブジェクト指向プログラミング

PerlおよびPerlの匿名配列およびハッシュの参照については既に検討しています。 Perlのオブジェクト指向の概念は、参照と匿名配列およびハッシュに非常に基づいています。 オブジェクト指向Perlの基本概念の学習を始めましょう。

オブジェクトの基本

Perlがオブジェクトを処理する方法の観点から説明される3つの主要な用語があります。 用語は、オブジェクト、クラス、およびメソッドです。

  • Perl内の*オブジェクト*は、それが属するクラスを知っているデータ型への単なる参照です。 オブジェクトは、参照としてスカラー変数に格納されます。 スカラーにはオブジェクトへの参照のみが含まれるため、同じスカラーは異なるクラスの異なるオブジェクトを保持できます。
  • Perl内の class は、オブジェクトの作成と操作に必要な対応するメソッドを含むパッケージです。
  • Perl内の method は、パッケージで定義されたサブルーチンです。 メソッドの最初の引数は、メソッドが現在のオブジェクトまたはクラスに影響するかどうかに応じて、オブジェクト参照またはパッケージ名です。

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

これで、従業員クラスには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);
   }
}

デストラクタとガベージコレクション

以前にオブジェクト指向プログラミングを使用してプログラミングしたことがある場合は、オブジェクトの使用が終了したときにオブジェクトに割り当てられたメモリを解放するために*デストラクタ*を作成する必要があることに気付くでしょう。 Perlは、オブジェクトがスコープから外れるとすぐにこれを自動的に行います。

ファイルを閉じたり、余分な処理を行うデストラクタを実装する場合は、 DESTROY という特別なメソッドを定義する必要があります。 このメソッドは、Perlがそれに割り当てられたメモリを解放する直前にオブジェクトで呼び出されます。 他のすべての点で、DESTROYメソッドは他のメソッドとまったく同じであり、このメソッド内に任意のロジックを実装できます。

デストラクタメソッドは、単にDESTROYという名前のメンバー関数(サブルーチン)であり、次の場合に自動的に呼び出されます-

  • オブジェクト参照の変数が範囲外になるとき。
  • オブジェクト参照の変数が未定義の場合。
  • スクリプトが終了するとき
  • Perlインタープリターが終了するとき

たとえば、次のメソッドDESTROYをクラスに単純に入れることができます-

package MyClass;
...
sub DESTROY {
   print "MyClass::DESTROY called\n";
}

オブジェクト指向Perlの例

次に、Perlのオブジェクト指向の概念を理解するのに役立つ別の素晴らしい例を示します。 このソースコードを任意の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スクリプト内のデータベースにアクセスする方法を説明します。 Perl 5以降、 DBI モジュールを使用してデータベースアプリケーションを非常に簡単に作成できるようになりました。 DBIはPerl用の Database Independent Interface の略です。つまり、DBIはPerlコードと基礎となるデータベースの間に抽象化レイヤーを提供し、データベース実装を簡単に切り替えることができることを意味します。

DBIは、Perlプログラミング言語用のデータベースアクセスモジュールです。 使用される実際のデータベースに関係なく、一貫したデータベースインターフェイスを提供する一連のメソッド、変数、および規則を提供します。

DBIアプリケーションのアーキテクチャ

DBIは、バックエンドで使用可能なデータベースから独立しています。 Oracle、MySQL、Informixなどのいずれで作業していても、DBIを使用できます。 これは、次のアーキテクチャ図から明らかです。

PerlデータベースモジュールDBIアーキテクチャ

ここで、DBIはすべてのSQLコマンドをAPI(つまり、アプリケーションプログラミングインターフェース)から取得し、実際の実行のために適切なドライバーにディスパッチする責任があります。 最後に、DBIはドライバーから結果を取得し、呼び出し元のscritpに結果を返す責任があります。

表記法と規則

この章では、次の表記法を使用します。同じ規則に従うことをお勧めします。

$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フィールドがあります。
  • ユーザーID「testuser」とパスワード「test123」は、TESTDBにアクセスするように設定されています。
  • 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に保存されます。

INSERT操作

いくつかのレコードをテーブルに作成する場合は、INSERT操作が必要です。 ここでは、テーブルTEST_TABLEを使用してレコードを作成しています。 したがって、データベース接続が確立されると、TEST_TABLEにレコードを作成する準備が整います。 以下は、TEST_TABLEに単一のレコードを作成する手順です。 同じコンセプトを使用して、好きなだけレコードを作成できます。

レコードの作成は次の手順を実行します-

  • INSERTステートメントでSQLステートメントを準備しています。 これは、* prepare()* APIを使用して行われます。
  • SQLクエリを実行して、データベースからすべての結果を選択します。 これは、* execute()* APIを使用して行われます。
  • Stattementハンドルを解放します。 これは* finish()* APIを使用して行われます。
  • すべてが正常に完了したら、この操作を*コミット*します。それ以外の場合は、トランザクションを*ロールバック*できます。 コミットとロールバックについては、次のセクションで説明します。
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操作は、データベースからいくつかの有用な情報、つまり1つ以上のテーブルから1つ以上のレコードを取得することを意味します。 したがって、データベース接続が確立されると、このデータベースにクエリを実行する準備が整います。 以下は、20より大きいAGEを持つすべてのレコードを照会する手順です。 これは4つのステップがかかります-

  • 必要な条件に基づいてSQL SELECTクエリを準備します。 これは、* prepare()* APIを使用して行われます。
  • SQLクエリを実行して、データベースからすべての結果を選択します。 これは、* execute()* APIを使用して行われます。
  • すべての結果を1つずつ取得し、それらの結果を出力します。これは、* fetchrow_array()* APIを使用して行われます。
  • Stattementハンドルを解放します。 これは* 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操作とは、データベーステーブルですでに使用可能な1つ以上のレコードを更新することです。 以下は、SEXが「M」であるすべてのレコードを更新する手順です。 ここでは、すべての男性の年齢を1年増やします。 これには3つのステップがかかります-

  • 必要な条件に基づいてSQLクエリを準備します。 これは、* prepare()* APIを使用して行われます。
  • SQLクエリを実行して、データベースからすべての結果を選択します。 これは、* execute()* APIを使用して行われます。
  • Stattementハンドルを解放します。 これは* finish()* APIを使用して行われます。
  • すべてが正常に完了したら、この操作を*コミット*します。それ以外の場合は、トランザクションを*ロールバック*できます。 コミットおよびロールバック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操作が必要です。 以下は、AGEが30であるTEST_TABLEからすべてのレコードを削除する手順です。 この操作では、次の手順を実行します。

  • 必要な条件に基づいてSQLクエリを準備します。 これは、* prepare()* APIを使用して行われます。
  • SQLクエリを実行して、データベースから必要なレコードを削除します。 これは、* execute()* APIを使用して行われます。
  • Stattementハンドルを解放します。 これは* finish()* APIを使用して行われます。
  • すべてが正常に完了したら、この操作を*コミット*します。それ以外の場合は、トランザクションを*ロールバック*できます。
$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* は、成功すると真の値を返し、失敗すると偽の値を返します。 実際、成功すると、影響を受けた行の数を返します。 この例では、実際に削除された行の数を返します。

コミット操作

コミットは、変更をファイナライズするためにデータベースに緑のシグナルを与える操作であり、この操作の後、変更を元の位置に戻すことはできません。

*commit* APIを呼び出す簡単な例を次に示します。
$dbh->commit or die $dbh->errstr;

ロールバック操作

すべての変更に満足できない場合、または操作の間にエラーが発生した場合は、それらの変更を元に戻して rollback APIを使用できます。

以下は、 rollback APIを呼び出す簡単な例です。

$dbh->rollback or die $dbh->errstr;

トランザクション開始

多くのデータベースはトランザクションをサポートしています。 これは、データベースを変更するクエリの全体を作成できることを意味しますが、実際には変更は行われません。 最後に、特別なSQLクエリ COMMIT を発行すると、すべての変更が同時に行われます。 または、クエリROLLBACKを発行できます。この場合、すべての変更は破棄され、データベースは変更されません。

Perl DBIモジュールは begin_work APIを提供し、次のコミットまたはロールバックの呼び出しまでトランザクションを有効にします(AutoCommitをオフにすることにより)。 次のコミットまたはロールバックの後、AutoCommitは再び自動的にオンになります。

$rc  = $dbh->begin_work  or die $dbh->errstr;

AutoCommitオプション

トランザクションが単純な場合、多くのコミットを発行する手間を省くことができます。 接続呼び出しを行う場合、クエリが成功するたびに自動コミット操作を実行する 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;

悲しいことに、disconnectメソッドのトランザクションの動作は未定義です。 一部のデータベースシステム(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 \ {} は、引用符付き文字列を prepare APIに返すために使用されます。 ただし、WHERE句でNULL値を使用する場合は注意が必要です。 考慮-

SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?

undef(NULL)をプレースホルダーにバインドすると、NULL年齢の行は選択されません! 少なくとも標準SQLに準拠するデータベースエンジン用。 この理由については、ご使用のデータベースエンジンのSQLマニュアルまたはSQLの本を参照してください。 NULLを明示的に選択するには、「WHERE age IS NULL」と言わなければなりません。

一般的な問題は、実行時に定義済みまたはundef(非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
*モジュールを検索することにより、使用可能なすべてのドライバーのリストを返します。 デフォルトでは、一部のドライバーが以前のディレクトリにある同じ名前の他のドライバーによって隠されている場合、警告が表示されます。 $ quietに真の値を渡すと、警告が抑制されます。

installed_drivers

%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は 'Dont'(外側の引用符を含む)を返します。 quote()メソッドが、目的の文字列に評価されるSQL式を返すことは有効です。 たとえば-

$quoted = $dbh->quote("one\ntwo\0three")

may produce results which will be equivalent to

CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')

すべてのハンドルに共通のメソッド

err

$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と同等です。

rows

$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 ...
}

したがって、代わりに*バインド値*を使用して動的SQLステートメントを準備する補間ステートメントを使用しないでください。

Perl-CGIプログラミング

CGIとは何ですか?

  • Common Gateway Interface(CGI)は、Webサーバーとカスタムスクリプトの間で情報を交換する方法を定義する一連の標準です。
  • CGIの仕様は現在NCSAによって維持されており、NCSAは次のようにCGIを定義しています-
  • Common Gateway Interface(CGI)は、外部ゲートウェイプログラムがHTTPサーバーなどの情報サーバーとインターフェイスするための標準です。
  • 現在のバージョンはCGI/1.1で、CGI/1.2は進行中です。

ウェブブラウジング

CGIの概念を理解するために、特定のWebページまたはURLを閲覧するためにWebページで利用可能なハイパーリンクをクリックするとどうなるかを見てみましょう。

  • ブラウザは、HTTPプロトコルを使用してWebサーバーにアクセスし、URL、つまりWebページのファイル名を要求します。
  • WebサーバーはURLをチェックし、要求されたファイル名を探します。 Webサーバーがそのファイルを見つけると、それ以上実行せずにファイルをブラウザーに送ります。そうしないと、間違ったファイルを要求したことを示すエラーメッセージを送信します。
  • WebブラウザはWebサーバーからの応答を受け取り、ファイルが見つからない場合は、受信したファイルコンテンツまたはエラーメッセージを表示します。

ただし、特定のディレクトリ内のファイルが要求されるたびにそのファイルが送り返されないように、HTTPサーバーを設定することは可能です。代わりに、プログラムとして実行され、そのプログラムが結果として出力するものは何でも、ブラウザに戻されて表示されます。 これは、Webサーバーで使用可能な特別な機能を使用して実行できます。 Common Gateway Interface またはCGIと呼ばれ、最終結果を生成するためにサーバーによって実行されるプログラムはCGIスクリプトと呼ばれます。 これらのCGIプログラムは、PERLスクリプト、シェルスクリプト、CまたはC ++プログラムなどです。

CGIアーキテクチャ図

CGIアーキテクチャ

Webサーバーのサポートと構成

CGIプログラミングに進む前に、WebサーバーがCGI機能をサポートし、CGIプログラムを処理するように構成されていることを確認してください。 Webサーバーによって実行されるすべてのCGIプログラムは、事前に構成されたディレクトリに保持されます。 このディレクトリはCGIディレクトリと呼ばれ、慣例により/cgi-binと名付けられます。 慣例により、Perl CGIファイルの拡張子は .cgi になります。

最初のCGIプログラム

link:/cgi-bin/hello.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スクリプトです。 印刷される最初の行である Content-type:text/html \ r \ n \ r \ n という重要で追加の機能が1つあります。 この行はブラウザに送り返され、ブラウザ画面に表示されるコンテンツタイプを指定します。 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ヘッダーはほとんどありません。

Sr.No. Header & Description
1

Content-type: String

返されるコンテンツの形式を定義するMIME文字列。 例はContent-type:text/htmlです

2

Expires: Date String

情報が無効になる日付。 これは、ブラウザがページを更新する必要がある時期を決定するために使用する必要があります。 有効な日付文字列は、1998年1月1日12:00:00 GMTの形式である必要があります。

3

Location: URL String

要求されたURLの代わりに返されるURL。 このフィールドを使用して、リクエストを他の場所にリダイレクトできます。

4

Last-modified: String

ファイルの最終変更日。

5

Content-length: String

返されるデータの長さ(バイト単位)。 ブラウザはこの値を使用して、ファイルの推定ダウンロード時間を報告します。

6

Set-Cookie: String

_string_を介して渡されるCookieを設定します

CGI環境変数

すべてのCGIプログラムは、次の環境変数にアクセスできます。 これらの変数は、CGIプログラムの作成中に重要な役割を果たします。

Sr.No. Variables Names & Description
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プログラムです。 このリンクをクリックして結果を確認してくださいhttps://www.finddevguides.com/cgi-bin/get_env.cgi[Get Environment]

#!/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サーバーに情報を渡すdefualtメソッドであり、ブラウザーのLocation:boxに表示される長い文字列を生成します。 サーバーに渡すパスワードやその他の機密情報がある場合は、GETメソッドを使用しないでください。 GETメソッドにはサイズ制限があります。リクエスト文字列で渡すことができるのは1024文字のみです。

この情報は QUERY_STRING ヘッダーを使用して渡され、CGIプログラムで解析して使用できるQUERY_STRING環境変数を介してCGIプログラムでアクセスできます。

キーと値のペアを任意のURLと連結するだけで情報を渡すことができます。または、HTML <FORM>タグを使用して、GETメソッドを使用して情報を渡すことができます。

単純なURLの例:Getメソッド

GETメソッドを使用してhello_get.cgiプログラムに2つの値を渡す簡単なURLを次に示します。

リンク:/cgi-bin/hello_get.cgi?first_name = ZARA&last_name = ALI [http://www.finddevguides.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALI]

以下は、Webブラウザからの入力を処理する hello_get.cgi スクリプトです。

#!/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メソッド

HTML FORMと送信ボタンを使用して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スクリプトに提供します。

以下は、Webブラウザーからの入力を処理するために変更された hello_post.cgi スクリプトです。 このスクリプトは、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;

上記と同じ例をもう一度見てみましょう。これは、HTML FORMと送信ボタンを使用して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>

このコードの結果は次の形式です-

数学物理学

以下は、ラジオボタンのWebブラウザーからの入力を処理する checkbox.cgi スクリプトです。

#!/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>

このコードの結果は次の形式です-

数学物理学

以下は、ラジオボタン用にWebブラウザから与えられた入力を処理する radiobutton.cgi スクリプトです。

#!/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>

このコードの結果は次の形式です-

以下は、Webブラウザからの入力を処理する textarea.cgi スクリプトです。

#!/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>

このコードの結果は次の形式です-

数学物理学

以下は、Webブラウザからの入力を処理する dropdown.cgi スクリプトです。

#!/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を取得できます。 取得されると、サーバーは保存された内容を認識/記憶します。

クッキーは5つの可変長フィールドのプレーンテキストデータレコードです-

  • 有効期限-Cookieの有効期限が切れる日付。 これが空白の場合、訪問者がブラウザを終了すると、Cookieは期限切れになります。
  • ドメイン-サイトのドメイン名。
  • Path -Cookieを設定するディレクトリまたはWebページへのパス。 任意のディレクトリまたはページからCookieを取得する場合、これは空白になる場合があります。
  • 安全-このフィールドに「安全」という単語が含まれている場合、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.finddevguides.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-Cookie HTTPヘッダーを使用してCookieを設定しました。 Expires、Domain、PathなどのCookie属性を設定することはオプションです。 マジックライン "Content-type:text/html \ r \ n \ r \ n を送信する前にCookieが設定されることに注意することが重要です。

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プログラムで使用する機能を直接提供する多くの組み込みモジュールがあります。 以下はかつて重要です。

Perl-パッケージとモジュール

パッケージとは何ですか?

*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 { ... }
  • perlスクリプトがロードされコンパイルされた後、他のステートメントが実行される前に、すべての BEGIN ブロックが実行されます。
  • すべての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のパッケージの名前と同じ名前のライブラリファイルで定義された再利用可能なパッケージです。

*Foo.pm* というPerlモジュールファイルには、次のようなステートメントが含まれている場合があります。
#!/usr/bin/perl

package Foo;
sub bar {
   print "Hello $_[0]\n"
}

sub blat {
   print "World $_[0]\n"
}
1;

Perlモジュールに関するいくつかの重要なポイント

  • 関数 require および use はモジュールをロードします。
  • どちらも、モジュールを見つけるために @ INC の検索パスのリストを使用します。
  • どちらの関数も requireuseeval 関数を呼び出してコードを処理します。
  • 下部の 1; により、evalはTRUEと評価されます(したがって失敗しません)。

Require関数

モジュールは、次のように require 関数を呼び出すことでロードできます-

#!/usr/bin/perl

require Foo;

Foo::bar( "a" );
Foo::blat( "b" );

サブルーチン名を呼び出すには、サブルーチン名が完全修飾されている必要があることに注意してください。 Foo ::修飾子を使用する必要がないように、サブルーチン bar および blat を独自のネームスペースにインポートできるようにすると便利です。

使用機能

モジュールは、 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 Subroutine、eXternalはPerlの外部、つまりCを意味します)。
  • -n はモジュールの名前を指定します。

したがって、上記のコマンドはPersonディレクトリ内に次の構造を作成します。 実際の結果は上に示されています。

  • 変更点
  • Makefile.PL
  • MANIFEST(パッケージ内のすべてのファイルのリストが含まれています)
  • README
  • t/(テストファイル)
  • lib/(実際のソースコードはここにあります

最後に、このディレクトリ構造を* Person.tar.gzファイルに tar すると、出荷できます。 適切な手順でREADMEファイルを更新する必要があります。 tディレクトリにいくつかのテスト例ファイルを提供することもできます。

Perlモジュールのインストール

tar.gzファイルの形式でPerlモジュールをダウンロードします。 次のシーケンスを使用して、 Person.tar.gz ファイルとしてダウンロードされたPerlモジュール Person.pm をインストールします。

tar xvfz Person.tar.gz
cd Person
perl Makefile.PL
make
make install

Perlインタープリターには、モジュールを検索するディレクトリーのリストがあります(グローバル配列@INC)。

Perl-プロセス管理

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
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
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や$ HOMEなどのシェル環境変数が含まれている場合は注意してください。 次の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は、同じ名前のUnixシステムコールに対応する* fork()*関数を提供します。 fork()システムコールが使用可能なほとんどのUNIXライクプラットフォームでは、Perlのfork()が単にそれを呼び出します。 fork()システムコールが利用できないWindowsのようないくつかのプラットフォームでは、インタプリタレベルでfork()をエミュレートするためにPerlを構築することができます。

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'、(プロセスリスト))*関数を使用して、fork()によって返されたIDを渡すことにより、疑似プロセスを終了できます。

pseudo-process()でkill( 'KILL'、(Process List))を使用すると、通常、擬似プロセスを実装するスレッドがリソースをクリーンアップする機会を得られないため、メモリリークが発生する可能性があることに注意してください。

  • kill()*関数を使用して、他の信号をターゲットプロセスに送信できます。たとえば、次のようにSIGINTをプロセスID 104および102に送信します-
#!/usr/bin/perl

kill('INT', 104, 102);

1;

Perl-組み込みドキュメント

PerlモジュールおよびスクリプトにPod(Plain Old Text)ドキュメントを埋め込むことができます。 以下は、Perlコードに埋め込まれたドキュメントを使用するルールです-

空の行でドキュメントを開始し、先頭に= * head1 コマンドを入力し、= * *cut *で終了します

Perlは、コードに入力したPodテキストを無視します。 以下は、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

Podをファイルの最後に配置し、ENDまたはDATAカットマークを使用する場合、次のように最初のPodコマンドの前に空の行を配置します。 = * head1 、多くの翻訳者は= * *head1 *をPodブロックの開始として認識していません。

#!/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モジュールのドキュメントを作成するために使用される、使いやすいマークアップ言語です。 Podをプレーンテキスト、HTML、マニュアルページなどのさまざまな形式に変換するためのさまざまなトランスレーターがあります。 ポッドマークアップは、3種類の基本的な段落で構成されます-

  • 通常の段落-太字、斜体、コードスタイル、ハイパーリンクなど、通常の段落で書式設定コードを使用できます。
  • 逐語的な段落-逐語的な段落は通常、特別な解析や書式設定を必要とせず、折り返すべきではないコードブロックやその他のテキストを表示するために使用されます。
  • コマンド段落-コマンド段落は、通常、見出しまたはリストの一部として、テキスト全体を特別に扱うために使用されます。 すべてのコマンドの段落は=で始まり、その後に識別子が続き、その後にコマンドが自由に使用できる任意のテキストが続きます。 現在認識されているコマンドは-
=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

Linuxで利用可能な pod2html ユーティリティを使用して、上記のPODをHTMLに変換できるため、次の結果が生成されます-

著作権2005 [TUTORIALSOPOINT]。

次に、次の例を検討してください-

=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

pod2htmlを使用して上記のPODを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-関数リファレンス

以下は、標準Perlでサポートされているすべての重要な機能のリストです。

  • link:/perl/perl_abs [abs]-絶対値関数
  • link:/perl/perl_accept [accept]-着信ソケット接続を受け入れます
  • link:/perl/perl_alarm [alarm]-SIGALRMをスケジュールします
  • link:/perl/perl_atan2 [atan2]--PIからPIの範囲のY/Xのアークタンジェント
  • link:/perl/perl_bind [bind]-アドレスをソケットにバインドします
  • link:/perl/perl_binmode [binmode]-I/O用のバイナリファイルを準備する
  • link:/perl/perl_bless [bless]-オブジェクトを作成します
  • link:/perl/perl_caller [caller]-現在のサブルーチン呼び出しのコンテキストを取得します
  • link:/perl/perl_chdir [chdir]-現在の作業ディレクトリを変更します
  • link:/perl/perl_chmod [chmod]-ファイルのリストの権限を変更します
  • link:/perl/perl_chomp [chomp]-文字列から末尾のレコード区切り文字を削除します
  • link:/perl/perl_chop [chop]-文字列から最後の文字を削除します
  • link:/perl/perl_chown [chown]-ファイルのリストの所有権を変更します
  • link:/perl/perl_chr [chr]-この数値が表す文字を取得します
  • link:/perl/perl_chroot [chroot]-ディレクトリをパス検索用の新しいルートにします
  • link:/perl/perl_close [close]-ファイル(またはパイプまたはソケット)ハンドルを閉じます
  • link:/perl/perl_closedir [closedir]-ディレクトリハンドルを閉じる
  • link:/perl/perl_connect [connect]-リモートソケットに接続します
  • link:/perl/perl_continue [continue]-whileまたはforeachのオプションの後続ブロック
  • link:/perl/perl_cos [cos]-コサイン関数
  • link:/perl/perl_crypt [crypt]-一方向のpasswdスタイルの暗号化
  • link:/perl/perl_dbmclose [dbmclose]-関連付けられたdbmファイルのバインディングを解除します
  • link:/perl/perl_dbmopen [dbmopen]-関連付けられたdbmファイルにバインディングを作成します
  • link:/perl/perl_defined [defined]-値、変数、または関数が定義されているかどうかをテストします
  • link:/perl/perl_delete [delete]-ハッシュから値を削除します
  • link:/perl/perl_die [die]-例外を発生させるか、救済する
  • link:/perl/perl_do [do]-BLOCKをTERMに変換します
  • link:/perl/perl_dump [dump]-即時コアダンプを作成します
  • link:/perl/perl_each [each]-ハッシュから次のキーと値のペアを取得します
  • link:/perl/perl_endgrent [endgrent]-グループファイルを使用して実行
  • link:/perl/perl_endhostent [endhostent]-ホストファイルを使用して実行
  • link:/perl/perl_endnetent [endnetent]-ネットワークファイルを使用して実行
  • link:/perl/perl_endprotoent [endprotoent]-プロトコルファイルを使用して実行
  • リンク:/perl/perl_endpwent [endpwent]-passwdファイルを使用して実行
  • link:/perl/perl_endservent [endservent]-サービスファイルを使用して実行
  • link:/perl/perl_eof [eof]-ファイルハンドルの終わりをテストします
  • link:/perl/perl_eval [eval]-例外をキャッチするか、コードをコンパイルして実行します
  • link:/perl/perl_exec [exec]-このプログラムを破棄して別のプログラムを実行します
  • link:/perl/perl_exists [exists]-ハッシュキーが存在するかどうかをテストします
  • link:/perl/perl_exit [exit]-このプログラムを終了します
  • link:/perl/perl_exp [exp]-Iを累乗します
  • link:/perl/perl_fcntl [fcntl]-ファイル制御システムコール
  • link:/perl/perl_fileno [fileno]-ファイルハンドルからファイル記述子を返します
  • link:/perl/perl_flock [flock]-勧告的ロックでファイル全体をロックします
  • link:/perl/perl_fork [fork]-このような新しいプロセスを作成します
  • link:/perl/perl_format [format]-write()関数で使用する画像フォーマットを宣言します
  • link:/perl/perl_formline [formline]-フォーマットに使用される内部関数
  • link:/perl/perl_getc [getc]-ファイルハンドルから次の文字を取得します
  • link:/perl/perl_getgrent [getgrent]-次のグループレコードを取得します
  • link:/perl/perl_getgrgid [getgrgid]-グループユーザーIDを指定してグループレコードを取得します
  • link:/perl/perl_getgrnam [getgrnam]-グループ名を指定してグループレコードを取得します
  • link:/perl/perl_gethostbyaddr [gethostbyaddr]-アドレスを指定してホストレコードを取得します
  • link:/perl/perl_gethostbyname [gethostbyname]-指定された名前のホストレコードを取得します
  • link:/perl/perl_gethostent [gethostent]-次のホストレコードを取得します
  • link:/perl/perl_getlogin [getlogin]-このttyにログインしたユーザーを返す
  • link:/perl/perl_getnetbyaddr [getnetbyaddr]-アドレスを指定してネットワークレコードを取得します
  • link:/perl/perl_getnetbyname [getnetbyname]-指定された名前のネットワークレコードを取得します
  • link:/perl/perl_getnetent [getnetent]-次のネットワークレコードを取得します
  • link:/perl/perl_getpeername [getpeername]-ソケット接続のもう一方の端を見つけます
  • link:/perl/perl_getpgrp [getpgrp]-プロセスグループを取得する
  • link:/perl/perl_getppid [getppid]-親プロセスIDを取得します
  • link:/perl/perl_getpriority [getpriority]-現在の適切な値を取得します
  • link:/perl/perl_getprotobyname [getprotobyname]-名前を指定してプロトコルレコードを取得します
  • link:/perl/perl_getprotobynumber [getprotobynumber]-プロトコルレコード数値プロトコルを取得します
  • link:/perl/perl_getprotoent [getprotoent]-次のプロトコルレコードを取得します
  • link:/perl/perl_getpwent [getpwent]-次のパスワードレコードを取得します
  • link:/perl/perl_getpwnam [getpwnam]-ユーザーのログイン名を指定してpasswdレコードを取得します
  • link:/perl/perl_getpwuid [getpwuid]-ユーザーIDを指定してpasswdレコードを取得します
  • link:/perl/perl_getservbyname [getservbyname]-名前を指定してサービスレコードを取得します
  • link:/perl/perl_getservbyport [getservbyport]-数値ポートを指定してサービスレコードを取得します
  • link:/perl/perl_getservent [getservent]-次のサービスレコードを取得します
  • link:/perl/perl_getsockname [getsockname]-指定されたソケットのsockaddrを取得します
  • link:/perl/perl_getsockopt [getsockopt]-指定されたソケットのソケットオプションを取得します
  • link:/perl/perl_glob [glob]-ワイルドカードを使用してファイル名を展開します
  • link:/perl/perl_gmtime [gmtime]-グリニッジ標準時形式を使用してUNIX時間をレコードまたは文字列に変換します。
  • link:/perl/perl_goto [goto]-スパゲッティコードを作成
  • link:/perl/perl_grep [grep]-リスト内の要素を検索します。与えられた基準に対して真になります。
  • link:/perl/perl_hex [hex]-文字列を16進数に変換します
  • link:/perl/perl_import [import]-モジュールの名前空間を独自のものにパッチします
  • link:/perl/perl_index [index]-文字列内の部分文字列を検索します
  • link:/perl/perl_int [int]-数値の整数部分を取得します
  • link:/perl/perl_ioctl [ioctl]-システム依存のデバイス制御システムコール
  • link:/perl/perl_join [join]-セパレータを使用してリストを文字列に結合します
  • link:/perl/perl_keys [keys]-ハッシュからインデックスのリストを取得します
  • link:/perl/perl_kill [kill]-プロセスまたはプロセスグループにシグナルを送信します
  • link:/perl/perl_last [last]-ブロックを途中で終了します
  • link:/perl/perl_lc [lc]-文字列の小文字バージョンを返す
  • link:/perl/perl_lcfirst [lcfirst]-次の文字だけを小文字にした文字列を返します
  • link:/perl/perl_length [length]-文字列のバイト数を返します
  • link:/perl/perl_link [link]-ファイルシステムにハードリンクを作成します
  • link:/perl/perl_listen [listen]-サーバーとしてソケットを登録します
  • link:/perl/perl_local [local]-グローバル変数の一時的な値を作成します(動的スコープ)
  • link:/perl/perl_localtime [localtime]-ローカル時間を使用してUNIX時間をレコードまたは文字列に変換します
  • link:/perl/perl_lock [lock]-変数、サブルーチン、またはメソッドのスレッドロックを取得します
  • link:/perl/perl_log [log]-数値の自然対数を取得します
  • link:/perl/perl_lstat [lstat]-シンボリックリンクのstat
  • link:/perl/perl_m [m]-文字列を正規表現パターンに一致させます
  • link:/perl/perl_map [map]-リストに変更を適用して、変更を含む新しいリストを取得します
  • link:/perl/perl_mkdir [mkdir]-ディレクトリを作成します
  • link:/perl/perl_msgctl [msgctl]-SysV IPCメッセージ制御操作
  • link:/perl/perl_msgget [msgget]-SysV IPCメッセージキューを取得します
  • link:/perl/perl_msgrcv [msgrcv]-メッセージキューからSysV IPCメッセージを受信します
  • link:/perl/perl_msgsnd [msgsnd]-SysV IPCメッセージをメッセージキューに送信します
  • link:/perl/perl_my [my]-ローカル変数を宣言して割り当てる(字句スコープ)
  • link:/perl/perl_next [next]-途中でブロックを繰り返す
  • link:/perl/perl_no [no]-一部のモジュールシンボルまたはセマンティクスをコンパイル時にインポート解除します
  • link:/perl/perl_oct [oct]-文字列を8進数に変換します
  • link:/perl/perl_open [open]-ファイル、パイプ、または記述子を開く
  • link:/perl/perl_opendir [opendir]-ディレクトリを開く
  • link:/perl/perl_ord [ord]-文字の数値表現を見つける
  • link:/perl/perl_our [our]-パッケージ変数を宣言して割り当てる(字句スコープ)
  • link:/perl/perl_pack [pack]-リストをバイナリ表現に変換します
  • link:/perl/perl_package [package]-個別のグローバル名前空間を宣言します
  • link:/perl/perl_pipe [pipe]-接続されたファイルハンドルのペアを開きます
  • link:/perl/perl_pop [pop]-配列から最後の要素を削除して返します
  • link:/perl/perl_pos [pos]-最後/次のm//g検索のオフセットを検索または設定します
  • link:/perl/perl_print [print]-ファイルハンドルにリストを出力します
  • link:/perl/perl_printf [printf]-フォーマットされたリストをファイルハンドルに出力します
  • link:/perl/perl_prototype [prototype]-サブルーチンのプロトタイプ(もしあれば)を取得します
  • link:/perl/perl_push [push]-1つ以上の要素を配列に追加します
  • link:/perl/perl_q [q]-文字列を一重引用符で囲みます
  • link:/perl/perl_qq [qq]-文字列を二重引用符で囲みます
  • link:/perl/perl_qr [qr]-コンパイルパターン
  • link:/perl/perl_quotemeta [quotemeta]-正規表現の魔法の文字を引用する
  • link:/perl/perl_qw [qw]-単語のリストを引用
  • link:/perl/perl_qx [qx]-文字列を引用符で囲みます
  • link:/perl/perl_rand [rand]-次の疑似乱数を取得します
  • link:/perl/perl_read [read]-ファイルハンドルからの固定長のバッファリングされた入力
  • link:/perl/perl_readdir [readdir]-ディレクトリハンドルからディレクトリを取得します
  • link:/perl/perl_readline [readline]-ファイルからレコードを取得します
  • link:/perl/perl_readlink [readlink]-シンボリックリンクが指している場所を特定する
  • link:/perl/perl_readpipe [readpipe]-システムコマンドを実行し、標準出力を収集します
  • link:/perl/perl_recv [recv]-ソケットを介してメッセージを受信します
  • link:/perl/perl_redo [redo]-このループの繰り返しをもう一度開始します
  • link:/perl/perl_ref [ref]-参照されているもののタイプを見つける
  • link:/perl/perl_rename [rename]-ファイル名を変更します
  • link:/perl/perl_require [require]-実行時にライブラリから外部関数をロードします
  • link:/perl/perl_reset [reset]-指定された名前のすべての変数をクリアします
  • link:/perl/perl_return [return]-早く関数から抜け出す
  • link:/perl/perl_reverse [reverse]-文字列またはリストを反転します
  • link:/perl/perl_rewinddir [rewinddir]-ディレクトリハンドルをリセットします
  • link:/perl/perl_rindex [rindex]-右から左への部分文字列検索
  • link:/perl/perl_rmdir [rmdir]-ディレクトリを削除します
  • link:/perl/perl_s [s]-パターンを文字列に置き換えます
  • link:/perl/perl_scalar [scalar]-スカラーコンテキストを強制します
  • link:/perl/perl_seek [seek]-ランダムアクセスI/Oのファイルポインターの位置を変更します
  • link:/perl/perl_seekdir [seekdir]-ディレクトリポインターの位置を変更します
  • link:/perl/perl_select [select]-デフォルトの出力をリセットするか、I/O多重化を行います
  • link:/perl/perl_semctl [semctl]-SysVセマフォ制御操作
  • link:/perl/perl_semget [semget]-SysVセマフォのセットを取得します
  • link:/perl/perl_semop [semop]-SysVセマフォ操作
  • link:/perl/perl_send [send]-ソケットを介してメッセージを送信します
  • link:/perl/perl_setgrent [setgrent]-使用するグループファイルを準備します
  • link:/perl/perl_sethostent [sethostent]-ホストファイルを使用するための準備
  • link:/perl/perl_setnetent [setnetent]-ネットワークファイルを使用するための準備
  • link:/perl/perl_setpgrp [setpgrp]-プロセスのプロセスグループを設定します
  • link:/perl/perl_setpriority [setpriority]-プロセスのnice値を設定します
  • link:/perl/perl_setprotoent [setprotoent]-使用するプロトコルファイルを準備します
  • link:/perl/perl_setpwent [setpwent]-使用するpasswdファイルを準備します
  • link:/perl/perl_setservent [setservent]-使用するサービスファイルを準備します
  • link:/perl/perl_setsockopt [setsockopt]-いくつかのソケットオプションを設定します
  • link:/perl/perl_shift [shift]-配列の最初の要素を削除し、それを返します
  • link:/perl/perl_shmctl [shmctl]-SysV共有メモリ操作
  • link:/perl/perl_shmget [shmget]-SysV共有メモリセグメント識別子を取得します
  • link:/perl/perl_shmread [shmread]-SysV共有メモリを読み取ります
  • link:/perl/perl_shmwrite [shmwrite]-SysV共有メモリに書き込みます
  • link:/perl/perl_shutdown [shutdown]-ソケット接続の半分だけを閉じます
  • link:/perl/perl_sin [sin]-数値のサインを返します
  • link:/perl/perl_sleep [sleep]-数秒間ブロックします
  • link:/perl/perl_socket [socket]-ソケットを作成します
  • link:/perl/perl_socketpair [socketpair]-ソケットのペアを作成します
  • link:/perl/perl_sort [sort]-値のリストをソートします
  • link:/perl/perl_splice [splice]-配列の任意の場所に要素を追加または削除します
  • link:/perl/perl_split [split]-正規表現区切り文字を使用して文字列を分割します
  • link:/perl/perl_sprintf [sprintf]-文字列にフォーマットされた出力
  • link:/perl/perl_sqrt [sqrt]-平方根関数
  • link:/perl/perl_srand [srand]-乱数ジェネレータをシードします
  • link:/perl/perl_stat [stat]-ファイルのステータス情報を取得します
  • link:/perl/perl_study [study]-検索を繰り返すために入力データを最適化します
  • link:/perl/perl_sub [sub]-おそらく匿名でサブルーチンを宣言します
  • link:/perl/perl_substr [substr]-攪拌の一部を取得または変更します
  • link:/perl/perl_symlink [symlink]-ファイルへのシンボリックリンクを作成します
  • link:/perl/perl_syscall [syscall]-任意のシステムコールを実行します
  • link:/perl/perl_sysopen [sysopen]-ファイル、パイプ、または記述子を開く
  • link:/perl/perl_sysread [sysread]-ファイルハンドルからの固定長のバッファリングされていない入力
  • link:/perl/perl_sysseek [sysseek]-sysreadおよびsyswriteで使用されるハンドルにI/Oポインターを配置します
  • link:/perl/perl_system [system]-別のプログラムを実行します
  • link:/perl/perl_syswrite [syswrite]-ファイルハンドルへの固定長のバッファリングされていない出力
  • link:/perl/perl_tell [tell]-ファイルハンドルの現在のシークポインターを取得します
  • link:/perl/perl_telldir [telldir]-ディレクトリハンドルの現在のシークポインタを取得します
  • link:/perl/perl_tie [tie]-変数をオブジェクトクラスにバインドします
  • link:/perl/perl_tied [tied]-結合された変数の基礎となるオブジェクトへの参照を取得します
  • link:/perl/perl_time [time]-1970年からの秒数を返します
  • link:/perl/perl_times [times]-自己プロセスと子プロセスの経過時間を返します
  • link:/perl/perl_tr [tr]-文字列を音訳する
  • link:/perl/perl_truncate [truncate]-ファイルを短くします
  • link:/perl/perl_uc [uc]-文字列の大文字バージョンを返します
  • link:/perl/perl_ucfirst [ucfirst]-次の文字だけを大文字にした文字列を返します
  • link:/perl/perl_umask [umask]-ファイル作成モードマスクを設定します
  • link:/perl/perl_undef [undef]-変数または関数の定義を削除します
  • link:/perl/perl_unlink [unlink]-ファイルへの1つのリンクを削除します
  • link:/perl/perl_unpack [unpack]-バイナリ構造を通常のperl変数に変換します
  • link:/perl/perl_unshift [unshift]-リストの先頭に要素を追加します
  • link:/perl/perl_untie [untie]-変数へのタイバインディングを解除します
  • link:/perl/perl_use [use]-コンパイル時にモジュールにロードします
  • link:/perl/perl_utime [utime]-ファイルの最終アクセスを設定し、時間を変更します
  • link:/perl/perl_values [values]-ハッシュの値のリストを返します
  • link:/perl/perl_vec [vec]-文字列の特定のビットをテストまたは設定します
  • link:/perl/perl_wait [wait]-子プロセスが終了するのを待ちます
  • link:/perl/perl_waitpid [waitpid]-特定の子プロセスが終了するのを待ちます
  • link:/perl/perl_wantarray [wantarray]-現在のサブルーチン呼び出しのvoid vsスカラーvsリストコンテキストを取得
  • link:/perl/perl_warn [warn]-デバッグ情報を出力します
  • link:/perl/perl_write [write]-画像レコードを印刷します
  • リンク:/perl/perl_-X [-X]-ファイルテスト(-r、-xなど)
  • link:/perl/perl_y [y]-文字列を音訳する

Perl-questions-answers