TCL 세 연산자의 한계 탐색
TCL은 Tool command lange라는 해석기 언어입니다.C는 다른 언어로 확장 세트를 간단하게 불러올 수 있습니다.
대학에서 학생들이 프로그램을 쓰는 사용자 인터페이스의 질을 높이기 위해 대학 교수가 크리스마스 연휴에 이 글을 썼다.
문법 해석의 수정 없이 확장할 수 있지만 초보자는 미묘한 부분에서 글을 쓰는 것을 고민한다.확장은 C 등 언어로 작성된 프로그램 라이브러리입니다.확장 부분은 일반적인 TCL 스크립트에서 호출할 수 없는 동작을 추가할 수 있습니다. 예를 들어 모든 시스템 호출 (fork), 저급 장치 조작, TCL 변수 접근 등입니다.
초보자뿐만 아니라 전문가들도 때때로 문자열 처리를 고민한다.여기에 언급할 세 가지 연산자의 경계도 문자열과 관련이 있다.
TCL에서 문자열의 대입은 따옴표 없이 사용할 수 있습니다.
set a ZZZZ
하지만if문에는 인용부호가 필요합니다.if {$a == "ZZZZ"} {
이런if문의 불가사의한 제약의 탐색은 개발자가 저술한 교과서류의 책에도'필요해요. 이상'이라는 설명이 있으니 포기하세요.또 다른 불가사의한 제약이 있습니까?있죠. 3항 연산자는
다른 언어도 있어요.
a?b:c
만약 a가 진짜이고 b, a가 가짜라면 c는 진짜이다.많은 언어들이 기본 문법으로 정의하고 TCL에서는 expr 명령을 받는 문자열로 처리합니다.
이른바 expr
이 명령만이 일반적인 의미에서 계산할 수 있다.예외는 set 명령을 통해if문장에 대입하는 논리 연산입니다.C 등 중
a = b + c * d ;
대입과 계산의 공식을 만들 수 있습니다.TCLset a [expr $b+$c*$d]
이렇게 써.TCL의 경우 expr로 계산하고 set을 사용하여 결과를 대입합니다.먼저 진행된expr 부분은 []로 묶는다.expr의 실행에 따라 [expr...]expr의 결과를 바꿉니다.expr의 계산 결과가 0이면 0입니다.천칙천.문자열이면 문자열입니다.set [set t [expr [string length [file extention $fn]]*10]+[
이렇게 [층급화된 경우도 종종 발생한다. 한 줄로 압축하기 위해서는 먹는 방법이 효과적이지만, 한 줄로 압축하는 데 시간이 걸리면 TCL 세계도 환영받지 못한다.]그게 뭐가 문제야?
결론은'기대했던 것처럼 문자열을 사용할 수 없다'는 것이다..
그럼 우리 정식으로 공연하러 갑시다.
set temp [ 1 == 2 ? 11 : 99 ]
puts $temp
프로그램 같지는 않지만 문제 없어요.a의 값은 99이다.많은 언어에서, 위의 코드는 공백을 무시했다set temp [1==2?11:99]
puts $temp
같다변수를 사용합니다.set n1 22 ; set n2 33
set temp [expr $n1 == $n2 ? 11 : 99 ]
puts $temp
set c1 11 ; set c2 99
set temp [expr $n1 == $n2 ? $c1 : $c2 ]
puts $temp
프로그램 같기도 하고.결과는 모두 99였다.TCL에서 변수의 유형이 촘촘하지 않기 때문에 아래와 같이 따옴표로 묶어도 같은 느낌을 받을 수 있다.TCL에는 사용자가 인식할 수 없는 유형도 있지만 이는 또 다른 기회입니다.
set temp [expr $n1 == $n2 ? "11" : "99" ]
puts $temp
set temp [expr $n1==$n2?"11":"99"]
puts $temp
결과가 같다.99.디자인이 안 좋으면 이것도 가능한가요?
set s1 ii ; set s2 @@
set temp [expr $s1 == $s2 ? $c1 : $c2 ]
puts $temp
그런데 이게 잘못된 거예요.invalid bareword "ii"
in expression "ii == @@ ? 11 : 99";
이 부분을 이해하는 게 여기 주제예요.set temp [expr ${s1} == ${s2} ? $c1 : $c2 ]
set temp [expr ($s1 == $s2) ? $c2 : $c2 ]
set temp [expr $s1==$s2?$c1:$c2 ]
이미 방법이 없나요?네.3가지 연산자에 문자열을 사용하는 방법(1)
안녕히 계세요.결과는 실망스러울 것이다.
set s1 \"ii\" ; set s2 \"@@\"
set temp [expr $s1 == $s2 ? $c1 : $c2]
puts $temp
이렇게 하면 99를 잘 할 수 있다.그럼, 반대로?결말이 어때요?앞과 뒤가 똑같이 바뀌어 결과가 같다.그리고 마지막 것만 OK
set temp [expr ($n1 == $n2) ? $s1 : $s2 ]
puts $temp
예.@@
....저기요.나는 좀 이상하다고 생각한다.set s2 @@
set s2 \"@@\"
같은 건가요?자세히 볼게요.puts $s2
if { [expr ($n1 == $n2) ? $s1 : $s2 ] == $s2 } {
puts "same"
} else {
puts "different"
}
puts [string length $s2]
이렇게 하면"@@"
diff
4
"@@"의 길이가 다르기 때문에 따옴표도 문자열의 일부분입니다.expr 자체 파티가 있을 예정입니다.그것은puts [expr 1*2]
puts 1*2
expr은'1','*','2'세 개의 영패를 식별할 수 있기 때문에puts는 1*2라는 영패만 식별할 수 있다.puts [expr 2]
puts [expr "2"]
puts [expr 1*2]
puts [expr "1*2"]
puts [expr [expr \"1*2\"]]
puts [expr \"1*2\"]
따옴표로 묶은 것도 틀릴 수 있을 것 같지만 마지막을 제외하고는 모두 2로 바꾸는 것이 편리하다.결국 따옴표가 없는'1*2'가 돼 헛수고를 하고 싶다면 위와 같이 할 수 있다.다음은 더 많은 질병의 예이다.모두 오류가 발생했습니다.
expr \"2
expr \'2\'
expr \"\"2\"\"
3가지 연산자에 문자열을 사용하는 방법(2)set s1 ii ; set s2 @@ ; set c1 11 ; set c2 99 ;
set temp [lindex [list $c1 $c2] [expr \$s1 != \$s1]]
puts $temp
어?이 차 대체 뭐야?하지만 expr이 문자열을 처리할 수 없는 것은 아니라는 것을 알고 있습니다.단지 약간의 결함이 있을 뿐이다.3가지 연산자에 문자열을 사용하는 방법(3)
?앞에서 문자열을 지정하는 방법은 다음과 같습니다.목록을 만들고 이 요소의 첫 번째 요소와 두 번째 요소에 접근합니다.
set s1 ii ; set s2 @@ ; set c1 11 ; set c2 99 ;
set temp [lindex [list $s1 $s2] [expr $c1==$c2?0:1]
puts $temp
세 개의 연산자가 요구하는 것이 무엇인지에 따라 두 개부터 선택하는 것이 아니라 더 많은 것부터 선택하는 것이다.또 이렇게 쓸까?여기에 구애받지 않는다면 아래처럼 조금 짧게 할 수 있다.하지만 시도==필요했어
set temp [lindex [list $s1 $s2] [expr $c1!=$c2]]
puts $temp
총결산Reference
이 문제에 관하여(TCL 세 연산자의 한계 탐색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gm300a/items/22457045cd41bd360bd4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)