为什么我的变量中的特殊字符在TCL中执行lindex时会消失?

时间:2016-05-15 05:10:36

标签: list tcl

我的应用程序中有一个列表,我正在处理..它基本上是这样的:

public void processRecord(Record record)
{
    if(record.getSid()==RowRecord.sid){
        newrowrec = (RowRecord) record;
        System.out.println("new ROW NUMBER : "+ newrowrec.getRowNumber());
        System.out.println("new LAST ROW NUMBER : "+ newrowrec.getLastCol());
    }
    switch (record.getSid())
    {
        case BOFRecord.sid:
            BOFRecord bof = (BOFRecord) record;
            if (bof.getType() == bof.TYPE_WORKBOOK)
            {
                System.out.println("Encountered workbook");
                // assigned to the class level member
            } else if (bof.getType() == bof.TYPE_WORKSHEET)
            {
                System.out.println("Encountered sheet reference");
            }
            break;
        case RowRecord.sid:
            RowRecord rowrec = (RowRecord) record;
            System.out.println("Row found, first column at "
                    + rowrec.getFirstCol() + " last column at " + rowrec.getLastCol());
            break;
        case NumberRecord.sid:
            NumberRecord numrec = (NumberRecord) record;
            System.out.println("Cell found with value " + (long)numrec.getValue()
                    + " at row " + numrec.getRow() + " and column " + numrec.getColumn());
            rowlist.add(String.valueOf((long)(numrec.getValue())).toLowerCase());

            if(numrec.getColumn()==newrowrec.getLastCol()-1){
                System.out.println("NUMBER ROWLIST: "+ rowlist);
                extractRow(rowlist, newrowrec.getRowNumber());
                rowlist.clear();
            }
            break;

        case BlankRecord.sid:
            BlankRecord blankrec = (BlankRecord) record;
            System.out.println("BLANK VALUE at row: "+ blankrec.getRow() + " at coloumn: " + blankrec.getColumn());
            rowlist.add("null");
            break;
        case SSTRecord.sid:
            sstrec = (SSTRecord) record;
            for (int k = 0; k < sstrec.getNumUniqueStrings(); k++)
            {
                System.out.println("String table value " + k + " = " + sstrec.getString(k));
                    System.out.println("SSTRECORD ROWLIST: "+ rowlist);
            }
            break;          
        case LabelSSTRecord.sid:
            lrec = (LabelSSTRecord) record;
            rowlist.add(sstrec.getString(lrec.getSSTIndex()).toString());
            break;
    }

然后我拿起列表中的第一个成员:

$item = {text1 text2 text3}

在执行此操作时,曾经(例如)lindex $item 0 的text1变为abcdef\12345。 但对我来说,不要失去这个abcdef12345非常重要。为什么它会消失。这些其他字符如\-都不会消失。请注意,我无法事先逃避文本中的>。如果我在使用\操作$item之前有任何我可以做的事情,请建议。

2 个答案:

答案 0 :(得分:1)

问题是\是一个Tcl列表metasyntax字符,与->或任何字母数字不同。在使用lindex(或任何其他列表消耗操作)之前,您需要将字符串转换为正确的Tcl列表。要做到这一点,您需要通过输入数据中的“单词”理解完全 的含义。如果您的输入数据是由单个空白字符分隔的非空白字符序列,则可以使用split进行转换为列表:

set properList [split $item]
# Now we can use it...
set theFirstWord [lindex $properList 0]

如果你有一个不同的分隔符,split需要一个可选的额外字符来说明要分割的内容。 例如,要按冒号(:)进行拆分:

set properList [split $item ":"]

但是,如果您有其他类型的拆分规则,则效果不佳。例如,如果您可以通过多个空白字符进行拆分,那么使用regexp(使用-all -inline选项)进行单词识别实际上更好:

# Strictly, this *chooses* all sequences of one or more non-whitespace characters
set properList [regexp -all -inline {\S+} $item]

您也可以通过多字符序列进行拆分,但在这种情况下,最容易通过将多字符序列映射(使用string map)到单个罕见字符来完成。 Unicode意味着有 lot 这样的字符可供选择......

# NUL, \u0000, is a great character to pick for text, and terrible for binary data
# For binary data, choose something beyond \u00ff
set properList [split [string map {"BOUNDARY" "\u0000"} $item] "\u0000"]

可能会有更复杂的选项,但是当您使用Tcllib中的splitx时就是这样。

package require textutil::split

# Regular expression to describe the separator; very sophisticated approach
set properList [textutil::split::splitx $item {SPL+I*T}]

答案 1 :(得分:0)

在tcl中,可以通过多种方式创建列表:

将变量设置为值列表

set lst {{item 1} {item 2} {item 3}} 

使用split命令

set lst [split "item 1.item 2.item 3" "."] 

使用list命令。

set lst [list "item 1" "item 2" "item 3"] 

可以使用lindex命令访问单个列表成员。

set x "a b c"
puts "Item 2 of the list {$x} is: [lindex $x 2]\n"

这将给出输出:

Item 2 of the list {a b c} is: c

关于提出的问题 您需要像abcdef\\12345

这样定义变量

为了明确这一点,请尝试运行以下命令。

puts "\nI gave $100.00 to my daughter."

puts "\nI gave \$100.00 to my daughter."

第二个会给你正确的结果。

如果您没有更改文本的选项,请尝试将文本保存为花括号,如第一个示例中所述。

set x {abcd\12345}
puts "A simple substitution: $x\n"

输出:

A simple substitution: abcd\12345

set y [set x {abcdef\12345}]

并检查此输出:

puts "Remember that set returns the new value of the variable: X: $x Y: $y\n"

输出:

Remember that set returns the new value of the variable: X: abcdef\12345 Y: abcdef\12345