Perl分片技術

2021-09-08 22:59:22 字數 2717 閱讀 2535

在perl中,如果想要取得一部分變數、一部分列表內容、一部分hash內容,可以採用分片(切片)的方式。

注意,perl並未提供字串的切片方式,但可以使用內建函式substr()來實現一樣的功能。

例如,有些語言(如golang)支援空變數賦值(如golang),以便丟棄那些不準備使用的變數,perl也支援,只需在不想使用的位置上設定undef即可。

例如,下面的變數列表中,就丟棄了php和ruby對應的賦值操作。

@arr=qw(python perl shell php ruby);

($py,$perl,$shell,undef,undef) = @arr;

perl中有些函式(比如stat和localtime)在列表上下文會返回很多個字段值列表,這時空變數賦值的方式就排上用場了:

($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime();
但是這樣的賦值方式還是麻煩,弄錯了undef的位置和數量,就會出錯,而且有些時候只是想取得值即刻使用,而不想將其賦值給變數儲存起來再通過變數來引用。於是,切片就排上用場了。

先看列表切片:

qw(aaa bbb ccc ddd)[1,2];
這表示將列表(aaa bbb ccc ddd)進行切片,取出其中索引位為1和2的元素,由於索引位從0開始計算,所以表示取出(bbb ccc)。

例如,下面的例子中多次取了索引位1和2的元素,且索引位完全亂序的,但這些行為都是允許的。

qw(aaa bbb ccc ddd perl shell python)[1,-1,3,2,0,1,2];
由於索引位是列表,所以使用範圍序列的方式也是允許的:

qw(aaa bbb ccc ddd perl shell python)[1..3]; # 等價於 [1,2,3]
再看陣列切片。所謂陣列切片,實際上是將陣列轉換為列表(陣列底層就是列表),再通過列表的有序性來切片。例如:

@arr = qw(aaa bbb ccc ddd);

($a,$b) = @arr[1,3];

print $a,$b;

多數時候,陣列切片和列表切片是等價的,但是有兩點不同:

陣列切片可以放在雙引號中被解析,從而進行陣列的切片替換,而列表切片則不能解析

可以將一系列值賦值給陣列切片(也就是切片表示式在等號左邊),從而實現修改陣列元素的目的

第一點,示例如下:

@arr=qw(perl python shell php);

print "@arr[1,2,3]\n"; # 成功切片

print qw(aaa bbb ccc ddd)[1,2],"\n"; # 成功切片

print "qw(aaa bbb ccc ddd)[1,2]\n"; # 不會切片,而是直接當字串輸出

第二點,示例如下:

@arr=qw(perl python shell php);

@arr[1,2]=qq(cpython csh); # 將陣列的元素python改為cpython,shell改為csh

print "new arr: @arr\n";

範圍切片時使用m..n的方式,如果想要切到倒數第2個元素呢?指定n為-2嗎?這肯定是錯的。所以如果想切到倒數第某個元素,可以使用($#arr-n+1)的方式來表示倒數第n個,例如5個元素的陣列,$#arr為4,倒數第1個為$#arr - 0,倒數第二個為$#arr - 1。示例:

@arr=qw(perl python shell php);

print @arr[0..($#arr - 2)];

hash切片和陣列切片行為上類似,但寫法上可能有些令人疑惑。例如:

%phone_num=(longshuai =>"18012345678",

xiaofang =>"17012345678",

tun_er =>"16012345678",

fairy =>"15012345678");

($a,$b,$c)=@phone_num;

print $a,"\n",$b,"\n",$b,"\n";

幾個需要說明的地方:

以下三種hash鍵形式都是允許的:

@phone_num;

@phone_num;

@phone_num;

和陣列切片可以賦值一樣,也可以為hash的切片元素賦值,從而實現修改對應鍵值對的值。

%phone_num=(longshuai =>"18012345678",

xiaofang =>"17012345678",

tun_er =>"16012345678",

fairy =>"15012345678");

@number=qw(18087654321 17087654321);

@phone_num = (@number);

print "@phone_num","\n";

MongoDB分片技術

在mongodb裡面存在另一種集群,就是分片技術,跟sql server的表分割槽類似,我們知道當資料量達到t級別的時候,我們的磁碟,記憶體 就吃不消了,針對這樣的場景我們該如何應對。一 分片 mongodb採用將集合進行拆分,然後將拆分的資料均攤到幾個片上的一種解決方案。下面我對這張 釋一下 人臉...

mongodb分片技術

在mongodb裡面存在另一種集群,就是分片技術,跟sql server的表分割槽類似,我們知道當資料量達到t級別的時候,我們的磁碟,記憶體 就吃不消了,針對這樣的場景我們該如何應對。一 分片 mongodb採用將集合進行拆分,然後將拆分的資料均攤到幾個片上的一種解決方案。下面我對這張 釋一下 人臉...

MongoDB分片技術

在mongodb中存在另外一種集群,就是分片技術,當數量級達到tb的時候,磁碟和記憶體就會吃不消,這個時候就要用到mongodb的分片技術了。mongodb分片技術 將集合進行拆分,然後將集合均攤到幾個分片上面。概念解釋 mongos 首先我們要了解 片鍵 的概念,也就是說拆分集合的依據是什麼?按照...