文章目录
- 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 基本知识
- 注释方法:
#或者
=pod
=cut
之间的部分 - 双引号和单引号的区别: 双引号可以正常解析一些转义字符与变量,而单引号无法解析会原样输出。
#!/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);
- 如果最后执行的是一条print语句,那么返回值是1
die函数可以用来在出现错误的时候停止解释程序的运行,并输出一条有意义的出错消息。
perl处理完后会给匹配到的值存在三个特殊变量名:
- $`: 匹配部分的前一部分字符串
- $&: 匹配的字符串
- $’: 还没有匹配的剩余字符串
- [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就不能匹配
m/要匹配的字符串/
- m:(m^line\m表示对多行字符的行首和行位定位
- \b匹配任何单词边界
- \B不是一个单词边界的位置
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命令
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")
可以控制输出中文