Сделать сортировку встроенной функцией

gnu make https://www.gnu.org/software/make/manual/make.html#toc-Functions-for-Transforming-Text имеет функцию сортировки. В описании функции сортировки указано, что функция сортировки

Sorts the words of list in lexical order, removing duplicate words. The output is a list of words separated by single spaces.

Я создал тестовый make-файл, подобный этому

TEST = "this is a test test test test test"

all:

     @echo $(sort $(TEST))

Мой вывод это пробный тест

Дубликаты не были полностью удалены из строки! Я неправильно интерпретирую функцию сортировки? Или это ошибка в gnu make?

Исправление переменной TEST: «Это тестовый тест, тест, тест».

imendel 21.02.2019 17:23

Обратите внимание на двойные кавычки. "This is a test test test test" становится "This is a test test", которое оболочка печатает как This is a test test.

Beta 21.02.2019 17:28

...Странно, что sort не сортирует строку в кавычках, но удаляет из нее дубликаты...

Beta 21.02.2019 17:30

Ваша переменная TEST содержит 5 разных слов: "this, is, a, test и test". И только слово test дублируется.

Renaud Pacalet 21.02.2019 17:39

Согласен, что тест дублируется. Но есть 3 дубликата. Если бы у меня была строка «тест, тест, тест, тест» и я хотел бы удалить дубликаты, я бы подумал, что результатом будет строка «тест», вы согласны?

imendel 21.02.2019 19:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
212
1

Ответы 1

В двойных кавычках нет ничего особенного. Таким образом, переменная TEST содержит слова "This, is, a, test, test, test и test", которые затем сортируются с удалением дубликатов как "This, a, is, test и test", и, таким образом, оболочка получает (1) echo "This a is test test", интерпретирует двойной кавычки в качестве строковых маркеров и выходов This a is test test (а не This is a test test см. место a).


(1) Полезный совет по отладке подобных проблем с make — установить для переменной SHELL значение /bin/echo, чтобы вы могли видеть, что получает оболочка. Например, у вас было бы в результате -c echo "this a is test test" с Makefile

TEST = "this is a test test test test"
SHELL=/bin/echo
all:
    @echo $(sort $(TEST))

Спасибо за указание на позицию А. Но рассмотрим строку «тест тест тест тест». Разве вы не ожидаете, что функция сортировки удалит дубликаты и результат будет контрольная работа, а make выдаст результат тест тест тест. Каково тогда определение дубликаты в функции сортировки?

imendel 21.02.2019 18:58

AProgrammer пытается указать вам, что сделать не делает ничего особенного с двойными кавычками. Итак, первое «слово» в переменной TEST — это литеральная строка "this (включая двойные кавычки). Точно так же последнее слово в переменной — это литеральная строка test" (включая двойные кавычки). Строка-литерал test" не совпадает с строкой-литералом test, поэтому make не удалит ее как дубликат. Точно так же при сортировке литеральной строки "this двойные кавычки сортируются раньше, чем все буквенные символы, так что слово остается в начале результата.

MadScientist 21.02.2019 19:15

Затем, когда вы передадите это echo через оболочку, оболочка удалит двойные кавычки, чтобы вы их не видели. Если бы вместо этого в вашем рецепте использовались одинарные кавычки вокруг результата, например: @echo '$(sort $(TEST))', то вы бы увидели, что двойные кавычки все еще там: make не удалял их и не анализировал их каким-либо образом. Это просто строка, чтобы сделать.

MadScientist 21.02.2019 19:17

Спасибо за разъяснения. Я понял.

imendel 21.02.2019 19:24

@imendel, если у вас «понятно», отметьте ответ, чтобы мы знали, что он решен :)

code_fodder 22.02.2019 10:30

Другие вопросы по теме