2015-01-21 3 views
0

variable을 사용하는 적절한 방법은 달러 기호의 유무와 상관없이 무엇입니까? $와 (다른 모든 경우에

set var 10 

variable이 언급 또는 사용 (그러나 선언되지 않음) 때 적절한 구문 $variable이다 : 나는 variable ($없이) (배쉬 유사) variable 선언시에만 사용됩니다 생각) :

set newVar $var 
puts $var 
puts $newVar 

그러나 나는 그것을 교환하고이 코드가 작동하는지 보인다 코드를 발견

# using argv 
if {[array exists argv]} { 
    puts "argv IS ARRAY" 
} else { 
    puts "argv IS NOT AN ARRAY" 
} 

# using $argv 
if {[array exists $argv]} { 
    puts "\$argv IS ARRAY" 
} else { 
    puts "\$argv IS NOT AN ARRAY" 
} 

# using argv 
if {[string is list argv]} { 
    puts "argv IS LIST" 
} else { 
    puts "argv IS NOT LIST" 
} 

# using $argv  
if {[string is list $argv]} { 
    puts "\$argv IS LIST" 
} else { 
    puts "\$argv IS NOT LIST" 
} 

출력 :

회신 연구를 더욱 저를 지적하고 나는 TCL은 "자체 수정 코드의 일종을하고있는 것으로 나타났습니다 : 회신

argv IS NOT AN ARRAY 
$argv IS NOT AN ARRAY 
argv IS LIST 
$argv IS LIST 

편집 잭맨 @glenn하기 "또는 정확한 이름이 무엇이든간에 예 :

% set variableName "x" 
x 
% puts $x 
can't read "x": no such variable 
% set $variableName "abc" 
abc 
% puts $x 
abc 
% puts [set $variableName] 
abc 
% 
% 
% 
% 
% 
% 
% set x "def" 
def 
% puts $x 
def 
% puts [set $variableName] 
def 
% 

이제 답이 문제가 될 수 있지만 한 가지 질문이 남아 있습니다. 이 문서에서 발췌 한 것입니다

set varName ?value? 
array exists arrayName 

문서는 모두 기능이 variable 대신 $variable 기대 즉 변수 이름 (값을) 기대했다. 그래서 위의 자체 수정 코드를 기반으로 가정하면 variable 대신 $variable을 전달하면 변수 치환이 발생합니다 (정확히 위의 코드와 동일). 하지만 $variable에 배열이 아닌 목록 (테스트 중 내 인수는 param0 param1 "param 2"param3)이 아닌 무언가가 포함 된 경우 어떻게됩니까? 이 관점에서 $argv IS LIST이라는 출력이 잘못되었습니다. 내가 여기서 무엇을 놓치고 있니? 회신

편집 @schlenk합니다 :

마지막으로 I (희망)이 문제를 이해합니다. TCL에 대해 great article을 발견했습니다.이 문제는 (뿐만 아니라)이 문제를 설명합니다. 내가이 글에서 몇 가지 현명한 문을 정확히 보자 : 문자열을 조작 을의 명령에 달려 무엇을 나타내는 지 티클에서

  • 합니다.
  • 모든 것이 Tcl의 명령입니다. 알 수 있듯이 지정 연산자가 없습니다.
  • if은 두 개의 인수가있는 명령입니다.
  • 명령 이름은 특수한 형식이 아니라 단지 문자열입니다.

는 또한 following SO answer이 문 확인 :

"티클에서를, 값은 ... 그들이 지정된 형식으로 사용할 수 있는지 여부이다 질문 유형이 없습니다." 명령 string is integer $a 의미 :

  • "나는 정수 "

  • NOT"$a 정수의 값이므로 $a의 값을 사용할 수 "

  • "모든 정수는 (하나 개의 요소)도 유효한 목록 ... 그 중 하나를 사용 할 수 있고 (정수에 대한 여러 다른 것 같이). "

나는 믿을 모두 문자열 명령이 true를 돌려줍니다 그래서

% set abc "asdasd" 
asdasd 
% string is list $abc 
1 
% string is alnum $abc 
1 

string is list 반환 한 $abc은 문자열이고 또한 하나 개의 요소 목록 등 대부분의 튜토리얼에서 조각을 다음을 선언하고 목록 작업의 적절한 방법이라고이 있다고합니다 때문에 : 같은 string is list 명령에도 적용됩니다 :

% set list1 { 1 2 3 } 
% lindex $list1 end-1 
2 

그러나 TCL의 모든 것이 문자열 일 때 다음이 내 경험에서 작동합니다 (잘못된 경우 제발 제발).

% set list2 "1 2 3" 
1 2 3 
% lindex $list2 end-1 
2 
+0

읽기 티클 대체 규칙을. 먼저 현재의 명령을 실행하기 전에 인수를 그룹화 한 다음 변수와 명령을 대체합니다. – schlenk

+0

@schlenk 나는 몇 번이나 해왔지만 아직 그 요점을 놓치고있다. 죄송합니다. –

답변

1

알아 두어야 할 중요한 점은 Tcl의 $x은 명령 set x의 구문 설탕이라는 것입니다. 따라서 Tcl 코드의 $x을 같은 장소의 [set x]에 번역하면 어떤 일이 발생하는지 볼 수 있습니다.

다른 중요한 사항은 변경할 수없는 값입니다. Tcl 값은 변경할 수 없으므로 변경할 수 없습니다. 새로운 변경 값을 만들 수 있습니다. 하지만 변수 안에 저장된 값을 변경할 수 있습니다.

이것은 변수 이름을 취하는 명령과 값을 취하는 명령의 차이점입니다. 명령이 변수에 저장된 값을 변경하려면 변수 이름을 사용합니다. 예 : lappend, lset, append 등입니다. 다른 명령은 새로운 값을 반환하고 인수로 값을 취합니다. 예를 들면 lsort, lsearch, lindex이 있습니다.

또 다른 중요한 점은 실제로 목록 유형이 없다는 사실입니다. 목록과 같은 문자열이 있습니다. 이것이 Tcl의 string is list 테스트입니다. 이것은 몇 가지 결과를 낳습니다. 문자열 리터럴이나 항목 목록이있는 경우 항상 동일 할 수 있으므로 항상 결정할 수는 없습니다. 예 주어진 : 이미 글렌에 의해 demonstracted로

% set maybe_list a 
% string is list $maybe_list 
1 

는 변수 Tcls 거의 무제한 이름이 결합 그리고 당신이 정말로 혼란스러워 할 수 있습니다. 예를 들어, 이러한 모든 유효한 Tcl의 변수 이름은, 당신은 단지 $ 바로 가기로 그들 모두를 사용할 수 없습니다 (남성은 Tcl에서)

% set "" 1  ;# variable name is the empty string 
1 
% puts [set ""] 
% set " " 1  ;# variable name is just whitespace 
1 
% puts [set " "] 
1 
% set {this is a list as variable name} 1 ;# a variable with a list name 
1 
% puts [set {this is a list as variable name}] 
1 
% set Δx 1 
1 
% incr Δx 
2 
% puts [set Δx] 
2 
+0

고맙습니다. 자세히 조사하겠습니다. –

2

명령에 따라 다릅니다. 일부 Tcl 명령은 변수의 내용을 수정해야 할 경우 변수 의 이름이이어야합니다. 일부는 다음과 같습니다

  • foreach는
  • lappend
  • 증분 대부분은 그러나 확실하게 모든 명령은 변수의 을 할

을 설정합니다.

매개 변수가 포함하면 당신이 볼 수있는 관련 명령에 대한 documentation을 확인해야합니다 "변수 varName"(또는 "dictionaryVariable"), 또는 매개 변수로 명명하는 경우 "문자열", "

,745 : 등


변수 varName 인수를 info exists 사용 예 목록 "

% set argv {foo bar baz} 
foo bar baz 
% info exists argv    ;# yes the variable "argv" exists 
1 
% info exists $argv    ;# no variable named "foo bar baz" 
0 
% set {foo bar baz} "a value" ;# create a variable named "foo bar baz" 
a value 
% info exists $argv    ;# so now that variable exists 
1 
+0

도움 주셔서 감사합니다. 언급 한 문서를'tclsh'에서 직접 호출 할 수 있는지 물어봐도 될까요? –

+0

질문을 이해할 수 없습니다. –

+0

필자는 [documentation] (http://www.tcl.tk/man/tcl8.6/TclCmd/contents.htm)에 대한 "도움말"또는 perl "perldoc"과 같은 설명서 페이지가 있는지 묻습니다. 네가 언급 한거야? 제가 알고있는 유일한 것은'남자 Tcl'입니다. 기본 목표는 인터넷 연결없이 명령 줄에서 사용할 수 있도록하는 것입니다. 감사합니다 –

관련 문제