উত্তর:
পাওয়ারশেল, পাওয়ারশেলের নেটিভ নাল কোয়েলসিং, নাল কন্ডিশনাল অ্যাসাইনমেন্ট এবং টেরিনারি অপারেটরগুলির সাথে পরিচয় করিয়ে দেয় ।
নাল কোলেসিং
$null ?? 100 # Result is 100
"Evaluated" ?? (Expensive-Operation "Not Evaluated") # Right side here is not evaluated
নাল কন্ডিশনাল এসাইনমেন্ট
$x = $null
$x ??= 100 # $x is now 100
$x ??= 200 # $x remains 100
টার্নারি অপারেটর
$true ? "this value returned" : "this expression not evaluated"
$false ? "this expression not evaluated" : "this value returned"
পাওয়ারশেল সম্প্রদায় সম্প্রসারণের প্রয়োজন নেই, আপনি স্ট্যান্ডার্ড পাওয়ারশেল ব্যবহার করতে পারেন যদি বিবৃতি হিসাবে অভিব্যক্তি হিসাবে:
variable = if (condition) { expr1 } else { expr2 }
সুতরাং আপনার প্রথম সি # প্রকাশের প্রতিস্থাপনগুলিতে:
var s = myval ?? "new value";
নিম্নলিখিতগুলির মধ্যে একটি হয়ে যায় (পছন্দ অনুসারে):
$s = if ($myval -eq $null) { "new value" } else { $myval }
$s = if ($myval -ne $null) { $myval } else { "new value" }
বা কি নির্ভর করে - মাইভালটিতে আপনি কী ব্যবহার করতে পারেন তা থাকতে পারে:
$s = if ($myval) { $myval } else { "new value" }
এবং দ্বিতীয় সি # এক্সপ্রেশন মানচিত্রগুলি একইভাবে:
var x = myval == null ? "" : otherval;
হয়ে
$x = if ($myval -eq $null) { "" } else { $otherval }
এখন ন্যায়সঙ্গত হওয়ার জন্য, এগুলি খুব চটজলদি নয়, এবং সি # ফর্মগুলির মতো ব্যবহার করার মতো স্বাচ্ছন্দ্যময় আর কোথাও নেই।
জিনিসগুলি আরও পঠনযোগ্য করার জন্য আপনি এটি খুব সাধারণ কার্যক্রমে মোড়ানো বিবেচনা করতে পারেন:
function Coalesce($a, $b) { if ($a -ne $null) { $a } else { $b } }
$s = Coalesce $myval "new value"
বা সম্ভবত হিসাবে, ifNull:
function IfNull($a, $b, $c) { if ($a -eq $null) { $b } else { $c } }
$s = IfNull $myval "new value" $myval
$x = IfNull $myval "" $otherval
আপনি দেখতে পাচ্ছেন খুব সাধারণ একটি ফাংশন আপনাকে সিনট্যাক্সের স্বাধীনতা দিতে পারে।
আপডেট: মিশ্রণটি বিবেচনা করার জন্য একটি অতিরিক্ত বিকল্প হ'ল আরও জেনেরিক ইসট্রু ফাংশন:
function IfTrue($a, $b, $c) { if ($a) { $b } else { $c } }
$x = IfTrue ($myval -eq $null) "" $otherval
তারপরে অপারেটরগুলির মতো দেখতে কিছুটা ভিন্নরূপ ঘোষণার জন্য পাওয়ারশেলের ক্ষমতাটি একত্রিত করুন, আপনি এতে শেষ করবেন:
New-Alias "??" Coalesce
$s = ?? $myval "new value"
New-Alias "?:" IfTrue
$ans = ?: ($q -eq "meaning of life") 42 $otherval
স্পষ্টতই এটি প্রত্যেকের স্বাদ হতে পারে না, তবে আপনি যা খুঁজছেন তা হতে পারে।
থমাস নোট হিসাবে, সি # সংস্করণ এবং উপরোক্ত মধ্যে অন্য একটি সূক্ষ্ম পার্থক্য হ'ল সি # আর্গুমেন্টের সংক্ষিপ্ত-সঞ্চালন সম্পাদন করে, তবে ফাংশন / উপকরণের সাথে জড়িত পাওয়ারশেল সংস্করণ সবসময় সমস্ত যুক্তি মূল্যায়ন করবে। এটি যদি সমস্যা হয় তবে if
এক্সপ্রেশন ফর্মটি ব্যবহার করুন ।
The variable '$myval' cannot be retrieved because it has not been set.
।
$myval = $null
পরীক্ষা করার আগে সেট করেন তবে ত্রুটিটি চলে যাওয়া উচিত।
$null -ne $a
এখন শালীন রেফারেন্স খুঁজে পাওয়া যায় না, তবে এটি দীর্ঘকালীন অনুশীলন।
পাওয়ারশেল 7 অনেকগুলি নতুন বৈশিষ্ট্য উপস্থাপন করে এবং .NET ফ্রেমওয়ার্ক থেকে .NET কোরে স্থানান্তরিত করে। ২০২০ সালের মাঝামাঝি হিসাবে, এটি নেট কোরের উপর নির্ভরতার কারণে পাওয়ারশেলের লেগ্যাসি সংস্করণগুলি সম্পূর্ণরূপে প্রতিস্থাপন করেনি, তবে মাইক্রোসফ্ট ইঙ্গিত দিয়েছে যে তারা শেষ পর্যন্ত উত্তরসূরি ফ্রেমওয়ার্ক পরিবারটি প্রতিস্থাপনের জন্য কোর পরিবারকে উদ্দেশ্য করে। আপনি এটি পড়ার সময়, পাওয়ারশেলের একটি সামঞ্জস্যপূর্ণ সংস্করণ আপনার সিস্টেমে প্রাক ইনস্টল হতে পারে; যদি তা না হয় তবে https://github.com/powershell/powershell দেখুন ।
প্রতি ডকুমেন্টেশন নিম্নলিখিত অপারেটার আউট-অফ-বক্স PowerShell 7.0 এ সমর্থিত:
??
??=
... ? ... : ...
নাল কোলেসিংয়ের জন্য আপনি যেভাবে আশা করবেন তা এই কাজগুলি:
$x = $a ?? $b ?? $c ?? 'default value'
$y ??= 'default value'
যেহেতু একটি টার্নারি অপারেটর চালু করা হয়েছে, নিম্নলিখিতটি এখনই সম্ভব, যদিও এটি নাল কোয়েলসিং অপারেটরের সংযোজনের কারণে অপ্রয়োজনীয়:
$x = $a -eq $null ? $b : $a
.0.০ হিসাবে, ডক্সে বর্ণিত ( 1 , 2 ) হিসাবে PSNullConditionalOperators
isচ্ছিক বৈশিষ্ট্য সক্ষম থাকলে নিম্নলিখিতগুলিও উপলভ্য :
?.
?[]
এগুলিতে কয়েকটি সতর্কতা রয়েছে:
${}
পরীক্ষামূলক অপারেটরগুলির মধ্যে একটির সাথে সংযুক্ত থাকতে হবে কারণ ভেরিয়েবলের নামে প্রশ্ন চিহ্নের অনুমতি রয়েছে। এটি অস্পষ্ট কিনা / যখন বৈশিষ্ট্যগুলি পরীক্ষামূলক স্থিতি থেকে স্নাতক হয় ( সমস্যা # 11379 দেখুন )। উদাহরণস্বরূপ, ${x}?.Test()
নতুন অপারেটর ব্যবহার করে, কিন্তু $x?.Test()
রান Test()
নামে একটি পরিবর্তনশীল উপর $x?
।?(
আপনি টাইপ স্ক্রিপ্ট থেকে এসেছেন কিনা এমন কোনও অপারেটর যেমনটি আপনি আশা করতে পারেন তেমন নেই । নিম্নলিখিতগুলি কাজ করবে না:$x.Test?()
7 এর পূর্বে পাওয়ারশেলের সংস্করণগুলিতে একটি আসল নাল কোলেসিং অপারেটর বা কমপক্ষে কোনও অপারেটর রয়েছে যা এই জাতীয় আচরণে সক্ষম। অপারেটরটি হ'ল -ne
:
# Format:
# ($a, $b, $c -ne $null)[0]
($null, 'alpha', 1 -ne $null)[0]
# Output:
alpha
এটি নাল কোলেসিং অপারেটরের চেয়ে কিছুটা বহুমুখী, যেহেতু এটি সমস্ত নাল আইটেমগুলির একটি অ্যারে করে:
$items = $null, 'alpha', 5, 0, '', @(), $null, $true, $false
$instances = $items -ne $null
[string]::Join(', ', ($instances | ForEach-Object -Process { $_.GetType() }))
# Result:
System.String, System.Int32, System.Int32, System.String, System.Object[],
System.Boolean, System.Boolean
-eq
একইভাবে কাজ করে, যা নাল এন্ট্রি গণনা করার জন্য দরকারী:
($null, 'a', $null -eq $null).Length
# Result:
2
তবে যাইহোক, এখানে সি # এর ??
অপারেটরকে মিরর করার একটি সাধারণ কেস রয়েছে :
'Filename: {0}' -f ($filename, 'Unknown' -ne $null)[0] | Write-Output
এই ব্যাখ্যাটি একজন অনামী ব্যবহারকারীর সম্পাদনা পরামর্শের ভিত্তিতে। ধন্যবাদ, আপনি যে কেউ!
ক্রিয়াকলাপের ক্রমের ভিত্তিতে, এটি নিম্নলিখিত ক্রমে কাজ করে:
,
অপারেটর মূল্যবোধের একটি অ্যারের পরীক্ষা করা হয়।-ne
এই ক্ষেত্রে, নাল - অ্যারের নির্দিষ্ট করা মানের মেলে থেকে কোন আইটেম অপারেটর ফিল্টার। ফলাফলটি পদক্ষেপ 1-এ তৈরি করা অ্যারের মতো একই ক্রমে নন-নাল মানগুলির একটি অ্যারে।[0]
ফিল্টার করা অ্যারের প্রথম উপাদানটি নির্বাচন করতে ব্যবহৃত হয়।সরলকরণ:
সি # এর নাল কোয়েলসিং অপারেটরের বিপরীতে, প্রতিটি সম্ভাব্য এক্সপ্রেশন মূল্যায়ন করা হবে, যেহেতু প্রথম পদক্ষেপটি অ্যারে তৈরি করা।
function DidItRun($a) { Write-Host "It ran with $a"; return $a }
এবং চালান run ((DidItRun $null), (DidItRun 'alpha'), 1 -ne $null)[0]
,
এমন উচ্চতর নজির রয়েছে। এটি যেভাবে কাজ করে সে সম্পর্কে বিভ্রান্ত যে কেউ, ($null, 'alpha', 1 -ne $null)[0]
তার মতোই (($null, 'alpha', 1) -ne $null)[0]
। প্রকৃতপক্ষে কেবলমাত্র দুটি "ড্যাশ" অপারেটর উচ্চতর প্রাধান্য সহ -split
এবং -join
(এবং অ্যানারি ড্যাশ? অর্থাত্। -4
বা -'56'
)।
এটি প্রশ্নের প্রথমার্ধের অর্ধেক উত্তর, সুতরাং আপনি যদি চান তবে এক চতুর্থাংশ উত্তর, তবে নাল কোলেসিং অপারেটরের অনেক সহজ বিকল্প রয়েছে আপনি যে ডিফল্ট মানটি ব্যবহার করতে চান তা আসলে ধরণের ডিফল্ট মান :
string s = myval ?? "";
পাওয়ারশেল এ হিসাবে লেখা যেতে পারে:
([string]myval)
অথবা
int d = myval ?? 0;
পাওয়ারশেল অনুবাদ:
([int]myval)
আমি এই এক্সএলএমএল উপাদানটির প্রক্রিয়া করার সময় এই দরকারীটির মধ্যে প্রথমটি খুঁজে পেয়েছি যা সম্ভবত উপস্থিত নেই এবং যা যদি এটি উপস্থিত থাকে তবে এটি অবাঞ্ছিত শ্বেতস্পেস থাকতে পারে:
$name = ([string]$row.td[0]).Trim()
কাস্ট টু স্ট্রিং উপাদানটি নাল হওয়া থেকে রক্ষা করে এবং Trim()
ব্যর্থ হওয়ার কোনও ঝুঁকি প্রতিরোধ করে ।
([string]$null)
-> ""
একটি "দরকারী, কিন্তু দুর্ভাগ্যজনক পার্শ্ব প্রতিক্রিয়া" বলে মনে হচ্ছে :(
$null, $null, 3 | Select -First 1
আয়
3
আপনি যদি পাওয়ারশেল সম্প্রদায় সম্প্রসারণ মডিউলটি ইনস্টল করেন তবে আপনি এটি ব্যবহার করতে পারেন:
?? ইনভোক-নলকোলেসেসিংয়ের জন্য উপনাম।
$s = ?? {$myval} {"New Value"}
?: ইনভোক-টেরনারির নাম।
$x = ?: {$myval -eq $null} {""} {$otherval}
শেষ অবধি , পাওয়ারশেল 7 নাল কোলেসিং অ্যাসাইনমেন্ট অপারেটরদের পেল !
PS > $null ?? "a"
a
PS > "x" ?? "y"
x
PS > $x = $null
PS > $x ??= "abc"
PS > $x
abc
PS > $x ??= "xyz"
PS > $x
abc
@($null,$null,"val1","val2",5) | select -First 1
প্রায়শই আমি দেখতে পাই যে কোলেসেস ব্যবহার করার সময় আমার খালি স্ট্রিংকে নাল হিসাবে গণ্য করতে হবে। আমি এটির জন্য একটি ফাংশন লিখেছি , যা সাধারণ নুল কোলেসেসের জন্য কোলেসিংয়ের জন্য জেনেক্সারের সমাধান ব্যবহার করে, এবং তারপরে নর্থ বা খালি চেকিংয়ের জন্য কীথ হিলের ব্যবহার করে , এবং যুক্ত করেছি যে পতাকা হিসাবে আমার ফাংশন উভয়ই করতে পারে।
এই ফাংশনটির একটি সুবিধা হ'ল এটি ব্যতিক্রম ছুঁড়ে না ফেলে সমস্ত উপাদান নাল (বা খালি) থাকাও পরিচালনা করে। পাওয়ারশেল অ্যারে ইনপুটগুলি কীভাবে পরিচালনা করে তা ধন্যবাদ, এটি অনেকগুলি ইনপুট ভেরিয়েবলের জন্যও ব্যবহার করা যেতে পারে।
function Coalesce([string[]] $StringsToLookThrough, [switch]$EmptyStringAsNull) {
if ($EmptyStringAsNull.IsPresent) {
return ($StringsToLookThrough | Where-Object { $_ } | Select-Object -first 1)
} else {
return (($StringsToLookThrough -ne $null) | Select-Object -first 1)
}
}
এটি নিম্নলিখিত পরীক্ষার ফলাফল উত্পাদন করে:
Null coallesce tests:
1 (w/o flag) - empty/null/'end' :
1 (with flag) - empty/null/'end' : end
2 (w/o flag) - empty/null :
2 (with flag) - empty/null :
3 (w/o flag) - empty/null/$false/'end' :
3 (with flag) - empty/null/$false/'end' : False
4 (w/o flag) - empty/null/"$false"/'end' :
4 (with flag) - empty/null/"$false"/'end' : False
5 (w/o flag) - empty/'false'/null/"$false"/'end':
5 (with flag) - empty/'false'/null/"$false"/'end': false
পরীক্ষার কোড:
Write-Host "Null coalesce tests:"
Write-Host "1 (w/o flag) - empty/null/'end' :" (Coalesce '', $null, 'end')
Write-Host "1 (with flag) - empty/null/'end' :" (Coalesce '', $null, 'end' -EmptyStringAsNull)
Write-Host "2 (w/o flag) - empty/null :" (Coalesce('', $null))
Write-Host "2 (with flag) - empty/null :" (Coalesce('', $null) -EmptyStringAsNull)
Write-Host "3 (w/o flag) - empty/null/`$false/'end' :" (Coalesce '', $null, $false, 'end')
Write-Host "3 (with flag) - empty/null/`$false/'end' :" (Coalesce '', $null, $false, 'end' -EmptyStringAsNull)
Write-Host "4 (w/o flag) - empty/null/`"`$false`"/'end' :" (Coalesce '', $null, "$false", 'end')
Write-Host "4 (with flag) - empty/null/`"`$false`"/'end' :" (Coalesce '', $null, "$false", 'end' -EmptyStringAsNull)
Write-Host "5 (w/o flag) - empty/'false'/null/`"`$false`"/'end':" (Coalesce '', 'false', $null, "$false", 'end')
Write-Host "5 (with flag) - empty/'false'/null/`"`$false`"/'end':" (Coalesce '', 'false', $null, "$false", 'end' -EmptyStringAsNull)
নিকটতম আমি পেতে পারি: $Val = $MyVal |?? "Default Value"
আমি উপরেরটির জন্য নাল কোলেসিং অপারেটরটিকে এভাবে প্রয়োগ করেছি :
function NullCoalesc {
param (
[Parameter(ValueFromPipeline=$true)]$Value,
[Parameter(Position=0)]$Default
)
if ($Value) { $Value } else { $Default }
}
Set-Alias -Name "??" -Value NullCoalesc
শর্তাধীন তিন অপারেটর একটি similary ভাবে বাস্তবায়িত করা যায়নি।
function ConditionalTernary {
param (
[Parameter(ValueFromPipeline=$true)]$Value,
[Parameter(Position=0)]$First,
[Parameter(Position=1)]$Second
)
if ($Value) { $First } else { $Second }
}
Set-Alias -Name "?:" -Value ConditionalTernary
এবং ব্যবহৃত: $Val = $MyVal |?: $MyVal "Default Value"