Split は、指定されたパターンに従って文字列を分割します。タブ、コロン、空白、または任意の記号を使用して異なるフィールドを区切る文字列の場合、この演算子を使用してフィールドを分解および抽出すると非常に便利です。区切り文字をパターン (通常は非常に単純な正規表現) として記述できる限り、Split を使用してデータを分割できます。その使用法は次のとおりです。
私の @fields = 分割 /separator/, $string;
ここでの Split 演算子は、分割モードを使用して指定された文字列をスキャンし、フィールドのリスト (つまり、部分文字列) を返します。この期間中、パターンがどこかで一致する限り、その場所が現在のフィールドの終わりであり、次のフィールドの始まりになります。したがって、パターンに一致するものは戻りフィールドに表示されません。以下は、コロンを区切り文字として使用した典型的な分割パターンです:
私の @fields = split /:/, "abc:def:g:h"; #Get ("abc", "def", "g", "h")
2 つの区切り文字が結合されている場合、空のフィールドが生成されます:
私の @fields = split /:/, "abc:def::g:h"; #Get ("abc", "def", "", "g", "h")
最初は奇妙に思えるかもしれませんが、めったに問題が発生することはありません。Split は最初に空のフィールドを保持しますが、最後の空のフィールドを破棄します。例:
私の @fields = split /:/, ":::a:b:c:::"; #Get ("", "", "", "a", "b", "c")
Split の /s+/ モードを使用して空白に基づいて文字を区切ることも一般的です。このモードは、連続するすべてのスペースを 1 つのスペースとして扱い、それに応じてデータを分割します:
私の $some_input = “これは t 検定です。n”;
私の @args = split /s+/, $some_input; #Get ("This", "is", "a", "test.")
デフォルトでは、Split は $_ 内の文字列を空白文字で区切ります。
my @fields = spat; #split /s+/,$_; と同等
これは、先頭の空のフィールドを省略する点を除けば、パターンとして /s+/ を使用するのとほぼ同じです。したがって、行が空白で始まっている場合でも、返されるリストの先頭に空のフィールドは表示されません。この方法でスペースで区切られた文字列を分割したい場合は、パターンとしてスペースを使用できます。
一般的に言えば、Split で使用されるパターンは前に見たのと同じくらい単純です。ただし、より複雑なパターンを使用する場合は、パターン内で括弧をキャプチャすることは避けてください。これにより、いわゆる「区切り文字保持モード」が有効になります (パターン内でグループ マッチングを使用する必要がある場合は、Perlfunc のドキュメントを参照してください)。事故を避けるために、分割では捕捉されない括弧 (?:) を使用してください
。
フィールドの分割分解と抽出によってもたらされる利便性をさらに深めます。これは、実際の作業でフィールドを分解および抽出するために Split オペレーターを使用しなかったコードの一部です (Split オペレーターを使用するコードは後で説明します)。その威力を比較して感じます。
タスク: passwd ファイルからユーザー名とユーザーのホーム ディレクトリ情報を抽出します。
まず passwd ファイル内のレコード形式を見てみましょう (図 1-1 一部抜粋):
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
……
各フィールドがコロン (:) で区切られていることがわかります。例として最初のレコードを左から右に考えると、最初のコロンの前に root (ユーザー名) を抽出し、6 番目のコロンの前に /root を抽出する必要があります。 . (ユーザーのホームディレクトリ)。
[php]
#Code 1.1 Split 演算子はフィールド コードの抽出には使用されません。
#!/usr/bin/perl -w
厳密に使用します。
open (FH, '/etc/passwd') or die "ファイルを開けません: $!";
ながら (
){
私の ($Pos,$endPos,$length,$Name,$Dir);
##############
# ユーザー名を取得する
##############
$length = インデックス ($_, ":");
$Name = substr ($_, 0, $length);
#####################
# ユーザーの HOME ディレクトリの場所を取得します
#####################
$endPos = rindex ($_, ":");
# $endPos-1 現在の位置(コロン)をスキップします
$Pos = rindex ($_, ":", $endPos - 1);
# $Pos+1 現在の位置 (コロン) をスキップします
#検索方向は左から右です。 +1
$Pos += 1;
$length = $endPos - $Pos;
$Dir = substr ($_, $Pos, $length);
「$Namet$Dirn」を印刷します
}
閉じる (FH);
プログラム実行後の出力は次のとおりです (図 1-2)。
ルート/ルート
ビン/ビン
……
次に、このコードのアルゴリズムを分析してみましょう。ユーザー名の抽出は非常に簡単です。最初のコロンの位置を見つけるだけで済み、substr($_,0,$length) 関数によって返される部分文字列が必要なユーザー名になります。アルゴリズムのより複雑な部分は、ユーザーのホーム ディレクトリを抽出することです。図 1-1 から、最後から 2 番目のコロンの後の /root が後ろから前に (右から) 記録される固定形式であることがわかります。ディレクトリ情報。
ユーザーのホームディレクトリを抽出するためのアルゴリズムのアイデア:
1. レコードの最後のフィールドをスキップします。
2. 最後から 2 番目のフィールドの開始位置を見つけます。
3. 最後から 2 番目のフィールドの開始位置 (/ 記号) から、最後から 2 番目のフィールドの開始位置 (コロン) を減算します。その結果が、ユーザーのホーム ディレクトリ フィールドの文字長になります。
4. substr($_,$Pos,$length); はユーザーのホームディレクトリ情報を返します。
5.完了。
(図 1-3 ユーザーディレクトリ抽出アルゴリズム)
要約すると、私たちのタスクは、Perl 文字列処理関数を通じてフィールド情報を見つけて抽出することで完了できます。接続されていない複数のフィールドを抽出する場合、手順がより複雑になり、コードが長くなることが予想されます。エラーが発生しやすくなる場合は、各フィールドの位置の変更を記録すると、アルゴリズムを再設計する必要があります。
次に、Split オペレーターを使用して抽出されたフィールドを分解する例を見てみましょう:
[php]
#Code 1.2 Split 演算子を使用してフィールド コードを抽出します。
#!/usr/bin/perl -w
厳密に使用します。
open (FH, '/etc/passwd') or die "ファイルを開けません: $!";
ながら (
){
###########
# ユーザー情報を取得する
###########
my($Name,$Dir) = (分割 /:/,$_)[0,5];
「$Namet$Dirn」を印刷します
}
閉じる (FH);
。
http://www.bkjia.com/PHPjc/477706.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/477706.html
技術記事
分割 指定されたパターンに従って文字列を分割します。タブ、コロン、空白、または任意の記号を使用して異なるフィールドを区切る文字列の場合、この演算子を使用して抽出されたフィールドを分解します...