Perl5 split 函式的使用詳細講解

gaorongchao1990626發表於2013-12-30


文章來源與:http://perlmaven.com/perl-split 翻譯:揚眉劍(GRC)rongchaogao@gmail.com

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:          ];

注意這裡是用//來分割的。要和省略分割符號區別開,如果省略分割符號,預設用空格分割。

Date: 2013-12-30T19:27+0800

Author:

Org version 7.9.3f with Emacs version 24

Validate XHTML 1.0

相關文章