TCL 세 연산자의 한계 탐색

8101 단어 Tclexpr
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 ;
대입과 계산의 공식을 만들 수 있습니다.TCL
set 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";
이 부분을 이해하는 게 여기 주제예요.
  • TCL에서\$var은 명령을 실행하기 전에 내용을\$var로 바꿉니다.
  • TCL의 기본 단어는 변수 이름, 명령 이름, 숫자, 따옴표로 둘러싸인 문자열입니다.
  • 위의 규칙에서 expr$s1=\$2.expr11=@@입니다. 아래 규칙을 위반했기 때문에 invalid라고 합니다.나는 아마도 이렇게 수정할 것이라고 생각한다. 결과도 모두 같다.
    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
    
    총결산
  • 본질적으로expr는 문자열을 처리할 수 있습니다.?의 전후는 어디에나 놓을 수 있다.
  • expr은 독특한 분석기로 입력 파라미터를 분석한다.이때 쌍과탈을 제거할 수 있다.무조건 다 가져가는 건 아니야.
  • 파사는 문자열이 더블 쿼터로 둘러싸여 있기를 기대했지만, 이것은 정확하지 않았다.
  • 2항과 3항 사이에 일치성이 없는 것 같다.따라서 expr 문자열을 주지 않는 것이 좋습니다.
  • 끝맺다gm300

    좋은 웹페이지 즐겨찾기