主頁 > 軟體工程 > @在回圈陣列中的用途?

@在回圈陣列中的用途?

2021-10-15 13:26:19 軟體工程

我目前正在學習 PowerShell,從基礎開始,我已經開始學習陣列。更具體地說,回圈陣列。我注意到在單獨宣告一個陣列時,它只是簡單地寫成

$myarray = 1, 2, 3, 4, 5

然而,當宣告一個陣列是為了回圈它時,它被寫成

$myarray = @(1, 2, 3, 4, 5)

出于好奇,我嘗試運行代碼以在帶和不帶 @ 符號的情況下回圈遍歷陣列,只是為了看看它是否可以作業,并且它以完全相同的方式顯示在我為兩者創建的字串中。

我的問題是@符號的目的是什么?我嘗試查找它,但找不到任何結果。

uj5u.com熱心網友回復:

你要找的檔案上的操作員不僅包括了@,但()太-他們一起做了@(),也被稱為陣列子運算式運算子

它確保您包裝在其中的任何管道或運算式的輸出都是陣列

要理解為什么這很有用,我們需要了解 PowerShell 傾向于扁平化陣列!讓我們用一個簡單的測驗函式來探索這個概念:

function Test-PowerShellArray {
  param(
    $Count = 2
  )

  while($count--){
    Get-Random
  }
}

這個函式將輸出一些亂數 -$Count確切地說是數字:

PS ~> Test-PowerShellArray -Count 5
652133605
1739917433
1209198865
367214514
1018847444

讓我們看看當我們要求 5 個數字時我們得到什么型別的輸出:

PS ~> $numbers = Test-PowerShellArray -Count 5
PS ~> $numbers.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

好的,所以我們存盤的結果輸出$numbers是型別[Object[]]- 這意味著我們有一個 適合型別物件陣列Object(.NET 型別系統中的任何型別最終都繼承自Object,所以它實際上只是意味著我們有一個陣列“東西”,它可以包含任何東西)。

我們可以用不同的計數再試一次,得到相同的結果:

PS ~> $numbers = Test-PowerShellArray -Count 100
PS ~> $numbers.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

到目前為止一切順利 - 我們從一個函式中收集了多個輸出值并最終得到一個陣列,一切都如預期的那樣。

但是當我們只從函式中輸出 1 個數字時會發生什么:

PS ~> $numbers = Test-PowerShellArray -Count 1
PS ~> $numbers.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

說什么?現在我們得到System.Int32- 這是單個整數值的型別 - PowerShell 注意到我們只收到 1 個輸出值,然后“只有 1?我不會把它包裝在一個陣列中,你可以按原樣”

正是出于這個原因,您可能想要包裝您打算回圈的輸出(或以其他方式使用,要求它是一個陣列):

PS ~> $numbers = Test-PowerShellArray -Count 1
PS ~> $numbers.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

PS ~> $numbers = @(Test-PowerShellArray -Count 1) # @(...) saves the day
PS ~> $numbers.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

uj5u.com熱心網友回復:

這是宣告靜態陣列的另一種語法,但有一些關鍵細節可以理解它們之間的語法差異。

@()陣列子運算式 operator這與組運算式運算子 ()子運算式運算子的 作業方式類似,$()但強制回傳的任何內容都為陣列,即使僅回傳 0 或 1 個元素。這可以在需要陣列或集合型別的任何地方行內使用。有關這些運算子的更多資訊,請閱讀PowerShell 檔案中的特殊運算子

1, 2, 3, 4是串列運算式語法,可以在需要陣列的任何地方使用。它在功能上@(1, 2, 3, 4)與陣列子運算式運算子等效,但在行為上有所不同。

@( Invoke-SomeCmdletOrExpression ) 將強制回傳的值是一個陣列,即使運算式只回傳 0 或 1 個元素。

# Array sub-expression
$myArray = @( Get-Process msedge )

請注意,這不必是單個 cmdlet 呼叫,它可以是任何運算式,利用您認為合適的管道。例如:

# We have an array of fruit
$fruit = 'apple', 'banana', 'apricot', 'cherry', 'a tomato ;)'

# Fruit starting with A
$fruitStartingWithA = @( $fruit | Where-Object { $_ -match '^a' } )

$fruitStartingWithA 應該回傳以下內容:

apple
apricot
a tomato ;)

還有另一種強制陣列型別的方法,我看到它經常在 Stack Overflow 上被提及為一個很酷的技巧(確實如此),但關于其行為的背景關系卻很少。

您可以使用 list-expression 語法的一個怪癖來強制陣列型別,但是這與使用陣列子運算式運算子之間有兩個主要區別。用逗號前綴運算式或變數,將強制回傳一個陣列,但兩者之間的行為會發生變化。考慮以下示例:

# Essentially the same as @( $someVar )
$myArray1 = , $someVar

# This behaves differently, read below
$myArray2 = , ( Invoke-SomeCmdletOrExpression )

@()或者在變數前面加上,will flatten (這里經常使用的另一個詞是unroll)將結果元素放入單個陣列中。但是對于運算式,如果您使用逗號前綴技巧,則必須使用 group-expression 運算子。由于分組運算式的解釋方式,您最終將得到一個由一個元素組成的陣列。

在這種情況下,它不會展平任何結果元素

考慮Get-Process上面例子。如果您msedge正在運行三個行程,$myArray.Count將顯示計數為 3,您可以使用 array-index 訪問器訪問各個行程$myArray[$i]但是,如果您$myArray2在上面的第二個串列運算式示例中執行相同操作$myArray2.Count將回傳計數 1。這實際上現在是一個具有單個元素的多維陣列。要獲取單個行程,您現在需要$myArray2[0].Count獲取行程計數,并使用陣列索引訪問器兩次來獲取單個行程:

$myArray2 = , ( Get-Process msedge )

$myArray2.Count # ======> 1

# I have 32 Edge processes right now
$myArray2[0].Count # ===> 32

# Get only the first msedge process
$myArray[0][0] # =======> Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
               # =======> -------  ------    -----      -----     ------     --  -- -----------
               # =======>     430      19   101216     138968      74.52   3500   1 msedge

起初這可能不清楚,因為列印$myArray2到輸出流將顯示與$myArray第一個示例和$myArray1第二個示例相同的輸出結果

In short, you want to avoid using the comma-prefix trick when you want to use an expression, and instead use the array sub-expression @() operator as this is what it is intended for.

Note: There will be times when you want to define a static array of arrays but you will be using list-expression syntax anyways, so the comma-prefix becomes redundant. The only counterpoint here is if you want to create an array with an array in the first element to add more arrays to it later, but you should be using a generic List[T] or an ArrayList instead of relying on one of the concatenation operators to expand an existing array ( or = are almost always bad ideas on non-numeric types).


Here is some more information about arrays in PowerShell, as well as the Arrays specification for PowerShell itself.

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315520.html

標籤:数组 电源外壳 循环

上一篇:C 反轉字串但先列印數字

下一篇:如何迭代兩列或更多列并在Pandas中執行分析?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more