脚本语言自学总结


文章目录

  • 1 perl
    • 1.1 基本知识
    • 1.2 正则表达式
      • 1.2.0 字符集
      • 1.2.1 匹配
      • 1.2.2 替换
      • 1.2.3 转化
      • 1.2.4 正则表达式例子
    • 1.3 hash
    • 1.4 XML::Simple
  • 2 shell脚本
  • 3 tcl脚本
    • 3.1 多行注释
    • 3.2 数组索引
    • 3.3 条件判断
    • 3.4 for循环
    • 3.5 文件I/O
  • 4 python脚本
    • 4.1 os模块
    • 4.2 logging模块

1 perl 1.1 基本知识
  1. 注释方法:
    #或者
    =pod
    =cut
    之间的部分
  2. 双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出。
#!/usr/bin/perl $a = 10; print "a = $a\n"; print 'a = $a\n';

输出
a = 10
a = KaTeX parse error: Expected 'EOF', got '\n' at position 2: a\?n? ?3. perl中的变量用开头,数组从@开头;数组赋值给标量,返回数组元素个数
#!/usr/bin/perl @ages = (25, 30, 40); #定义了一个3*1的数组,用$ages[i](i=0,1,2)来访问 @names = ("google", "runoob", "taobao"); print "\$ages[0] = $ages[0]\n"; print "\$ages[1] = $ages[1]\n"; print "\$ages[2] = $ages[2]\n"; print "\$names[0] = $names[0]\n"; print "\$names[1] = $names[1]\n"; print "\$names[2] = $names[2]\n";

双引号内在$前使用了转义字符\才能输出字符 $。
4. 函数:sub开头,函数参数在特殊数组@中,因此子程序第一个参数为 $[0], 第二个参数为 $_[1]
#!/usr/bin/perl # 定义求平均值函数 sub Average{ $n = scalar(@_); #得到数组个数 $sum = 0; foreach $item (@_){ $sum += $item; } $average = $sum / $n; print '传入的参数为 : ',"@_\n"; #打印整个数组 print "第一个参数值为 : $_[0]\n"; #打印第一个参数 print "传入参数的平均值为 : $average\n"; #打印平均值 } # 调用函数 Average(10, 20, 30);

  1. 如果最后执行的是一条print语句,那么返回值是1
    die函数可以用来在出现错误的时候停止解释程序的运行,并输出一条有意义的出错消息。
1.2 正则表达式 =~表示相匹配,!~表示不匹配
perl处理完后会给匹配到的值存在三个特殊变量名:
  • $`: 匹配部分的前一部分字符串
  • $&: 匹配的字符串
  • $’: 还没有匹配的剩余字符串
1.2.0 字符集
  • [abc]:匹配a或b或c
  • [0-9]:数字
  • [^abc]:非的意思,匹配abc以外的任意字符
  • \d:[0-9]
  • \D:[^0-9]
  • \w:[0-9a-Z]
  • \W:[^0-9a-Z]
  • \v:垂直制表符
  • \r:回车符
  • \s:[\t\n\r\f]
  • {n}:匹配n次,如a{2}是匹配aa
  • {m,n}:匹配m-n次
  • ?:非贪婪模式,如a{1,3}?遇到aaa的话,会匹配a而不是aaa
  • :abc表示从abc开头,aabc就不能匹配
  • : a b c :abc :abc以abc结尾,abcc就不能匹配
1.2.1 匹配
m/要匹配的字符串/
  • m:(m^line\m表示对多行字符的行首和行位定位
  • \b匹配任何单词边界
  • \B不是一个单词边界的位置
1.2.2 替换
s/被替换的字符串/要换成的字符串/
  • i:取消大小写敏感
  • o:表达式只执行一次
  • g:替换所有的匹配的字符串
#把google替换成runoob $string =~ s/google/runoob/;

1.2.3 转化
tr/要被转化的字符串/转化的字符串/
  • c:转化所有未指定字符
  • d:删除所有指定字符
  • s:把多个相同的输出字符缩成一个
#小写转化成大写 $string =~ tr/a-z/A-z/; #把所有非数字字符替换为空格 $string =~ tr/\d/ /c; #删除tab和空格 $string =~ tr/\t //d; # 把数字间的其它字符替换为一个空格 $string =~ tr/0-9/ /cs

1.2.4 正则表达式例子
1.匹配IP地址:m/\d+\.\d+\.\d+\.\d+/ \d:匹配一个数字字符 \d+:匹配一次或多次数字字符。 \.:使用转义字符匹配'.' 2.匹配邮箱 m/^[0-9a-zA-Z.-_]+\@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$ ^:匹配开头 $:匹配结尾,这两个保证了这是连续的一串字符 3.匹配温度m/^([-+]?[0-9]+)([CF])$/ ?:匹配前面的子表达式0次或1次 +:匹配前面的子表达式一次或多次 ^:开头 4.匹配带小数点的正则表达式

比如说匹配邮箱
#! usr/bin/perl $string="abc123\@sjtu.edu.cn"; if( $string =~ m/^[0-9a-zA-Z.-_]+\@[0-9a-zA-Z]+(\.[0-9a-zA-Z]+)+$/){ print "It matched!\n"; } else{ print "don't match!\n" } print "$string\n"

1.3 hash 创建hash的方式
$data{'google'} = 'google.com'; $data{'runoob'} = 'runoob.com'; $data{'taobao'} = 'taobao.com'; 或直接一句话 %data = https://www.it610.com/article/('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com'); 或 %data = https://www.it610.com/article/('google'=>'google.com', 'runoob'=>'runoob.com', 'taobao'=>'taobao.com');

#!/usr/bin/perl %data = https://www.it610.com/article/('google', 'google.com', 'runoob', 'runoob.com', 'taobao', 'taobao.com'); print "\$data{'google'} = $data{'google'}\n"; print "\$data{'runoob'} = $data{'runoob'}\n"; print "\$data{'taobao'} = $data{'taobao'}\n"; @keys = keys %data; $size = @keys; print "1 - 哈希大小: $size\n"; @values = values %data; $size = @values; print "2 - 哈希大小: $size\n"; # 添加元素 $data{'facebook'} = 'facebook.com'; @keys = keys %data; $size = @keys; print "2 - 哈希大小: $size\n"; # 删除哈希中的元素 delete $data{'taobao'}; @keys = keys %data; $size = @keys; print "3 - 哈希大小: $size\n";

1.4 XML::Simple 假设XML内容如下:
pid="12345"/> This is a test.

要这么写
#!/usr/bin/perl use XML::Simple; use Data::Dumper; $xml = XMLin('sample.xml'); #print Dumper($xml); @user=@{$xml->{'user'}}; #print Dumper(@user); $len=@user; #print "$len \n"; %zjm1=%{@user[0]}; print "$zjm1{'login'}\n"; print "$zjm1{'fullname'}\n";

2 shell脚本
echo "Please enter a score:" read score if [ -z "$score" ] then echo "you enter nothing. please enter a score" read score else if [ "$score" -lt 0 -o "$score" -gt 100 ] then echo "the score should be 0~100" read score else if [ "$score" -ge 90 ] then echo "the grade is a" elif [ "$score" -ge 80 ] then echo "the grade is b" fi fi fi

#! /bin/bash i=1 while [[ "$i" -lt 10 ]] do let "square=i*i" echo "$i*$i=$square" let "i=i+1" done

3 tcl脚本 tclsh ./try1.tcl
3.1 多行注释
#!/usr/bin/tclsh #my first program in tcl if 0 { my first program in Tcl program Its very simple } puts "Hello World! welcome to yiibai.com"

3.2 数组索引
#!/usr/bin/tclsh set myVariable {red green blue} puts [lindex $myVariable 2] set myVariable "red green blue" puts [lindex $myVariable 1]

3.3 条件判断
#!/usr/bin/tclsh set a 100 set b 200 # check the boolean condition if { $a == 100 } { # if condition is true then check the following if { $b == 200 } { #if condition is true then print the following puts "Value of a is 100 and b is 200" } } puts "Exact value of a is : $a" puts "Exact value of b is : $b"

3.4 for循环
#!/usr/bin/tclsh # for loop execution for { set a 10}{$a < 20} {incr a} { puts "value of a: $a" }

3.5 文件I/O
!/usr/bin/tclsh set fp [open "input.txt" w+] puts $fp "test\ntest" close $fp set fp [open "input.txt" r] while { [gets $fp data] >= 0 } { puts $data } close $fp

4 python脚本 4.1 os模块
  • os.path.exists(path)
  • os.getcwd():当前目录
  • os.path.split(path):把路径分割成 dirname 和 basename,返回一个元组
  • os.path.join(‘root’,‘test’,‘runoob.txt’):将目录和文件名合成一个路径
  • time.gmtime(os.path.getmtime(file)):以struct_time形式输出最近修改时间
  • os.system(“ls -l”) :直接调用linux命令
4.2 logging模块
import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")

上面代码只在文件中输出,如果想在控制台上输出的话
console = logging.StreamHandler() console.setLevel(logging.INFO) logger.addHandler(console)

【脚本语言自学总结】handler = logging.FileHandler(filename="test.log", encoding="utf-8")可以控制输出中文

    推荐阅读