Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77

Поиск подстроки в строке наиболее эффективным способом

22.04.2021, 09:42. Показов 7577. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день уважаемые

Возникла необходимость отфильтровать строки в достаточно большом CSV файле, задумался над эффективностью.

Вариант
PowerShell
1
Import-CSV | Where-Object
думаю рассматривать не стоит.

Мне нужно сократить файл в 600 метров, фильтр будет по нескольким полям. Пока два, строки содержащие в одном поле значение из списка `("ab", "ac")`, и в другом поле значение из списка `('a123', 'b123', 'c123')`

Если в выборку попадут строки со значениями из списков в других полях это не принципиально.

К результирующей выборке уже можно применять Import-CSV | Where-Object так так она будет не большая.

Буду признателен идеям по реализации.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.04.2021, 09:42
Ответы с готовыми решениями:

Поиск наиболее часто встречающейся подстроки в строке
Прошло уже немало лет с тех пор, как Лич Сандро ушёл на заслуженный отдых. Иногда по вечерам, когда ему становится совсем тоскливо, он...

Поиск подстроки в строке и вывод подстроки
Удалите пожалуйста, разобрался

Продвижение статьями и ссылками: как сделать его наиболее эффективным
Здравствуйте. Возможно, некоторые вопросы ранее уже обсуждались, в таком случае прошу прощения, киньте ссылку. Но в целом при чтении...

48
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
23.04.2021, 18:33
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от YuS_2 Посмотреть сообщение
$a = $reader.readline() -ne $null
-ne $null - здесь лишнее.
PowerShell воспринимает null как false автоматически.
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
23.04.2021, 20:14  [ТС]
Fors1k, он про это и пишет, поведение специфическое, и сохранится ли оно в дальнем будущем неизвестно. В общем дело частное. Пока это так.
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
23.04.2021, 21:05
Цитата Сообщение от alhaos Посмотреть сообщение
сохранится ли оно в дальнем будущем
Сохранится.
Это не специфическое поведение, а вполне нормальное. Об этом поведении сказано в документации. И так не только в powershell:
Lua
1
2
3
4
5
a = nil
 
if a then
    os.execute("notepad.exe")
end
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
23.04.2021, 23:19
Цитата Сообщение от Fors1k Посмотреть сообщение
PowerShell воспринимает null как false автоматически.
автоматическое приведение, зачастую - зло, хоть и не всегда...
$null в исполнении разаботчиков powershell - вещь в себе и что там придет тем разработчикам в голову, в обозримом будущем - тайна покрытая мраком...

Цитата Сообщение от Fors1k Посмотреть сообщение
Сохранится.
Я бы не стал утверждать это столь категорично... особенно в условиях того, что в пределах одной версии, но на разных платформах ОС (и даже разных версиях одной и той же ОС), присутствуют существенные различия...

Цитата Сообщение от Fors1k Посмотреть сообщение
Это не специфическое поведение, а вполне нормальное. Об этом поведении сказано в документации. И так не только в powershell
Эхе-хе-хе... видимо, тебе мало приходилось сталкиваться с микрософтовыми изделиями
Ну давай, я покажу, что такое $null в представлении разработчиков powershell
PowerShell
1
2
if ($val -eq $null) {'Труе'} else {'Фальсе'}
if ($val -ne $null) {'Труе'} else {'Фальсе'}
PS_5.1> if ($val -eq $null) {'Труе'} else {'Фальсе'}
Труе
PS_5.1> if ($val -ne $null) {'Труе'} else {'Фальсе'}
Фальсе
PS_5.1>
- вроде бы всё верно... но давай сделаем так:
PowerShell
1
$val = @($null)
и повторим:
PowerShell
1
2
if ($val -eq $null) {'Труе'} else {'Фальсе'}
if ($val -ne $null) {'Труе'} else {'Фальсе'}
PS_5.1> if ($val -eq $null) {'Труе'} else {'Фальсе'}
Фальсе
PS_5.1> if ($val -ne $null) {'Труе'} else {'Фальсе'}
Фальсе
PS_5.1>
- упс... никогда такого не было и вот опять! Вот тебе бабушка и Юрьев день...
Ну и для полного понимания картины:
PowerShell
1
2
3
4
$null * 2
$null -eq ( $null * 2 )
2 * $null
$null -eq ( 2 * $null )
- попробуй объяснить такую математику с логикой

Такшта... делайте выводы. На грабли можно наступить так, что и сам не поймешь с какой стороны получил по голове... а ты говоришь автоматическое приведение... зло это.

Добавлено через 16 минут
Ну и на закуску:
PowerShell
1
2
3
function Get-True {
    $args[0] -eq $null -and $args[0] -ne $null
}
- Какое должно быть значение у этой функции? Думаете - False? А вот и не угадали...
PowerShell
1
2
3
4
$val = &{,$null * 2  +  1}
Get-True $val
# Или так:
Get-True @($null,$null,1)
1
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
24.04.2021, 06:41  [ТС]
Цитата Сообщение от YuS_2 Посмотреть сообщение
$val = @($null)
тут просто надо быть чуть построже
PowerShell
1
$val = @(,$null)
меня конечно тоже обескураживает
PowerShell
1
2
PS C:\Users\Зуля> $null -eq $null
True
но моделировать пустоту как объект дело неблагодарное... всегда будут недовольные.

Добавлено через 14 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
$null * 2
$null -eq ( $null * 2 )
2 * $null
$null -eq ( 2 * $null )
Собственно почему бы и нет

PowerShell
1
2
"a" * 2
2 * "a"
Приводит ожидаемо к разным результатам

Добавлено через 6 минут
Цитата Сообщение от alhaos Посмотреть сообщение
PS C:\Users\Зуля> $null -eq $null
True
Думаю исходя из этого можно будет доказать что 2+2=5

Добавлено через 8 минут
В sql с этим строже, любая операция сравнения с null приводит к ошибке, нужно использовать оператор is
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
24.04.2021, 08:06
Цитата Сообщение от alhaos Посмотреть сообщение
тут просто надо быть чуть построже
и что это даёт?

Цитата Сообщение от alhaos Посмотреть сообщение
меня конечно тоже обескураживает
Это-то как раз логично, при сравнении эквивалентности одинаковых операндов, получить True. Никаких противоречий не наблюдаю.

Цитата Сообщение от alhaos Посмотреть сообщение
но моделировать пустоту как объект дело неблагодарное...
вопрос не в моделировании, а в том, что в попытках автоматического приведения типов, разработчики зашли столь далеко, что значение $null, внезапно стало сильно зависеть от контекста... это логично или как?

Цитата Сообщение от alhaos Посмотреть сообщение
Приводит ожидаемо к разным результатам
Угу, здесь, как раз, ожидаемо и именно потому, что невозможность автоматического приведения типа приводит таки к исключению, в отличии от использования $null вместо строки/символа...

Цитата Сообщение от alhaos Посмотреть сообщение
Думаю исходя из этого можно будет доказать что 2+2=5
В условиях когда сумма или произведение зависит от местоположения слагаемого или множителя (что противоречит вдалбливаемым со школьной скамьи постулатам) - возможно всё!
Ты функцию-то Get-True проверил? И что думаешь по этому поводу?
Руки... руки бы поотрывать за такое - мое мнение.
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
24.04.2021, 16:26
YuS_2, это все интересно, но говорили мы изначально о другом
PowerShell
1
2
3
4
5
if($process=Get-Process qwe -ErrorAction ignore) {$process} else {$false}
 
if($data=Get-Content qwe -ErrorAction ignore) {$data} else {$false}
# false
# false
Насчет операций над null:
Цитата Сообщение от YuS_2 Посмотреть сообщение
if ($val -eq $null) {'Труе'} else {'Фальсе'}
if ($val -ne $null) {'Труе'} else {'Фальсе'}
$null нужно размещать в левой части.
Ничто = ничто
PowerShell
1
2
3
4
if ($null -eq $val) {'Труе'} else {'Фальсе'}
if ($null -eq $val) {'Труе'} else {'Фальсе'}
# Труе
# Труе
Цитата Сообщение от YuS_2 Посмотреть сообщение
$val = @($null)
if ($val -eq $null) {'Труе'} else {'Фальсе'}
if ($val -ne $null) {'Труе'} else {'Фальсе'}
Ничто != существующий объект System.Array
PowerShell
1
2
3
4
5
$val = @($null)
if ($null -eq $val) {'Труе'} else {'Фальсе'}
if ($null -eq $val) {'Труе'} else {'Фальсе'}
# Фальсе
# Фальсе
Цитата Сообщение от YuS_2 Посмотреть сообщение
$null * 2
$null -eq ( $null * 2 )
2 * $null
$null -eq ( 2 * $null )
- попробуй объяснить такую математику с логикой
1. дважды ничто - это ничто
2. ничего = дважды ничего
3. 2 * ничего для чисел = 2 * 0 = 0
4. ничего != цифра ноль.

Добавлено через 5 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
function Get-True
PowerShell
1
2
3
4
5
function Get-True {
    $null -eq $args[0] -and $null -ne $args[0]
}
Get-True @($null,$null,1)
#false
Ну, вроде, все в порядке теперь
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
24.04.2021, 18:40
Цитата Сообщение от Fors1k Посмотреть сообщение
это все интересно, но говорили мы изначально о другом
Э-э-э нет, говорили мы, как раз о том, об автоматическом приведении типов...

Цитата Сообщение от Fors1k Посмотреть сообщение
$null нужно размещать в левой части.
Это да... вот, только где об этом упоминание в документации? Не в личных наблюдения кого-либо, а именно в документации...
$null is an automatic variable that contains a null or empty value. You can use this variable to represent an absent or undefined value in commands and scripts.

PowerShell treats $null as an object with a value, that is, as an explicit placeholder, so you can use $null to represent an empty value in a series of values.
Кстати, в твоих примерах закралась ошибка - у тебя в обоих строках оператор -eq
И кроме того:
Цитата Сообщение от Fors1k Посмотреть сообщение
Ничто != существующий объект System.Array
Давай обратимся к документации:
-eq и -ne
Если левая часть является скалярной, -eq возвращает значение true , если правая часть является точным совпадением, в противном случае -eq возвращает значение false. -ne выполняет противоположный; При совпадении обоих сторон возвращается значение false . в противном случае -ne возвращает значение true.
...
Если левая часть является коллекцией, -eq возвращает элементы, соответствующие правой части, и -ne отфильтровывает их.
Смотрим в наш пример (левая часть - коллекция, правая - is an exact match):
PowerShell
1
2
3
$val = @($null)
if ($val -eq $null) {'Труе'} else {'Фальсе'}
if ($val -ne $null) {'Труе'} else {'Фальсе'}
- по приведенной выше выдержке из документации, мы должны получить:
1. $null, а совсем не False
2. False - что, собственно и получили...
Так вот, это есть несоответствие документации - номер раз, в п.1.
Мы ведь не делали ничего, что противоречит документации, правильно?
Далее:
Цитата Сообщение от Fors1k Посмотреть сообщение
1. дважды ничто - это ничто
2. ничего = дважды ничего
3. 2 * ничего для чисел = 2 * 0 = 0
4. ничего != цифра ноль.
Хмм, тебе не кажется, что здесь $null плавно таки стал эквивалентом 0? Но это ведь не одно и то же - верно? Поэтому вести речь о цифрах, в зависимости от местоположения $null в математическом действии, абсолютно некорректно... максимум о чем можно говорить, это об исключении, которое должно было возникнуть.

Цитата Сообщение от Fors1k Посмотреть сообщение
Ну, вроде, все в порядке теперь
Это вряд ли... ибо при сравнении коллекции со скаляром, по документации, мы обязаны помещать коллекцию в левую часть, а сравниваемый скаляр в правую... вот такие пироги.
Но принцип работы функции и почему так происходит, можно посмотреть здесь

Подводя итог: Понятно, что в powershell разработчики решили по-своему, как будет работать автоматическое приведение типов, причем в зависимости от контекста, но это просто надо учитывать и не оставлять на откуп таким вот не всегда предсказуемым действиям. То бишь, значения и типы, по возможности, лучше задавать явно, меньше шишек получим на лбу, в итоге.

Добавлено через 17 минут
Чтобы кратко обозначить мою претензию к разработчикам, у меня есть вот такой вот пример:
PS_7.2> $val = @($null)
PS_7.2> if ($val -eq $null) {'Труе'} else {'Фальсе'}
Фальсе
PS_7.2> $val = @($null,$null)
PS_7.2> if ($val -eq $null) {'Труе'} else {'Фальсе'}
Труе
- именно это вызывает чувство острого непонимания логики разрабов...
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
24.04.2021, 21:14
Цитата Сообщение от YuS_2 Посмотреть сообщение
Это да... вот, только где об этом упоминание в документации? Не в личных наблюдения кого-либо, а именно в документации...
Если выполняется специальная проверка на наличие $null, рекомендуется размещать $null в левой части.

Отсутствие результата или значение $null вычисляется как $false
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
24.04.2021, 23:47
Fors1k,
Цитата Сообщение от Fors1k Посмотреть сообщение
Не в личных наблюдения кого-либо, а именно в документации...
Ты привел ссылки на личные наблюдения Kevin Marquette
А в документации, ссылки и цитаты, на которую я приводил, говорится о том, что коллекции размещаются слева... противоречие, однако
Перейди по ссылке, там есть наглядные примеры, для случаев, когда коллекция справа, а сравниваемое значение слева. Это совсем не наш случай, т.е. там заведомо будет не то, что хотелось бы получить от сравнения...
0
 Аватар для volodin661
7150 / 2338 / 353
Регистрация: 10.12.2013
Сообщений: 8,100
25.04.2021, 03:39
Из коллектива вылетает разъяренный Тромбон:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$VAL = @( $NULL, $NULL )
$VAL.COUNT
#2.  Ожидаемо.
 
$VAL = @( $NULL )
$VAL.COUNT
#1. Ожидаемо
 
# Но у нас ещё есть пара гнедых за пазухой: 
$VAL = @( $NULL, [void]$NULL )
#Шо, знатоки, заколдобило ?
#Ладно, приоткрою завесу тайны:
$VAL.COUNT
# тоже 2
 
$VAL = @([void]$NULL)
# вопрос к знатокам:
# а теперь чему равен $VAL.COUNT ?
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
25.04.2021, 08:40
Цитата Сообщение от volodin661 Посмотреть сообщение
вопрос к знатокам
Это лишнее подтверждение извращенной логики разработчиков powershell
Ведь, строго говоря, void - это не тип данных:
- Почему, внезапно, в powershell стало можно? В общем... руки... руки отрывать однозначно!
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
25.04.2021, 17:16
Цитата Сообщение от YuS_2 Посмотреть сообщение
Хмм, тебе не кажется, что здесь $null плавно таки стал эквивалентом 0?
Логично, правая чать получает тип левой, если это возможно:
2 * $null
↓
2 * [int]$null
↓
2 * 0
↓
0

"4" + 2
↓
"4" + [String]2
↓
"4" + "2"
↓
42


2 + "4"
↓
2 + [int]"4"
↓
2 + 4
↓
6


Добавлено через 8 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
Ты привел ссылки на личные наблюдения Kevin Marquette
Какая разница кто автор текста? Он расположен по адресу docs.microsoft.com/ru-ru/powershell/scripting/... Значит информация не скрыта от пользователя, а вполне доступна для ознакомления в разделе документации повершелла.
Там сказано: ставить $null слева. Смысл спорить с документацией?

Если очень хочется поставить $null справа, то сейчас объясню что в таком случае происходит.
Цитата Сообщение от YuS_2 Посмотреть сообщение
Чтобы кратко обозначить мою претензию к разработчикам, у меня есть вот такой вот пример:
PS_7.2> $val = @($null)
PS_7.2> if ($val -eq $null) {'Труе'} else {'Фальсе'}
Фальсе
PS_7.2> $val = @($null,$null)
PS_7.2> if ($val -eq $null) {'Труе'} else {'Фальсе'}
Труе
- именно это вызывает чувство острого непонимания логики разрабов...
Почему же сначала фолс, а потом тру? Разберем по шагам, используя твою же цитату.
Цитата Сообщение от YuS_2 Посмотреть сообщение
Если левая часть является коллекцией, -eq возвращает элементы, соответствующие правой части, и -ne отфильтровывает их.
1
PowerShell
1
2
3
$val = @($null)
if ($val -eq $null) {'Труе'} else {'Фальсе'}
# Фальсе
↓
($val -eq $null) = дай из массива элементы, которые null
↓
дали один null
↓
($null)
↓
if($null)
↓
([boolean]$null)⇒$False
↓
if($False)
↓
Фальсе

2
PowerShell
1
2
3
$val = @($null,$null)
if ($val -eq $null) {'Труе'} else {'Фальсе'}
# Труе
↓
($val -eq $null) = дай из массива элементы, которые null
↓
дали null,null
↓
(@($null,$null))
↓
if(@($null,$null))
↓
([boolean]@($null,$null))⇒$True
↓
if($True)
↓
Труе


Ну, вроде, все в порядке теперь

Тогда для
PowerShell
1
2
3
4
while( $a = $reader.readline() )
{
    $a
}
правильно будет записать так:
PowerShell
1
2
3
4
while( $null -ne ($a = $reader.readline()) )
{
    $a
}
1
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
25.04.2021, 22:42
Цитата Сообщение от Fors1k Посмотреть сообщение
Логично, правая чать получает тип левой, если это возможно
Вот! Основное я выделил
С какого перепуга у NULL, внезапно, появляется тип и этот NULL плавно перетекает в 0? Это противоестественно... "ничего" не может быть преобразовано в ноль, это абсолютно разные сущности. Автоприведение типа в такой ситуации - "абсолютное зло"

Цитата Сообщение от Fors1k Посмотреть сообщение
Какая разница кто автор текста?
Огромная. Разработчик, написавший документацию - это один человек, а наблюдатель, который исследует результаты работы кода - совсем другой. Разработчик пишет официальную документацию, наблюдатель - может сколько угодно раздавать рекомендации, но они никогда не станут официальными документами.
Т.е. я, конечно, согласен с рекомендацией, но она верна только для случая, когда сравниваются два скаляра, для коллекции она негодна.

Цитата Сообщение от Fors1k Посмотреть сообщение
Там сказано: ставить $null слева. Смысл спорить с документацией?
Ты точно сходил по той ссылке, которую я приводил? Перечитай таки про операторы сравнения -eq и -ne, в части того, как они работают с коллекциями.
Из официальной документации:
Code
1
2
3
4
5
6
7
2 -eq 2                 # Output: True
2 -eq 3                 # Output: False
"abc" -eq "abc"         # Output: True
"abc" -eq "abc", "def"  # Output: False - вот здесь то, что нас интересует
"abc" -ne "def"         # Output: True
"abc" -ne "abc"         # Output: False
"abc" -ne "abc", "def"  # Output: True
и вот так:
Code
1
2
3
1,2,3 -eq 2             # Output: 2
"abc", "def" -eq "abc"  # Output: abc - и здесь про коллекцию
"abc", "def" -ne "abc"  # Output: def
- разве не видно разницы? Выхлоп описан в комментах там... т.е. местоположение коллекции даст разный результат операции сравнения, при одих и тех же данных и рекомендация здесь не работает, ибо нефиг.

Цитата Сообщение от Fors1k Посмотреть сообщение
Если очень хочется поставить $null справа, то сейчас объясню что в таком случае происходит.
Не ХОЧЕТСЯ, а НЕОБХОДИМО - это две большие разницы

Цитата Сообщение от Fors1k Посмотреть сообщение
дали null,null
А! Вон ты про что... слона-то я и не приметил, посыпаю голову пеплом. Всё верно, из коллекции же будут возвращены оба "ничего", а два "ничего", как не крути, совсем не эквивалент одному. Согласен. В смысле, это не сарказм, у меня реально "замкнуло" на этих NULL... беру свои слова, про извращенную логику разрабов, обратно.

Цитата Сообщение от Fors1k Посмотреть сообщение
правильно будет записать так:
Да, собственно, в данном случае, это не имеет значения, но следуя рекомендации, да, лучше поместить $null слева, т.к. сравниваются два скаляра, коллекции там нет.

Добавлено через 20 минут
Цитата Сообщение от YuS_2 Посмотреть сообщение
беру свои слова, про извращенную логику разрабов, обратно
Ну, как обратно... в этой части да.
Ещё осталось разобраться с void, почему в powershell стало возможным применять его к переменным... ведь, тот же самый dotnet... казалось бы.
0
 Аватар для volodin661
7150 / 2338 / 353
Регистрация: 10.12.2013
Сообщений: 8,100
26.04.2021, 00:25
Ха.
ХА!
ХА-ХА!
Знаете, что мне это напомнило ?
Кликните здесь для просмотра всего текста


да, нужно верить своим глазам : применение BOOLEAN к массиву с количеством
членов больше 1, даёт истину ВСЕГДА. Вне зависимости от значений членов массива.
Даже если все члены массива не инициализированы( а $null служит в массиве именно для этого, чтобы место греть ), значением [boolean]@(0,0,0,0), т.е, при кол-ве членов в массиве >1, будет всегда TRUE.

Если же массив единичный и его значение и не 0, и не $null, то вернётся TRUE, а если 0 или $null, то вернётся FALSE

Ну и хуле ?
А как работает этот механизм высчитывания ?
Каким образом (0 -OR 0) дадут TRUE, или (0 -AND 0) дадут TRUE?
Подозреваю, что никак не работает, просто так решили: десять сольдо плюс пять сольдо равно сто сольдо.
Какое небо голубое...
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
26.04.2021, 04:36
Цитата Сообщение от volodin661 Посмотреть сообщение
Если же массив единичный и его значение и не 0, и не $null, то вернётся TRUE, а если 0 или $null, то вернётся FALSE

Ну и хуле ?
А как работает этот механизм высчитывания ?
В powershell, с первых версий, внедрена глобальная концепция: "Всё, что не 0 или не NULL, при автоприведении к [bool], становится TRUE"
Что касается массивов, то массив из одного элемента и массив из элементов больше одного, отличаются и подозреваю, что сделано это именно для того, чтобы работали операции сравнения как со скалярами (при условии, что коллекция состоит из одного элемента).

Цитата Сообщение от volodin661 Посмотреть сообщение
Каким образом (0 -OR 0) дадут TRUE, или (0 -AND 0) дадут TRUE?
-Пять на два не делится? Не делится, да? Попробуем разделить... на пять! Получается… один! Получай!
-Ты меня не путай!


ну а если серьезно, то почему (FALSE -OR FALSE) или (FALSE -AND FALSE) должны давать TRUE? Это же классика булевой логики...
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
26.04.2021, 14:30
Цитата Сообщение от YuS_2 Посмотреть сообщение
но они никогда не станут официальными документами.
Стали :)

Ну, в общем, если нет желания верить написанному на Docs / PowerShell, то хозяин - барин) Ставь $null справа, я не принуждаю ни к чему насильно))
Цитата Сообщение от YuS_2 Посмотреть сообщение
Ты точно сходил по той ссылке, которую я приводил?
Ну, коли вы настаиваете :
Из твоей ссылки:если необходимо определить, является ли переменная $null , необходимо разместить $null в левой части оператора равенства.

Цитата Сообщение от YuS_2 Посмотреть сообщение
Всё верно, из коллекции же будут возвращены оба "ничего", а два "ничего", как не крути, совсем не эквивалент одному.
Не совсем так. После возврата двух "ничего", сравнение с одним уже не производится. Полученные элементы приводятся к boolean. Я это описал в данной схеме:
Кликните здесь для просмотра всего текста

Цитата Сообщение от Fors1k Посмотреть сообщение
PowerShell
1
2
3
$val = @($null,$null)
if ($val -eq $null) {'Труе'} else {'Фальсе'}
# Труе
↓
($val -eq $null) = дай из массива элементы, которые null
↓
дали null,null
↓
(@($null,$null))
↓
if(@($null,$null))
↓
([boolean]@($null,$null))⇒$True
↓
if($True)
↓
Труе

Цитата Сообщение от YuS_2 Посмотреть сообщение
Ещё осталось разобраться с void, почему в powershell стало возможным применять его к переменным
Думаю, тут разбираться особо не с чем. Это просто некорректная запись. Void нужен для запрета вывода методов.
В 5.1 такой код $VAL = @( $NULL, [void]$NULL ) вообще не запускается.
Этот Write-Host ([void]5) не запустится в PScore.

Цитата Сообщение от volodin661 Посмотреть сообщение
а если 0 или $null, то вернётся FALSE
Еще пустая строка вернет фолс.
Цитата Сообщение от volodin661 Посмотреть сообщение
А как работает этот механизм высчитывания ?
Видимо решили по умолчанию делать анпак для массива, имеющего всего один элемент. По доброте душевной
Проверить существование объекта, похоже, можно так:
PowerShell
1
2
3
4
5
6
7
$val = @($null)
 
[bool]$val      # False
[bool](,$val)   # True
 
[bool]$val_1    # False
[bool](,$val_1) # False
0
 Аватар для alhaos
1934 / 549 / 155
Регистрация: 20.02.2019
Сообщений: 2,675
Записей в блоге: 77
26.04.2021, 15:30  [ТС]
столько хайпа из за ничего ($null)
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
26.04.2021, 15:54
Цитата Сообщение от Fors1k Посмотреть сообщение
Ну, в общем, если нет желания верить написанному на Docs / PowerShell, то хозяин - барин) Ставь $null справа, я не принуждаю ни к чему насильно))
Это надо понимать так: Ты вопреки разумному применению рекомендаций, будешь слепо им доверять?
Ещё раз: я постоянно талдычу про скаляр $null и коллекцию - сам поймешь, или нужны подробности?
Ну ок, вот подробности... по моей ссылке, которую ты процитировал :
Цитата Сообщение от Fors1k Посмотреть сообщение
Ну, коли вы настаиваете :
Это уже ближе к телу... т.е. документация таки
Но теперь внимательно читаем, ЧТО именно ты процитировал:
если необходимо определить, является ли ПЕРЕМЕННАЯ $null, необходимо разместить $null в левой части оператора равенства.
- надо объяснять про переменную и сопутствующую разницу между скаляром и коллекцией?
И ещё: а прочитал ли ты далее, а именно то, что следует сразу за процитированным текстом?
Размещение с правой стороны не делает то, что вы ждете.
Например, пусть $a массив содержит элементы со значением NULL:
Code
1
$a = 1, 2, $null, 4, $null, 6
Следующие тесты $a не имеют значение null.

Code
1
2
$null -ne $a
True
Однако в следующем примере фильтрами определенными все элементы NULL из $a :
Code
1
2
3
4
5
$a -ne $null # Output: 1, 2, 4, 6
1
2
4
6
А? Не? Всё равно будешь при сравнении коллекции с $null, помещать $null в левую часть? Бог в помощь, как говорится...

Цитата Сообщение от Fors1k Посмотреть сообщение
Думаю, тут разбираться особо не с чем. Это просто некорректная запись. Void нужен для запрета вывода методов.
Некорректная запись где? В документации? Так, вроде всё верно там, void служит для обозначения метода или локальной функции, которые ничего не возвращают. А также для определения указателя (которые не существуют в powershell, кстати) на неизвестный тип. В powershell документации пытался найти вменяемое описание void... не нашел. Может быть, плохо искал... ну, кроме этого:
void System.Void
- там, где описываются акселераторы...
и ещё это:
Выходные данные в методах класса
Методы должны иметь определенный тип возвращаемого значения. Если метод не возвращает выходные данные, то тип выходных данных должен быть [void] .
- там где про классы
и это все "подробности"...

Цитата Сообщение от Fors1k Посмотреть сообщение
В 5.1 такой код
...
вообще не запускается.
Вопрос в том, что в более новых версиях он запускается и даже не вызывает исключения...

Цитата Сообщение от Fors1k Посмотреть сообщение
Этот
Write-Host ([void]5)
не запустится в PScore.
Зато этот:
PowerShell
1
 Write-Host $([void]5)
- вполне... и о чем это говорит нам? Не понимаю...
Где описание того, что переменные (не методы, не функции, а именно переменные) можно приводить к типу [void]? По факту, такое действие не вызывает исключений. Почему?

Добавлено через 8 минут
Цитата Сообщение от alhaos Посмотреть сообщение
столько хайпа из за ничего ($null)
Это не хайп, это попытка разобраться в способах применения и результатах выполнения действий с "ничего"
Не хочется ведь наступать на одни и те же грабли... снова и снова...
И всем почитать будет полезно, ведь в изменяемой постоянно документации так "подробно", "доходчиво" и авторитетно всё расписано, что неизбежные ошибки попросту гарантированы...
0
㊙️
 Аватар для Fors1k
1316 / 244 / 57
Регистрация: 10.08.2018
Сообщений: 574
26.04.2021, 16:57
Цитата Сообщение от YuS_2 Посмотреть сообщение
Это уже ближе к телу... т.е. документация таки
Еще раз :)

Цитата Сообщение от YuS_2 Посмотреть сообщение
А? Не? Всё равно будешь при сравнении коллекции с $null, помещать $null в левую часть? Бог в помощь, как говорится...
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cls
$a = 1, 2, $null, 4, $null, 6
 
write-host "Переменная а - это null?" -fore Cyan
 
if($a -eq $null)
{write-host "Переменная а - это null!" -fore Red}
else
{write-host "Переменная а - это не null, а массив из $($a.count) элементов" -fore Green}
 
write-host "`nА если проверить так, как сказано это делать в документации?" -fore Cyan
 
if($null -eq $a)
{write-host "Переменная а - это null!" -fore Red}
else
{write-host "Переменная а - это не null, а массив из $($a.count) элементов!" -fore Green}
OutputПеременная а - это null?
Переменная а - это null!

А если проверить так, как сказано это делать в документации?
Переменная а - это не null, а массив из 6 элементов!

Бог помог, спасибо) *посмотреть в документацию*
Не знаю как еще объяснить... Надеюсь код, приведенный выше уже все прояснит.
Ты правильно говоришь, что коллекцию надо помещать слева. Но только return от такого действия будет не булен, а массив.
Нам для ифа что нужно? Булен или массив? Если нам вернут массив, то дальше решение от ифа - радном. В плане, что оно будет зависеть от количества элементов. Если один, и он будет "" или 0 или $null, то получим фолс. Иначе - тру.
Мы так не проверяем равенство, а просто делаем выборку из массива. Если после эту выборку ожидает if, то "будь что будет".

Как раз по этой причине в документации, и в "очень документации" сказали, что если мы хотим узнать является переменная "ничтожеством", или живой коллекцией(либо еще чем-то), то $null должен быть слева.
Следуя этой рекомендации, мы даже здесь $null -eq @($null) получим правильный фолс, так как строго говоря "ничто" -это не тоже самое, что и существующий объект System.Array, имеющий свойства и методы.

Цитата Сообщение от alhaos Посмотреть сообщение
столько хайпа из за ничего ($null)
Тема null важна и весьма интересна.
Я вообще люблю такие дискуссии, особенно с YuS_2
Можно узнать много полезного, и в целом познавательно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2021, 16:57

Какой алгоритм сортировки сравнениями признается лучшим и наиболее эффективным?
Какой алгоритм сортировки сравнениями признается лучшим и наиболее эффективным? 1. Сортировка вставками 2. Сортировка деревом ...

Ввести с клавиатуры строку. Найти шаблон во введенной строке (поиск подстроки в строке)
Помогите написать программу. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку - шаблон. Найти шаблон во введенной строке....

Поиск подстроки в строке
Доброго времени суток, Всем! Подскажите, имеется строка, содержащая текст ("stamp good warm good drop"), найти в этой строке слово...

Поиск подстроки в строке
Как можно найти конкретную подстроку в строке? str pos сюда не подходит, так как ищется не подстрока с определенным значением, а подстрока...

Поиск подстроки в строке
Ассемблер, робота со строками. Ребята, нашел исходник проги, находящей подстроку в строке, но не пашет В чем проблема - не понимаю. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru