您好,登錄后才能下訂單哦!
今天跟網友扯淡,網友給了兩行代碼,可以輸出以下的效果
1..9 | %{$a=@()} {$a+=$("{0}{1}{0}" -f (" " * (9-$_)),("$_" * (2*$_-1)))}{$a[0..8+7..0]} 1..9 | %{$a=""}{for ($i=1;$i -le $_;$i++){$a+="{0,-7}" -f " $i X $_=$($i*$_)"};$a+="`r`n"}{$a}
第一眼看上去,老實承認真沒看懂這兩行怎么工作的,仔細學習了一會,終于明白了邏輯關系。
這兩行代碼主要利用的是PowerShell 里面利用-F的格式操作符。
參考資料如下
http://ss64.com/ps/syntax-f-operator.html
這個操作符主要有2個表達形式:
表達形式1
"String with placeholders" -f "Array of values to place into the placeholders"
比如說
Get-ChildItem c:\temp | ForEach-Object {'Filename: {0} Created: {1}' -f $_.fullname,$_.creationtime}
可以看見Filename的名字分配給了 fullname這個屬性;而Created分配給了creationtime這個屬性
表達形式2, I表示位置,A表示空格位置,負數表示右邊加空格,正數表示左邊加空格,FS是一些格式選項,比如HEX進制,百分比等等。
"{I,A:FS} {I,A:FS} {I,A:FS}.." -f "string0", "string1", "string2"...
上面提到的兩個例子主要就是利用了第二種表達方式。現在來仔細看看。
1..9 | %{$a=@()} {$a+=$("{0}{1}{0}" -f (" " * (9-$_)),("$_" * (2*$_-1)))}{$a[0..8+7..0]}
金字塔的基本原理都知道,算好每一行的空格和數字數量,然后寫循環就行。
首先 1到9 通過管道傳入,然后對于每一個數字,他創建了一個數組,{0}{1}{0} 對應后面提供的兩個字符串,剛好滿足“空格”+"數字"+"空格“這個格式。{0}對應的就是(" " *(9-$_)),{1}對應的就是("$_"*(2*$_-1))
累加起來,$a剛好就是金字塔的上半部分。最后通過$a[0..8]輸出上半截,$a[7..0]輸出下半截~
1..9 | %{$a=""}{for ($i=1;$i -le $_;$i++){$a+="{0,-7}" -f " $i X $_=$($i*$_)"};$a+="`r`n"}{$a}
這個例子的思路也很相似。管道傳入每一個數字,分別列出來,{0,-7}表示的就是在當前輸出字符串右邊加7個空格而已;注意這個例子里面他初始化創建的$a是一個空字符串,因此加進去的時候每一個元素他不會像數組一樣自動換行,作者在每次循環結束加了個回車換行符。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。