perl脚本教程,怎样在windows dos命下执行perl脚本
perl脚本教程,怎样在windows dos命下执行perl脚本详细介绍
本文目录一览: 如何调试perl脚本
进入退出:
perl
-d debugtest用调试器载入perl程序运行,交互式界面
Loading
DB routines from perl5db.pl version 1.3
Editor
support available.
Enter
h or `h h' for help, or `perldoc
perldebug'
for more help.
main::(p4.pl:2): my($xx,$yy)=(1,1);
DB<1>
先是欢迎信息,显示第一个可执行行:程序将要执行的当前行号。包名,文件名,文件中的行号。
提示符DB
n为命令行号。h可看帮助,q退出调试器
l
缺省显示10行 再输入l接着显示10行
l
10 指定显示第10行
l
8-10 指定显示行的范围
l
8+3 指定从哪行开始多少行。
l
subs 指定显示函数,提供函数名。如果太长只显示前几行,用l接着显示
-
显示在当前行前面的行,再输入-继续向前
w
7 包含指定行的显示窗口 windows可能不一样
//
?? 从当前行搜索包含指定模式的行 /find/
//从前向后正向搜索,??从后向前逆向搜索 可忽略?? //中后面的? /。
S
列出所有函数,包名::函数
无参数的缺省形式列出所有底层和继承的函数,太多。加上搜索模式,指定当前程序包 S main可列出含main的函数
s 执行单条语句 显示下一条要执行的语句。如果需要交互会等待输入。
对于函数,仅仅是进入不执行,如果不进入函数内部,要跳过用n。不能进入系统内部的库函数,只能进入自己定义的
n 执行一行程序,stepover 不进入函数。
f 执行当前函数剩下的语句,显示跟随函数的语句
step
out 旧命令,现在为切换文件名
回车
如果执行了s或n,以后只用回车重复执行上一个s或n的命令。
r 在函数中执行到函数外
b 10
在哪一行设置断点。如果此行非执行语句,显示不能设置断点。如果一条语句有多行,则在第一行设置,其余行不能设置。
b func在函数处设置断点
b 10
($curdir eq
"") 当条件为真时中断执行
c
执行到断点或终止。继续
c
12临时断点,只中断一次,继续执行在12行中断。
L
列出所有断点。列出前几行,当前行,断点。断点条件。
B
10删除断点。不带参数认为是下一行是断点。
B *
删除所有断点。
X
var 不带参数列出main包的所有变量,包括预定义的变量。指定变量不带$,@。可能是符号表中的变量才行。现在与V同。
V
var 列出任何包的变量。只指定包名列出包的所有变量。指定包及变量为main
var。无::
S
列出所有可用的函数,包名::函数 无参数的缺省形式列出所有底层和继承的函数,太多。加上搜索模式,
指定当前程序包
S
main可列出含main的函数
p
expr
指印表达式值。把标准输出重定向也会输出到屏幕。
程序到达某一行时指定执行一条或多条语句。常见的行动作是显示变量值或把含错误值的变量重置为指定的值
a
10 print ("curdir is $curdir\n") 多条语句在一行中用分号;分开,当要续行时用\ 执行完第10行执行指定的语句。
A
*删除所有行动作
A 10删除第10行的动作
>
print 在程序开始执行前执行语句。无参数形式删除设置
<
print 在程序执行完成后执行语句。无参数形式删除设置
跟踪 显示每一个执行行。
t
打开,关闭跟踪。每执行显示一行。
任何非调试命令的perl语句都可执行。分号可忽略。更改变量值。
H
列出从前命令
!
n 执行从前命令。忽略行号执行上一条命令
n=-2跳过2条命令。从当前H列表逆向跳过。
T
栈跟踪。调用级
$
= &main::sub2('hi') from file debug1 line 7
$
= &main::sub1('hi') from file debug1 line 3
当前程序在第7行,在main包的sub2函数中,以hi为实际传递的参数。返回简单变量,此函数由sub1调用。
=
别名 命令 给命令定义别名 =
pc print ("curdir is $curdir\n");别名存在%DB(%DB::alias)中。无参数列出定义的别名。输入pc打印语句。
预定义别名:每次加载调试器自动定义别名。在.perldb中加入$DB'alias{"pc"} = 's/^pc/print
("curdir is $curdir\n");/';
错误检查
Lint perl -MO=Lint,-u pl 编译时检查
perldiag错误信息
-w 重定义函数变量未使用
Use strict;
use diagnostics 警告信息。
命令行参数简介
-c 语法检查
-v版本
-w警告信息
-e执行单行程序
-s为程序提供命令行选项。perl -s prog.pl
-q =>$q=1作为选项。不出现在@ARGV中。否则不加-s,-q作为字符串存在@ARGV中。可赋值-abc="abc"
跟在程序名后带-的是选项,不带-的不是,不是选项的项后面的所有都不是选项。
-P先运行c预处理器,输出再由perl执行
-I指定目录中的包含文件
-n循环处理多个文件。不用while
-p读文件行并显示。同n,不用print自动显示。
-i编辑文件,读然后写回文件。
-a分割行到@F
-F分割模式,指定分割符
-0
指定输入行结束符,用八进制表示
-1
指定输出行结束符
-x从消息中抽取程序。忽略行,直到遇到#!..perl。到文件尾,ctrl-d
ctrl-z __END__时结束
-u产生coredump
-U可以执行不安全操作
-S从路径中查找程序
-D设置调试标志
-T写安全程序。从外部获得的数据不能作为命令或修改文件系统
-d使用调试器
怎样在windows dos命下执行perl脚本
掉到程序所在路径> perl hello.pl
dos命下执行perl脚本方法:
输入 perltest.pl然后就能执行了。
其中test.pl是所要运行的文件的名称
用命令指示符则说不是内部或外部的命令。
这个说明安装没有自动把perl的文件路径自动添加到环境变量中去。
具体方法:右击 的电脑--属性--高级--环境变量--在系统变量部分--双击path--在最后添加perl的安装路径即可。
怎样让perl脚本中执行sql语句?
首先得确保安装了数据库接口模块和相应数据库的驱动模块,如果是用MySql数据库(开源免费新手入门学习都喜欢),则需要确定DBI和DBD::mysql这两个模块是否安装;
然后在perl脚本中写:
!#usr/bin/perl -w
use strict;
use DBI; #使用DBI模块,DBD::mysql是驱动不必在脚本中使用,安装了就行
my $dbname = ""; #引号里填上数据库名
my $ip = ""; #引号里填上要访问的数据库的ip地址,数据库是本机就写127.0.0.1
my $port = ""; #引号里填上要访问的数据库的端口号,mysql默认端口号是3306
my $host = "dbi:mysql:" . $dbname . ":" . $ip . ":" . $port ;
my $user = "root"; #访问数据库使用的用户名
my $password = "xXxX"; #该用户名所使用的密码
my $dbh = DBI -> connect($host,$user,$password) or die "$@"; #与数据库建立连接
$dbh -> do("set names \'gbk\';"); #设置输出中文不乱码
while(1) #条件永远为真,除非人为终止,否则不会停止
{ #可以使用control+c停止脚本执行
my $sql = ""; #引号里填上sql语句
$sth = $dbh -> prepare($sql); #送入数据库做准备
$sth -> execute(); #执行这条sql语句
sleep(300); #设置300秒暂停执行,300秒后继续执行while
}
$dbh -> disconnect(); #断开与数据库的连接
这里使用的是最新的perl和最新的mysql最新,不是复制粘贴别人代码,前几天还在用,保证思路没有问题。
perl?怎么实现脚本
perl就是一个脚本语言。
你说怎么实现脚本
是
用
shell脚本来执行perl吗?
建一个
test.sh
内容如下:
#!
/bin/sh
perl
./XX.pl
**
然后用
sh
test.sh
来执行。
不过你可以直接
perl
./XX.pl
的!
perl脚本语言,在Perl脚本语言下,如何修改文件内容?
Linux中使用Perl修改文件当你编写脚本或是安装程序的时候,就需要修改特定文件的数据,如果这时有自动修改文件的功能,那将会是非常实用的。例如,当你需要移动一个文件中的某个字符串或是命令,当你要改变许多文件的IP地址的时候,这个功能就可以拿来利用了。手动改变这些文件会耗费很长的时间,特别当它是一件重复性的任务。但是,你可以使用Perl程序来完成。所有的Linux供应商都有这个程序。执行以下操作:$perl-pi-e's|[old_string]|[new_string]|g'[file]字符串可以是简单的命令或是常规的表达式。如果你要改变目录的位置(例:从/var/spool/mail到/var/spool/messages),你想要改变目录/etc下的每个文件来反映路径变化。执行以下操作:$find/etc-typef|xargsperl-pi-e's|\/var\/spool\/mail|\/var\/spool\/messages|g'在这个例子上,我们使用搜索和xargs来确保系统只运行常规文件的命令,而不是非常规目录或其它文件类型的命令。这也就运行了/etc目录树,而且会递归的改变所有文件。由于我们/标识,所以我们必须输入了像\/var这样的路径而不是/var。Linux中使用Perl修改文件时我们也可以在Perl表达式使用分隔符。(除了使用|,你也能够使用/,#,@作为分隔符。)执行以下操作,从整个文件里移开一个命令$perl-pi-e's|myword||g'file这就从基本上没有使用任何东西却代替了“myword”.(需要注意的是在第二个和第三个分隔符之间没有空格)。以这种方式使用Perl的话,当你修改配置文件或其它任何类型的数据的时候,你就会极具创造力。它就是一个自动搜索和代替的功能。
谁帮我解释下这个Perl脚本,越详细越好
$ARGV[0] 设定文件路径,$ARGV[1] 设定匹配的关键词,目录下的文件遍历,处理每个文件再行中有 $ARGV[1] 的就输出。okey?可以追问。
在指定目录下,遍历所有文件包括子目录下文件,寻找关键词,并打印出来!
指定目录为第一个参数,关键词为第二个,比如该脚本名为 find.pl
用法应该就是 find.pl
目录名
文件名。 有段时间没用perl了,大概说一下吧,不对的见谅阿。
#!/usr/bin/perl ##类unix系统下告知系统这是perl脚本 前提是需要文件为可执行
sub subdir { ##找到和这个 { 向对应的 } 这里是 过程 subdir 大体功能是把目录存入数组@dir
##把文件存入数组@file
@tmp=(); ##声明临时数组@tmp
$rootdir=shift; ##从参数中读取目录名,就是subdir($ARGV[0])里的$ARGV[0].
opendir(DIR, $rootdir);##打开目录
@tmp = readdir(DIR);##读取目录,把目录下的文件和子目录名字都读进取。只是名字哦!
$start=@dir;#目录数组的旧终点 ##设置标志位,用于在主程序中判断目录是否为空
for (local $i=2;$i<=@tmp-1;$i++) #从2开始是要跳过./和../目录
{ ##开始对@tmp下的内容进行分类整理
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);} #是目录(文件夹)放进@dir数组
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}##是文件,放进@file数组
}
$end=@dir;#目录数组的新终点 ##设置另一个标志位,用途同$start。
closedir(DIR); #关闭句柄
@tmp=();# 临时数组清空 ,为了后续读取子目录下的内容做准备。
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]); ##这里是主程序开始的地方,@ARGV数组包含环境变量,就是执行的时候
##跟在文件名后面的东西开始第一个就是$ARGV[0],第二个是ARGV[1],以此类推.....
#start=end说明经过上一条(下一条)命令,数组没有变化(开始兼结尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
##上面这条的意思就是,如果该目录下无子目录那就算了,如果有,用subdir挨个处理子目录
##个人认为这个写的有问题,因为如果$ARGV[0]所指目录包含2层以上(含两层)子目录的话,
##脚本就做不好完全的遍历....具体改进方法可参考下面文件读取时的做法..
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){##此时@file数组中保存的全部都是文件名
chomp $f; ##除去文件名后的 换行符
open F,$f or next; ##打开文件句柄,打不开这个就去试试打开下一个.....
while(
){ ##读取文件,一行一行来,读取到EOF标志是while循环结束
if($_=~ m/$ARGV[1]/){ ##如果当前行中有和 $ARGV[1]中需要查询字符一样的字符
print "$f\r\n";last; ##打印出文件名
}
}
close F; ##关闭文件句柄
}
----------------------------------差不多就是这样的了,perl用起来还是很方便的就是需要记的东西相对多点儿,而且一点不对,不好调试,这个脚本写的不是很规范,虽然语法检查没问题。但是运行起来貌似有死循环,最后只好kill掉了..........目前只能看这么多了
空格>
空格>
如何在WINDOWS命令行下运行perl脚本
Linux下perl文件的执行#! /usr/bin/perl
第一个“#”表示是这一行是注释
第二个“!”表示这一行不是普通注释,而是解释器路径的声明行
后面的“/usr/bin/perl”是perl解释器的安装路径,也有可能是:“/usr/local/bin/perl”,如果那个不行,就换这个。
这样修改后,文件就是这个模样:
#!/usr/bin/perl
#test.pl
print "test message! \n";
然后,给文件加上可执行的属性:
$ chmod 755 test.pl 或者 $ chmod +x test.pl
这两个命令用哪一个都可以。
现在执行吧: $ ./test.pl
perl脚本编写
open IN,"<$ARGV[0]";
open OUT,">$ARGV[1]";
while(
){
@a=split("",$_,29);
if($a[28]=~m/\s/){
print OUT "$_";}
close IN;
close OUT;
望采纳
写个脚本使用perl或shell对比oracle表数据,急啊,高分悬赏!
除了楼上巨详细的代码将数据导出到CSV里,也可以用perl的DBD::SQLite,将数据放到SQLite内存表中,直接做数据库级表间对比。如果数据量稍大,用这个方法会快很多。而且可以支持更加复杂的数据对比。
perl脚本如下,执行的结果会放在与表对应的csv文件中, 有些代码折行了,请在折行的代码区域双击一下即可展开。#!/usr/bin/env perluse strict;use warnings;use DBI;#**** 说明 ****# # 假设:# 两个database分别为db1, db2# 两个table分别为tbl1, tbl2# 从Oracle数据库导出的文件为csv格式(逗号分隔), 分别为tbl1.csv, tbl2.csv#****执行步骤 ****## Step1 连接Oracle数据库$dbname1="db1";$dbname2="db2";$user="user";$passwd="password";$dbh1=DBI->connect("DBI:Oracle:$dbname1",$user,$passwd) || die "cannot connect to Oracle:$!\n";$dbh2=DBI->connect("DBI:Oracle:$dbname2",$user,$passwd) || die "cannot connect to Oracle:$!\n";# Step2 导出数据库中的tables到csv文件db_to_csv( $dbh1, 'tbl1.csv', 'SELECT * FROM db1.tbl1' );db_to_csv( $dbh2, 'tbl2.csv', 'SELECT * FROM db2.tbl2' );# Step3 断开数据库连接$dbh1->disconnect;$dbh2->disconnect;# Step4 将比较结果写入文件compare_results.csv中open( my $fh, '>', 'compare_results.csv' ) or die $!;compare_dump( 'tbl1.csv', 'tbl2.csv', $fh );close $fh;#**** 以下为一些自定义subroutines ****## 从数据库读取数据并导出为csv文件sub db_to_csv{ my $dbh = shift; my $file = shift; my $sql = shift; my $sth = $dbh->prepare($sql); $sth->execute; my $numFields = $sth->{'NUM_OF_FIELDS'}; open( my $fh, '>', $file ) or die $!; while (my $ref = $sth->fetchrow_arrayref) { my $file; for (my $i = 0; $i < $numFields; $i++) { $line .= $$ref[$i] if(defined $$ref[$i]); $line .= ","; } printf $fh ( "%s\n", $line ); } close $fh;}# 对比两个表并输出同colum不同值的linessub compare_dump { my $file1 = shift; my $file2 = shift; my $fh_result = shift; open( my $fh1, '<', $file1 ) or die $!; open( my $fh2, '<', $file2 ) or die $!; my (@col1, @col2, @col3, @col4); while( defined (my $line1 = <$fh1>) ){ chomp $line1; my ($tbl1_col1, $tbl1_col2, $tbl1_col3, $tbl1_col4) = ( $line1 =~ /(\w+), (\w+), (\w+), (\w+)/ ); my $line2 = chomp(<$fh2>); my ($tbl2_col1, $tbl2_col2, $tbl3_col3, $tbl4_col4) = ( $line1 =~ /(\w+), (\w+), (\w+), (\w+)/ ); if ($tbl1_col1 !~ /$tbl2_col1){ push @col1, [ $tbl1_col1, $tbl2_col1 ]; } if ($tbl1_col2 !~ /$tbl2_col2){ push @col2, [ $tbl1_col2, $tbl2_col2 ]; } if ($tbl1_col3 !~ /$tbl2_col3){ push @col3, [ $tbl1_col3, $tbl2_col3 ]; } if ($tbl1_col4 !~ /$tbl2_col4){ push @col4, [ $tbl1_col4, $tbl2_col4 ]; } } close $fh1; close $fh2; # 写入不同的值column1 printf $fh_result ( "%-8s\t%-8s\n", 'AREAID_tbl1', 'AREAID_tbl2' ); for my $ref_elem (@col1) { printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] ); } # 写入不同的值column2 printf $fh_result ( "%-8s\t%-8s\n", 'CODED_tbl1', 'CODE_tbl2' ); for my $ref_elem (@col2) { printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] ); } # 写入不同的值column3 printf $fh_result ( "%-8s\t%-8s\n", 'AREANO_tbl1', 'AREANO_tbl2' ); for my $ref_elem (@col3) { printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] ); } # 写入不同的值column4 printf $fh_result ( "%-8s\t%-8s\n", 'AREANNAME_tbl1', 'AREANNAME_tbl2' ); for my $ref_elem (@col4) { printf $fh_result ( "%-8s\t%-8s\n", ${$ref_elem}[0], @${$ref_elem}[1] ); }}
楼主真没素质,写这么多也不给分。