2013-06-01 9 views
6
の配列に文字列
my $line = "file1.gz file2.gz file3.gz"; 
my @abc = split('',$line); 
print "@abc\n"; 

予想される出力:スプリットPerlの

file1.gz 
file2.gz 
file3.gz 

私は出力が$abc[0]file1.gzになりたい、file2.gz in $ abcの[1] , and file3.gz in $ abcの[2] ` 。どのように分割するのですか?空白文字で文字列を分割

+1

まあ、何のプログラミング言語は、あなたの心を読むことができません 'スプリット「」'個々の文字に分割し、すべてのファイル名が 'Fで始まる場合。 ile ... '、' split /(?= file)/ 'は動作しますが、一般的な解決策はありません – amon

+2

@aragaerあなたのコメントは事実上間違っています。 ['split'](http://perldoc.perl.org/functions/split.html)は、引数をpattern、string、limitとして取ります。あなたの注文は間違っています。そして 'print" @abc \ n "'は '$" eq "\ n" '(' $ "'は通常はスペースです)であれば問題ありません。 – amon

答えて

13

は非常に簡単である:

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

これは実際splitの特別な形態である(この機能は、通常の代わりに、文字列のパターンをとるように)別の特別な場合として

を、splitは、PATTERNが省略された場合、または 文字列が1つの空白文字で構成されている場合、 コマンドラインツールawkのデフォルト動作をエミュレートします(例えば、' 'または"\x20")。この場合、EXPRの先頭の空白は、分割が発生する前に削除された であり、/\s+/の場合は、PATTERNが として処理されます。特に、これは、隣接するすべての空白(単一の空白文字だけではない)がセパレータとして使用されることを意味します。私は(?<=...)を使用ここで

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

おそらく、あなたは.gz延長線上に分割したい:ここ


は、(空白のない単純な文字列で)元の質問のための答えです構成は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; 
+0

質問にスペースが含まれるように変更されました – jamylak

+0

何が?<=上記のコード –

+0

@ user2384801説明とリンクが追加されました。 – raina77ow

9

$lineを持ちますセパレータ

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 

私はsplitprintforため()を使用して好みます。

+1

デフォルトの '''分割は、おそらく'/\ s +/'ではなくあなたが望むものであることを知っておくべきです。分割前の空白を引き継ぐデフォルトのストリップを除いて、まったく同じです。 – TLP

+1

@TLPありがとうございます - 常に '/ \ s + /'を使って、デフォルトの ''''を無視しています。しかし、私はまだ '/ \ s + /'が分かりやすいと思っています。しかし、 '' ''は覚えやすいですし、まさに何が欲しいのですか(通常、誰も最初の要素)、正規表現の高価な使用なしでそれを行うために確かに最適化されています。回答が更新されました。 –

+0

ようこそ。 – TLP

0

「\\ s + /」をスプリッターとして使用するだけです。この場合、すべての「余分な」ブランクは削除されました。通常、この特定の動作が必要です。したがって、あなたの場合、それは次のようになります:

my $line = "file1.gz file1.gz file3.gz"; 
my @abc = split(/\s+/, $line); 

for my $i in (@abc) { 
    print "$i\n"; 
} 
0

これは非常に簡単だとわかりました!

my $line = "file1.gz file2.gz file3.gz"; 

my @abc = ($line =~ /(\w+[.]\w+)/g); 

print $abc[0],"\n"; 
print $abc[1],"\n"; 
print $abc[2],"\n"; 

出力:

file1.gz 
file2.gz 
file3.gz 

ここではPerl regular expressionに詳細を見つけると詳しいマッチングセクションにスクロールし、このチュートリアルを見てみましょう。

0

こんにちはRahul Reddy

私が何かを追加するために役立つかもしれないここに別のマイナーなものを追加したいと思いますけれどもあなたはすでに、あなたの質問に複数の回答を持っています。

はあなたが sayを使用することができ、文字列を印刷することも Data::Dumperを使用することができPerlで複雑なデータ構造を表示するには、代わりにそれを手動で行うためのすべての文字列の後に改行文字( \n)を追加します。

私は通常の( \s)あなたは( +)を追加した場合、それは一つ以上の空白( \s+)と一致しています。あなたがここにそれについて perlreを詳細を読むことができ、(1)空白文字と一致している。

サンプルを使用

コード:。このことができます

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 
use feature 'say'; 

my $line = "file1.gz file2.gz file3.gz"; 
my @abc = split /\s+/, $line; 
print Dumper \@abc; 
say for (@abc); 

希望、BR