2014-09-03 4 views
0

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

set Area {23401 23402 23403} 
    foreach Item $Area { 
     set ElExist [info exist ${Item}lst] 
     if {$ElExist == 0} { 
     set ${Item}lst {}; 
     lappend ${Item}lst $TotalRecords 
     } else { 
     lappend ${Item}lst $TotalRecords 
     } 
     set CurrentOptinon [llength ${Item}lst] 
    } 
+0

Эту проблему трудно понять, что вы пытаетесь сделать. Можете ли вы добавить дополнительную информацию, например, некоторые фиктивные существующие переменные, и что вы ожидаете получить, т. Е. Какие массивы/списки? – Jerry

+1

'lappend' создаст новую переменную, если имя var не существует. Если ваше намерение проверить, существует ли переменная или нет, для чего-то еще, вы можете ее сохранить. Иначе вы можете удалить его. Но ваш вопрос непонятен. – Dinesh

ответ

1

Если бы я писал этот код, я бы сделал это так:

set Area {23401 23402 23403} 
foreach Item $Area { 
    upvar 0 ${Item}lst lst 
    lappend lst $TotalRecords 
    set CurrentOptinon [llength $lst] 
} 

Это будет вести себя так же, как ваш код, но это гораздо короче. Вот трюки в использовании:

  1. lappend создает переменную, если она еще не существует.
  2. upvar 0 делает локальный псевдоним переменной. Настолько проще.
  3. Псевдоним устраняет потребность в магии с llength, но в противном случае вы могли бы сделать:

    set CurrentOptinon [llength [set ${Item}lst]] 
    

    Синтаксис $ во многом просто укороченные для вызова версии с одним аргументом set, который читает названную переменную. За исключением случаев, когда вы пишете set, вы можете использовать подстановки в имени переменной. Как правило, если вы широко используете имена переменных в переменных без сглаживания, вы, вероятно, делаете что-то неправильно (если вам действительно не нужно имя ).

  4. Вы используете странные имена переменных. Намного лучше будет массив.

    set Area {23401 23402 23403} 
    foreach Item $Area { 
        lappend lst($Item) $TotalRecords 
        set CurrentOptinon [llength $lst($Item)] 
    } 
    

    Однако, скорее всего, вам потребуется изменить код в другом месте.

+0

Я хочу поблагодарить вас за то, что вы всегда были так полезны. Вы всегда так быстро отвечали на все, когда мне нужна помощь с любым TCL. Вопрос: Ваша электронная почта все еще [email protected]? Я нашел это в сообществе TCL. – CK1

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