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
を分割するにはどうすればよいですか?
空白で文字列を分割するのは非常に簡単です:
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;
$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 split
、print
、およびfor
。