2013-10-02 2 views
2

У меня есть список с именем «а» и необходимо выполнить некоторые базовые операции списка и команды, чтобы получить желаемый результат в другом списке «Ъ»Список Tcl выход модификация

Этот список «а» может содержать больше элементов любой заказ я показал пример ниже

(%) set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno} 

{{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]} mno} 

в настоящее время, я попытался это и получил

(%) set b "" 
(%)  
(%) foreach l $a { 
     lappend b [regsub -all [lindex $l 0] $l ""] 
    } 
(%) puts $b 

{{p_q[5]}} {{r_s[6]}} {} 

Вместо этого я хочу «Ъ», чтобы иметь выход следующим

p_q[5] r_s[6] mno 

Tcl версия: 8.4.6

+0

Что вы хотите архивировать? Смешивание списков и строк никогда не является хорошей идеей. Вы используете $ l as list ('lindex $ l 0') и как строка' regsub ... $ l' –

+0

@Johannes Kuhn: Я хочу получить вывод для списка b, как написано в моей последней строке вопроса, то есть ожидается.В следующий раз я постараюсь не смешивать списки и строки – user2643899

+0

@ user2643899, если какой-либо ответ поможет и удовлетворит вопрос. Существует возможность принять ответ. –

ответ

1

Так вот опять один лайнер для вас:

% set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno} 
    {123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno 
% set b [lsearch -all -regexp -not -inline [regsub -all "\{|\}" $a ""] ":"] 
{p_q[5]} {r_s[6]} mno 

Если в дальнейшем вы хотите удалить {}, то

%set b [regsub -all "\{|\}" $b ""] 
1

Вот один из возможных решений, если я понимаю вашу проблему правильно:

set a {{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno} 
puts $a 

set b [list] 
foreach item $a { 
    lappend b [lindex $item end] 
} 
puts ">$b<" 
set b [concat {*}$b] 
puts ">$b<" 

Выход:

{123.4:xyz {p_q[5]}} {123.4:abc {r_s[6]}} mno 
>{p_q[5]} {r_s[6]} mno< 
>p_q[5] r_s[6] mno< 

Обсуждение

  1. Цикл проходит через каждый элемент в списке a
  2. Для каждого элемента, выбрать последний подпункт и добавить его в b
  3. После выхода из списка, b почти то, что вы хотите (см вторую строчку в выход)
  4. Звонок на concat исправит это по вашему вкусу.

Update

Донал Fellows отметил, что вместо того, чтобы использовать [concat {*}$b], я могу использовать [join $b]. Такой подход имеет несколько преимуществ, которые мне нравятся:

  • Он работает на старых 8.4 системах, которые не поддерживают {*} конструкцию
  • Это проще понять

Однако в concat подход дает преимущество: скорость. Посмотрите на следующей интерактивной сессии:

(Downloads2) 61 % set b {{p_q[5]} {r_s[6]} mno} 
{p_q[5]} {r_s[6]} mno 
(Downloads2) 62 % time {concat {*}$b} 10000 
0.43452700000000005 microseconds per iteration 
(Downloads2) 63 % time {join $b} 10000 
0.603005 microseconds per iteration 

concat скорость составляет около 30% быстрее, чем join в этом случае.

+0

Какую версию tcl вы используете, потому что я попробовал тот же самый код, который у вас есть, и я получаю следующую ошибку: – user2643899

+0

{123.4: xyz {p_q [5]}} {123.4: abc {r_s [6]}} mno > {p_q [5]} {r_s [6]} MnO < дополнительных символы после близкой скобки при выполнении "установлен б [CONCAT {} $ B] пут "> $ B <" " (файл Строка «t.tcl» 9) – user2643899

+1

Вместо '[concat {*} $ b]' вы можете использовать '[join $ b]', чтобы удалить фигурные скобки. Это работает и с 8.4. –

Смежные вопросы