powershell - পাওয়ারশেলে টেরানারি অপারেটর




ternary-operator conditional-operator (8)

আমি যা জানি, পাওয়ারশেলের তথাকথিত টের্নারি অপারেটরের জন্য অন্তর্নির্মিত প্রকাশ নেই বলে মনে হয়।

উদাহরণস্বরূপ, সি ভাষায়, যা টের্নারি অপারেটরকে সমর্থন করে আমি এই জাতীয় কিছু লিখতে পারি:

<condition> ? <condition-is-true> : <condition-is-false>;

যদি পাওয়ারশেলের মধ্যে এটি সত্যিই বিদ্যমান না থাকে, তবে একই ফলাফলটি সম্পাদন করার সবচেয়ে ভাল উপায় (অর্থাত্ সহজেই পড়তে এবং বজায় রাখা সহজ) হবে?


আমি সম্প্রতি পাওয়ার-শেল লাইব 'পিএসসিএক্স' এর ত্রৈমাসিকীয় শর্তসাপেক্ষ এবং নাল-কোলেসিং অপারেটরগুলিকে (ওপেন পুলরকেস্ট) উন্নত করেছি
আমার সমাধানটির জন্য দয়া করে একটি চেহারা দেখুন।


আমার UtilityModule_Invoke-Operators টপিক শাখা: UtilityModule_Invoke-Operators

কার্যাবলী:

Invoke-Ternary
Invoke-TernaryAsPipe
Invoke-NullCoalescing
NullCoalescingAsPipe

ওরফে

Set-Alias :?:   Pscx\Invoke-Ternary                     -Description "PSCX alias"
Set-Alias ?:    Pscx\Invoke-TernaryAsPipe               -Description "PSCX alias"
Set-Alias :??   Pscx\Invoke-NullCoalescing              -Description "PSCX alias"
Set-Alias ??    Pscx\Invoke-NullCoalescingAsPipe        -Description "PSCX alias"

ব্যবহার

<condition_expression> |?: <true_expression> <false_expression>

<variable_expression> |?? <alternate_expression>

প্রকাশ হিসাবে আপনি এই পাস করতে পারেন:
ull নাল, একটি আক্ষরিক, একটি পরিবর্তনশীল, একটি 'বাহ্যিক' প্রকাশ ((বি-বেক 4) বা স্ক্রিপ্টব্লক block $ বি -q 4 4

চলক অভিব্যক্তিতে কোনও চলক ull নাল বা বিদ্যমান না থাকলে বিকল্প এক্সপ্রেশনটি আউটপুট হিসাবে মূল্যায়ন করা হয়।


আমিও, আরও উত্তরের জন্য সন্ধান করেছি এবং এডওয়ার্ডের পোস্টে সমাধানটি "ঠিক" থাকাকালীন আমি এই ব্লগ পোস্টে আরও অনেক প্রাকৃতিক সমাধান নিয়ে এসেছি

স্বল্প ও মধুর:

# ---------------------------------------------------------------------------
# Name:   Invoke-Assignment
# Alias:  =
# Author: Garrett Serack (@FearTheCowboy)
# Desc:   Enables expressions like the C# operators: 
#         Ternary: 
#             <condition> ? <trueresult> : <falseresult> 
#             e.g. 
#                status = (age > 50) ? "old" : "young";
#         Null-Coalescing 
#             <value> ?? <value-if-value-is-null>
#             e.g.
#                name = GetName() ?? "No Name";
#             
# Ternary Usage:  
#         $status == ($age > 50) ? "old" : "young"
#
# Null Coalescing Usage:
#         $name = (get-name) ? "No Name" 
# ---------------------------------------------------------------------------

# returns the evaluated value of the parameter passed in, 
# executing it, if it is a scriptblock   
function eval($item) {
    if( $item -ne $null ) {
        if( $item -is "ScriptBlock" ) {
            return & $item
        }
        return $item
    }
    return $null
}

# an extended assignment function; implements logic for Ternarys and Null-Coalescing expressions
function Invoke-Assignment {
    if( $args ) {
        # ternary
        if ($p = [array]::IndexOf($args,'?' )+1) {
            if (eval($args[0])) {
                return eval($args[$p])
            } 
            return eval($args[([array]::IndexOf($args,':',$p))+1]) 
        }

        # null-coalescing
        if ($p = ([array]::IndexOf($args,'??',$p)+1)) {
            if ($result = eval($args[0])) {
                return $result
            } 
            return eval($args[$p])
        } 

        # neither ternary or null-coalescing, just a value  
        return eval($args[0])
    }
    return $null
}

# alias the function to the equals sign (which doesn't impede the normal use of = )
set-alias = Invoke-Assignment -Option AllScope -Description "FearTheCowboy's Invoke-Assignment."

যা স্টাফের মতো কাজ করা সহজ করে (ব্লগ পোস্টে আরও উদাহরণ):

$message == ($age > 50) ? "Old Man" :"Young Dude" 

এখানে একটি বিকল্প কাস্টম ফাংশন পদ্ধতির:

function Test-TernaryOperatorCondition {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true, Mandatory = $true)]
        [bool]$ConditionResult
        ,
        [Parameter(Mandatory = $true, Position = 0)]
        [PSObject]$ValueIfTrue
        ,
        [Parameter(Mandatory = $true, Position = 1)]
        [ValidateSet(':')]
        [char]$Colon
        ,
        [Parameter(Mandatory = $true, Position = 2)]
        [PSObject]$ValueIfFalse
    )
    process {
        if ($ConditionResult) {
            $ValueIfTrue
        }
        else {
            $ValueIfFalse
        }
    }
}
set-alias -Name '???' -Value 'Test-TernaryOperatorCondition'

উদাহরণ

1 -eq 1 |??? 'match' : 'nomatch'
1 -eq 2 |??? 'match' : 'nomatch'

পার্থক্য ব্যাখ্যা

  • কেন এটি 1 এর পরিবর্তে 3 প্রশ্ন চিহ্ন?
    • ? চরিত্রটি ইতিমধ্যে হু Where-Object জন্য একটি উপনাম।
    • ?? নাল কোলেসেসিং অপারেটর হিসাবে অন্যান্য ভাষায় ব্যবহৃত হয় এবং আমি বিভ্রান্তি এড়াতে চেয়েছিলাম।
  • কমান্ডের আগে আমাদের পাইপের কী দরকার?
    • যেহেতু আমি পাইপলাইনটি এটির মূল্যায়নের জন্য ব্যবহার করছি তাই আমাদের ফাংশনটিতে শর্তটি পাইপ করার জন্য আমাদের এখনও এই চরিত্রটি প্রয়োজন
  • আমি যদি একটি অ্যারে পাস করি তবে কী হবে?
    • আমরা প্রতিটি মানের জন্য একটি ফলাফল পেতে; অর্থাৎ -2..2 |??? 'match' : 'nomatch' -2..2 |??? 'match' : 'nomatch' দেয়: match, match, nomatch, match, match (অর্থাত্ যেহেতু কোনও শূন্য শূন্যটি true মূল্যায়ন করে; শূন্যটি false মূল্যায়ন করে)।
    • যদি আপনি এটি না চান তবে অ্যারেটিকে একটি বিলে রূপান্তর করুন; ([bool](-2..2)) |??? 'match' : 'nomatch' ([bool](-2..2)) |??? 'match' : 'nomatch' (বা সহজভাবে: [bool](-2..2) |??? 'match' : 'nomatch'

নিকটতম পাওয়ারশেল নির্মাণটি আমি অনুকরণ করতে সক্ষম হয়েছি তা হ'ল:

@({'condition is false'},{'condition is true'})[$condition]


বিকল্প হিসাবে পাওয়ারশেলের সুইচ স্টেটমেন্টটি চেষ্টা করুন, বিশেষত ভেরিয়েবল অ্যাসাইনমেন্টের জন্য - একাধিক লাইন, তবে পঠনযোগ্য।

উদাহরণ,

$WinVer = switch ( Test-Path $Env:windir\SysWOW64 ) {
  $true    { "64-bit" }
  $false   { "32-bit" }
}
"This version of Windows is $WinVer"

যেহেতু একটি ট্রেনারি অপারেটর সাধারণত মান নির্ধারণের সময় ব্যবহৃত হয়, তাই এটির একটি মান ফেরত দেওয়া উচিত। এটি এইভাবে কাজ করতে পারে:

$var[email protected]("value if false","value if true")[[byte](condition)]

বোকা, কিন্তু কাজ করছে। এছাড়াও এই নির্মাণটি দ্রুত কোনও মানকে অন্য মান হিসাবে রূপান্তর করতে ব্যবহার করা যেতে পারে, কেবল অ্যারে উপাদান যুক্ত করুন এবং একটি এক্সপ্রেশন নির্দিষ্ট করুন যা 0-ভিত্তিক অ-নেতিবাচক মানগুলি দেয় returns


$result = If ($condition) {"true"} Else {"false"}

সমস্ত কিছু ঘটনামূলক জটিলতা এবং তাই এড়ানো যায়।

কেবল কোনও অ্যাসাইনমেন্ট নয়, একটি অভিব্যক্তি হিসাবে বা একটি অভিব্যক্তি হিসাবে ব্যবহারের জন্য, এটিকে $() এ মোড়ানো করুন:

write-host  $(If ($condition) {"true"} Else {"false"}) 




conditional-operator