Невозможно правильно использовать объединение Perl для добавления чего-либо к каждому вхождению - ошибка "Найден массив, где оператор ожидался в"

«Когда на нее ссылаются» означает «когда она используется», т.е. контекст указывает, что значение переменной следует интерпретировать как число:

$ i=Hello
$ echo ${i}
Hello
$ echo $((i + 1))
1

Здесь iявно содержит строку, но поскольку она используется в арифметическом выражении, она интерпретируется как арифметическое выражение. Если Helloздесь не установлено или равно null, тогда оно становится равным 0; вы можете попробовать поиграть с разными значениями для iи Hello, чтобы увидеть эффекты (i=1+1, Hello=Helloи т. д. ).

Переменные с целочисленным атрибутом, т. е. переменные, объявленные с использованием declare -i, приводятся к целым числам при присвоении, а не при использовании:

$ declare -i i
$ i=Hello
$ echo ${i}
0

Обратите внимание, что во всех этих случаях не сообщается об ошибках.

Целочисленные -атрибутивные переменные могут использоваться с арифметическими выражениями без синтаксического сахара:

$ declare -i i
$ i=3+4
$ echo ${i}
7

, что является прямым следствием того, что их присваивания интерпретируются как арифметические выражения.

1
28.08.2019, 18:49
2 ответа

Если вы хотите, чтобы каждый элемент был заключен в круглые скобки, а также в кавычки, вы можете просто добавить их в существующий блок map, т.е. заменить

map{qq/"$_"/}

по

map{qq/"($_)"/}
0
28.01.2020, 00:01

Вы не хотите соединять элементы массива с помощью (,-, что поместит (,между каждым элементом @uuids.

Вам просто нужно напечатать (перед соединением и )после него.

Например, используяprintf:

$ perl -ne '
  chomp;
  if(s/^.*UUIDs in this bucket //) {
    @uuids=split(/,/);
    printf ",(%s)", join ",",map{qq/"$_"/} @uuids;
  }' eligible_uuids_final_app1.txt
,("8501792126581991569","8073766106536916628","4830289023695906800","6135982080116553120","8306484440313978157","9040948912536460872","8471856544054164043","5431263453539111247","7661719762428556576"),("6501792126581991569","8073766106536916628","4830289023695906800","6135982080116553120","8306484440313978157","9040948912536460872","8471856544054164043","5431263453539111247","7661719762428556576")

(переводы строки добавлены к одному -лайнеру, чтобы сделать его читабельным)

Я не уверен, нужна ли вам ведущая запятая внутри (...)или снаружи. Я предположил первое. При необходимости измените строку формата printf.

Вы можете добавить новую строку (, например.printf ",(%s)\n",....;).

0
28.01.2020, 00:01

Теги

Похожие вопросы