web-dev-qa-db-ja.com

Perlで文字列を配列に分割します

my $line = "file1.gz file2.gz file3.gz";
my @abc = split('', $line);
print "@abc\n";

期待される出力:

file1.gz
file2.gz
file3.gz

出力をfile1.gz in $abc[0]file2.gz in $abc[1]、およびfile3.gz in $abc[2]にしたいです。 $lineを分割するにはどうすればよいですか?

8
Rahul Reddy

空白で文字列を分割するのは非常に簡単です:

print $_, "\n" for split ' ', 'file1.gz file1.gz file3.gz';

これは実際にはsplitの特別な形式です(通常、この関数は文字列ではなくパターンを使用するため)。

別の特殊なケースとして、splitは、awkが省略されるか、単一スペース文字(' '"\x20"など)で構成されるリテラル文字列の場合、コマンドラインツールPATTERNのデフォルトの動作をエミュレートします。この場合、EXPRの先頭の空白はすべて、分割が発生する前に削除され、代わりにPATTERN/\s+/であるかのように扱われます。特に、これは(単一のスペース文字だけでなく)連続する空白が区切り文字として使用されることを意味します。


元の質問に対する答えを次に示します(空白を含まない単純な文字列を使用):

おそらく.gz拡張で分割したいでしょう:

my $line = "file1.gzfile1.gzfile3.gz";
my @abc = split /(?<=\.gz)/, $line;
print $_, "\n" for @abc;

ここでは(?<=...)コンストラクトを使用しました。これは look-behind assertion であり、基本的に.gzサブストリングが先行する行の各ポイントで分割します。

拡張機能の固定セットを使用する場合、すべてを含めるようにパターンを拡張できます。

my $line = "file1.gzfile2.txtfile2.gzfile3.xls";
my @exts = ('txt', 'xls', 'gz');
my $patt = join '|', map { '(?<=\.' . $_ . ')' } @exts;
my @abc = split /$patt/, $line;
print $_, "\n" for @abc;
15
raina77ow

$line現在は、少なくとも1つの空白区切り文字に基づいて文字列を単純に分割できます。

my @answer = split(' ', $line); # creates an @answer array

それから

print("@answer\n");               # print array on one line

または

print("$_\n") for (@answer);      # print each element on one line

() for splitprint、およびfor

10
Ring Ø