- это арифметическое расширение, связанное с IFS каким-либо образом?

Для перестановок я использую следующий скрипт perl для генерации перестановок:

#!/usr/bin/perl
use strict;
use Algorithm::Permute;

my $q=shift or die("usage permgen n word-set\n");

my $p = new Algorithm::Permute([@ARGV],$q);
while (my @res = $p->next) { 
  print @res,"\n"; }

Это можно использовать для создания перестановок из очень разных наборов. Пример unicode dices:

permgen 2  ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ | shuf -n 2
⚅⚄
⚅⚁

Чтобы сгенерировать ваш (ОГРОМНЫЙ) пример, нам нужно написать: permgen 5 {a..z} {0..9}

На моей старой машине для генерации 1_000_000 перестановок требуется 2с

time permgen 5 {a..z} {1..9}| head -1000000| wc

1
25.07.2018, 09:09
1 ответ

Результат арифметического расширения без кавычек подвергается подстановке имени файла (расширению с подстановочными знаками )и разбиению поля слова (), как и любому другому расширению без кавычек . Это довольно бесполезно, и несколько оболочек не делают этого, но это то, что делали исторические оболочки (, потому что это было легче реализовать ), и поэтому это то, что стандартизировал POSIX.

Результатом арифметического расширения является просто строка из -и цифр, поэтому она никогда не может содержать подстановочный знак. (Некоторые оболочки имеют числа с плавающей запятой и могут также включать ., +и буквы. )Поскольку он не может содержать пробелы, он также обычно не подлежит разделению полей. Однако разделение полей можно настроить с помощью IFS:, разделителями полей являются символы IFS. Включение цифр в IFSкрайне редко и довольно глупо,но если вы хотите написать полностью надежный код, вам необходимо защититься от этого. Это имеет большее значение, если результат может быть отрицательным, потому что включение тире в IFSне так глупо.

POSIX указывает, что при запуске оболочка должна установить для IFSзначение по умолчанию, чтобы на сценарии не влияло значение IFS, которое может быть в среде. (Экспортировать IFSне принято, но кто-то может это сделать. )Однако некоторые широко распространенные оболочки (dash, Busybox sh )сохраняют любое значение IFSв среде, поэтому надежный сценарий оболочки должен явно устанавливать IFSна значение по умолчанию (или сбрасывать это, что имеет тот же эффект ), если оно содержит какое-либо расширение без кавычек.

4
27.01.2020, 23:18

Теги

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