文章來源與:http://perlmaven.com/perl-split 翻譯:揚眉劍(GRC)rongchaogao@gmail.com
Table of Contents
1 一個簡單的例子
1: use Data::Dumper; 2: my $str = "ab cd ef gh ij"; 3: my @word = split/\s+/,$str; 4: print Dumper(\@word);
結果:
1: $VAR1 = [ 2: 'ab', 3: 'cd', 4: 'ef', 5: 'gh', 6: 'ij' 7: ]; 8:
2 限制分成幾分
1: use Data::Dumper; 2: my $str = "ab cd ef gh ij"; 3: my @word = split/\s+/,$str,2; 4: #新增一個引數2,這裡整個字串就被從前往後分成了兩部分 5: print Dumper(\@word); 6: =結果 7: $VAR1 = [ 8: 'ab', 9: 'cd ef gh ij' 10: ]; 11: =cut 12: use Data::Dumper; 13: my $str = "ab cd ef gh ij"; 14: my @word = split/\s+/,$str,3; 15: print Dumper(\@word); 16: =結果 17: $VAR1 = [ 18: 'ab', 19: 'cd', 20: 'ef gh ij' 21: ]; 22: =cut
3 通過split給標量賦值
- 方法一:
1: my $str = "ab cd ef gh ij"; 2: my ($first,$second,$third,$four,$five) = split/\s+/,$str; 3: print "first $first\nsecond $second\nthird $third\nfour $four\nfive $five\n"; 4: 5: =結果 6: first ab 7: second cd 8: third ef 9: four gh 10: five ij
- 方法二:
上面的程式可以達到我們的需求,但是,如果我們只需要其中的2個值。那麼上面的程式就很繁瑣了。 我們可以用下面改進的辦法;
1: my $str = "ab cd ef gh ij"; 2: my @word=split/\s+/,$str; 3: my $third=@word[2]; 4: my $five =@word[4]; 5: print "third $third\nfive $five\n"; 6: 7: =結果 8: third ef 9: five ij 10:
- 方法三:
上面的方法也成功的實現了我們的需求,但還是不夠簡潔,我們還可以通過下面的方法:
1: my $str = "ab cd ef gh ij"; 2: my ($third,$five)=(split/\s+/,$str)[2,4]; 3: print "third $third\nfive $five\n"; 4: =結果 5: third ef 6: five ij
4 用更復雜的正則分割
首先還是一個簡單的例子;
1: use Data::Dumper; 2: my $str="fname = Foolname = Baremail=foo@bar.com"; 3: my @array=split/=/,$str; 4: print Dumper(\@array); 5: 6: =結果 7: $VAR1 = [ 8: 'fname ', 9: ' Foolname ', 10: ' Baremail', 11: 'foo.com' 12: ];
上面的結果有什麼不妥的地方呢?我們發現分成的四部分中有空格的存在,而空格未必是我們想要的。 所以我們要對程式進行改進
1: use Data::Dumper; 2: my $str="fname = Foolname = Baremail=foo@bar.com"; 3: my @array=split/\s*=\s*/,$str; 4: print Dumper(\@array); 5: 6: =結果 7: $VAR1 = [ 8: 'fname', 9: 'Foolname', 10: 'Baremail', 11: 'foo.com' 12: ];
我們還可以這樣控制
1: use Data::Dumper; 2: my $str="fname = Foolname = Baremail=foo@bar.com"; 3: my @array=split/\s+=\s+/,$str; 4: print Dumper(\@array); 5: =結果 6: $VAR1 = [ 7: 'fname', 8: 'Foolname', 9: 'Baremail=foo.com' 10: ];
上面的字串$str有3個等號,我們最後的結果卻只分成了三分。因為我們在分割的時候, 要求必須=兩側有空格的才進行分割。所以最後的一個等號兩側沒有被分割。
5 按照多種字元分割
我們有這麼一個字串"fname=Foo&lname=Bar&email=foo@bar.com"我們既想用“=”分割,也想 用“&”分割。怎麼做到呢?
1: use Data::Dumper; 2: my $str = 'fname=Foo&lname=Bar&email=foo@bar.com'; 3: my @user = split /[=&]/, $str; 4: print Dumper (\@user); 5: =結果 6: $VAR1 = [ 7: 'fname', 8: 'Foo', 9: 'lname', 10: 'Bar', 11: 'email', 12: 'foo@bar.com' 13: ];
6 分割字元
也許我們有時候還會有這樣的要求“hello world”把這個字串按照字元來分割,分割成"h""e""l" 等等。
1: use Data::Dumper; 2: my $str = "Hello World"; 3: my @chars = split //, $str; 4: print Dumper(\@chars); 5: 6: =結果 7: $VAR1 = [ 8: 'H', 9: 'e', 10: 'l', 11: 'l', 12: 'o', 13: ' ', 14: 'W', 15: 'o', 16: 'r', 17: 'l', 18: 'd' 19: ];
注意這裡是用//來分割的。要和省略分割符號區別開,如果省略分割符號,預設用空格分割。