第二章:IDL语法基础(中篇:字符串与表达式)

标签:
idl开发idl语言基础字符串表达式运算符 |
分类: IDL开发 |
2.3 字符串
1、创建字符串
IDL> a='I am a student'
IDL> help,a
A
IDL> b="I am a student"
IDL> help,b
B
注:如果字符串中包含双引号或者单引号,则需要交替使用,例:
IDL> c="I am a 'student'"
IDL> c
I am a 'student'
IDL> d='I am a "student"'
IDL> d
I am a "student"
另:可以通过直接赋值或者函数strarr创建字符串数组。
IDL> a=['abc','123']
IDL> a
abc
123
IDL> help,a
A
2、字符串连接
通过加号(+)将多个字符串连接称为一个字符串。
IDL> a='I'+'am'+'a'+'student'
IDL> a
Iamastudent
IDL> help,a
A
小技巧:可以利用字符串的连接功能生成一组有规律的字符串,如创建一组文件名,格式为“Day_001.txt、Day_045.txt、Day_225.txt”。
思路:首先生成一个days数组,从1到225,间隔为15.
IDL> days=indgen(16)*15
IDL> fns='Day_'+string(days,format='(i3.3)')+'.txt'
IDL> fns
Day_000.txt
Day_015.txt
Day_030.txt
Day_045.txt
Day_060.txt
Day_075.txt
Day_090.txt
Day_105.txt
Day_120.txt
Day_135.txt
Day_150.txt
Day_165.txt
Day_180.txt
Day_195.txt
Day_210.txt
Day_225.txt
注:strjoin()用于将一个字符串数组连接称为一个字符串。
Result=strjoin(string[,delimiter]),可选参数用于设置连接字符。
IDL> a=['I','am','a','student']
IDL> help,strjoin(a)
IDL> help,strjoin(a,' ')
IDL> help,strjoin(a,'-')
3、字符串操作函数
(1)字符串长度:strlen()
IDL> a= 'I am a student'
IDL> strlen(a)
IDL> help,strlen(a)
(2)字符串大小写:
strupcase( )将所有的英文字母改写为大写;
strlowcase( )将所有的英文字母改写为小写;
IDL> a= 'I am a student'
IDL> b=strupcase(a)
IDL> b
I AM A STUDENT
IDL> help,b
B
IDL> c=strlowcase(b)
IDL> c
i am a student
IDL> help,c
C
(3)字符串移除空格:strcompress( )用于移除字符串变量中的空格。
IDL> a='0
IDL> a
0
IDL> b=strcompress(a)
IDL> b
0 1 2 3 4 5
IDL> c=strcompress(a,/remove_all)
IDL> c
012345
注意:默认情况将连续的空格压缩为一个空格,设置/remove_all关键字后删除字符串中的所有空格。
另:strtrim(str,flag)函数用于移除字符串变量中两端的空格;参数flag用于设置移除哪些空格,0表示移除右端,1表示移除左端,2表示移除两端。
IDL> a='
IDL> help,a
A
IDL> help,strtrim(a,0)
IDL> help,strtrim(a,1)
IDL> help,strtrim(a,2)
(4)字符串比较:strcmp(str1,str2 [,n],/fold_case)用于对两个字符串进行比较,相同返回1,否则返回0;n表示比较的前几位,/fold_case表示不区分大小写。
IDL> strcmp('abcdef','abc123',3)
IDL> strcmp('abcdef','abc123')
IDL> strcmp('abcdef','Abc123')
IDL> strcmp('abcdef','Abc123',/fold_case)
(5)字符串查找:strpos()用于查找一个字符串(子串)在另一个字符串(母串)中的位置。母串在前,子串在后,查询后返回起始位置下标值,否则返回-1;/reverse_search关键字用于设置从尾端向前查。
IDL> help,strpos('abcdabcd','cd')
IDL> help,strpos('abcdabcd','cd',/reverse_search)
(6)字符串取子串:strmid(母串,起始位置,长度)
IDL> a='abcdefghijklmn'
IDL> a
abcdefghijklmn
IDL> b=strmid(a,3,4)
IDL> b
defg
(7)字符串拆分:strsplit()用于将某个字符串拆分为诺干个字符串,返回子串的起始位置或子串构成的字符串数组。
IDL> a='a,b,c,d,e,f,g'
IDL> b=strsplit(a,',')
IDL> b
IDL> help,b
B
IDL> c=strsplit(a,',',/extract)
IDL> c
a
b
c
d
e
f
g
IDL> help,c
C
4、字符串与数值的相互转换
(1)数值型转换为字符串string()
IDL> a=string(12345)
IDL> help,a
A
IDL> b=string(123,456,789)
IDL> help,b
B
IDL> help,string(123,format='(i3.3)')
(2)将字符串转换为字节型byte()、整型fix()、长整型long()、浮点型float()
注意:函数byte将字符串变量中各个字符转换为对应的ASCII码值。
IDL> help,fix('12345')
IDL> help,long('12345')
IDL> help,float('12345')
IDL> help,byte('12345')
IDL> byte('12345')
5、字符串读取
IDL> str='1
2 3, 4
IDL> reads,str,v1,v2,v3,v4,v5
IDL> help,v1,v2,v3,v4,v5
V1
V2
V3
V4
V5
注意:如果reads过程后的变量没有预先定义,默认为浮点型;若想输入器类型的数据,必须事先创建该变量。
当需要按照规定的格式读入数据时,需要用到format关键字。下面以读取一行数据为例:
数据中的值依次为纬度、精度、日期和时间。
IDL> .RESET_SESSION
IDL> data='42.9105 85.9456 7/2/2013 22:45:56'
IDL> lat=0.0$lon=0.0&date=''&time=''
IDL> reads,data,lat,lon,date,time,format='(f9.5,f10.5,a9,a8)'
2.4表达式
1、数值型表达式
IDL> 3<1<7<2<5
IDL> 1>5>3>4>7
IDL> 3>(-1)
IDL> 5 mod 3
IDL> 1.0 mod 0.1
IDL> 2 mod 0
% Program caused arithmetic error: Integer divide by 0
注意:
1)表达式包含多种类型变量时,计算结果取决于精度最高的类型变量。
IDL> help,3+2b+4.0+3D
2)如果表达式左边变量是子数组或者结构体的域,表达式右边计算结果会转换为右边变量的数据类型。
IDL> arr=intarr(6)
IDL> arr=5.4-2.6
IDL> help,arr
ARR
IDL> arr=intarr(6)
IDL> arr[1]=5.4-2.6
IDL> help,arr
ARR
3)相除运算中,如果两个数都是整数,则运算结果也是整数,小数部分会被舍弃。
IDL> 5/2
IDL> 5.0/2
2、字符型表达式
IDL> 'I'+'am'+'a'+'student'
Iamastudent
IDL> 'I'+' '+'am'+' '+'a'+' '+'student'
I am a student
IDL>
3、关系型表达式
IDL> a=5
IDL> b=3
IDL> help,a gt b
IDL> help,a lt b
例如将数组中小于0的元素替换为0:
IDL> arr=[1.2,-3.6,5.8,-4.2,9.8,-2.5,7.3]
IDL> arr
IDL> mask=arr gt 0
IDL> mask
IDL> mask*arr
IDL> arr>0
4、逻辑型表达式
&&(逻辑与):全真则为真;
‖(逻辑或):至少有一为真则为真
~(逻辑非):真则假,假则真。
IDL> a=1
IDL> b=0
IDL> a&&b
IDL> a||b
IDL> ~a
IDL> ~b
注:实际工作中,逻辑运算符常和关系运算符联合起来使用。例:
IDL> a=1
IDL> b=0
IDL> if (a gt 0) && (b lt 1) then print,'1' else print,'0'
1
5、条件表达式
IDL> a=3
IDL> b=5
IDL> c=a gt b ? a : b
IDL> c
IDL> d=a lt b ? a : b
IDL> d
6、位运算
xor(位异或):参与运算的两个数据值对应位不同变时,结果变量中该位值才为1,否则为0。
not(位非):将参与运算的数据值各位的值取反,即从0变为1或从1变为0.
IDL> a=10b
IDL> b=6b
IDL> a and b
IDL> a or b
IDL> a xor b
IDL> not a
IDL> not b
其中,字节变量a的值为10,二进制表达为00001010;字节b的值为6,二进制表达为00000010。
7、数组运算
IDL> a=[2,3,8,6]
IDL> b=[5,4,2,9]
IDL> a + b
IDL> a * b
IDL> a / b
IDL> float(a) / b
IDL> a=[5,4,2,9]
IDL> b=3
IDL> a + b
IDL> a * b
IDL> a / b
IDL> float(a) / b
IDL> help,a * b
IDL> a=indgen(5)
IDL> a
IDL> a[0:2]=2.3
IDL> a
IDL> a=[5,4,2,9]
IDL> b=[3,1,2,6,4]
IDL> a + b
IDL> a * b
IDL> float(a) / b
IDL> a=[1,2,3]
IDL> b=[[4],[5],[6]]
IDL> a
IDL> b
IDL> a # b
IDL> a ## b
IDL> b # a
IDL> b ## a
8、运算符的优先级
http://s5/bmiddle/0070Uystzy7iUlDcRb6f4&690
http://s13/bmiddle/0070Uystzy7iUlDVHaY5c&690
9、常用的数学运算函数