perl脚本参数
1. linux下 如何用perl脚本给程序传参(argv)
把执行perl脚本的指令放在反引号之间
./test `perl -e 'print "A"x128'`
`这个符号在键盘tab的上边,1的左边
还可以放在$()中
./test $(perl -e 'print "A"x128')
这个test是一个linux命令,最好不要用作程序名
2. perl 如何在一个perl脚本程序里调用另一个需要运行参数的perl脚本程序 例如有一个a.
你首先需要关联.pl文件到perl.exe,双击b.pl能执行就是关联好了的,然后在b.pl里面这样写代码就可以:
$f='abc.txt';
system "a.pl --show-timer -f $f";
3. Perl中的默认变量@_和$_什么意思
@_ 在某个函数内,数组 @_ 包含传递给该函数的所有参数。
$_ 默认的输入/输出和格式匹配空间
--------------------------------------------------------------------------------------------------------
@_的示例:
#!/bin/perl -w
use strict;
&fun( 111,222,333 );
sub fun()
{
print @_;
}
这里会把传入函数的参数111222333打印出来。
---------------------------------------------------------------------------------------------
$_示例:
下面的几对代码都是等同的:
while (<>) {...} # equivalent only in while!
while (defined($_ = <>)) {...}
/^Subject:/
$_ =~ /^Subject:/
tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/
chomp
chomp($_)
以下是几处即使没有写明 Perl 也会假定使用 $_ 的地方:
* 各种单目函数,包括像 ord() 和 int() 这样的函数以及除 "-t"
以外所有的文件 测试操作 ("-f","-d"),"-t" 默认操作 STDIN。
* 各种列表函数,例如 print() 和 unlink()。
* 没有使用 "=~" 运算符时的模式匹配操作 "m//"、"s///" 和
"tr///"。
* 在没有给出其他变量时是 "foreach" 循环的默认迭代变量。
* grep() 和 map() 函数的隐含迭代变量。
* 当 "while" 仅有唯一条件,且该条件是对 "<FH>"
操作的结果进行测试时,$_ 就是存放输入记录的默认位置。除了
"while" 测试条件之外不会发生这种情况。
(助记:下划线在特定操作中是可以省略的。)
--------------------------------------------------------------------------------------------------
@_和$_都是perl很常用的特殊变量。建议系统看一下《perl语言入门》。
----------------------------------------------------------------------------------------------------------------
另附perl常用特殊变量列表:
perl 内置变量
$- 当前页可打印的行数,属于Perl格式系统的一部分
$! 根据上下文内容返回错误号或者错误串
$” 列表分隔符
$# 打印数字时默认的数字输出格式
$$ Perl解释器的进程ID
$% 当前输出通道的当前页号
$& 与上个格式匹配的字符串
$( 当前进程的组ID
$) 当前进程的有效组ID
$* 设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
$, 当前输出字段分隔符
$. 上次阅读的文件的当前输入行号
$/ 当前输入记录分隔符,默认情况是新行
$: 字符设置,此后的字符串将被分开,以填充连续的字段.
$; 在仿真多维数组时使用的分隔符.
$? 返回上一个外部命令的状态
$@ Perl解释器从eval语句返回的错误消息
$[ 数组中第一个元素的索引号
$\ 当前输出记录的分隔符
$] Perl解释器的子版本号
$^ 当前通道最上面的页面输出格式名字
$^A 打印前用于保存格式化数据的变量
$^D 调试标志的值
$^E 在非UNIX环境中的操作系统扩展错误信息
$^F 最大的文件捆述符数值
$^H 由编译器激活的语法检查状态
$^I 内置控制编辑器的值
$^L 发送到输出通道的走纸换页符
$^M 备用内存池的大小
$^O 操作系统名
$^P 指定当前调试值的内部变量
$^R 正则表达式块的上次求值结果
$^S 当前解释器状态
$^T 从新世纪开始算起,脚步本以秒计算的开始运行的时间
$^W 警告开关的当前值
$^X Perl二进制可执行代码的名字
$_ 默认的输入/输出和格式匹配空间
$| 控制对当前选择的输出文件句柄的缓冲
$~ 当前报告格式的名字
$` 在上个格式匹配信息前的字符串
$’ 在上个格式匹配信息后的字符串
$+ 与上个正则表达式搜索格式匹配的最后一个括号
$< 当前执行解释器的用户的真实ID
$ 含有与上个匹配正则表达式对应括号结果
$= 当前页面可打印行的数目
$> 当前进程的有效用户ID
包含正在执行的脚本的文件名
$ARGV 从默认的文件句柄中读取时的当前文件名
%ENV 环境变量列表
%INC 通过do或require包含的文件列表
%SIG 信号列表及其处理方式
@_ 传给子程序的参数列表
@ARGV 传给脚本的命令行参数列表
@INC 在导入模块时需要搜索的目录列表
$-[0]和$+[0] 代表当前匹配的正则表达式在被匹配的字符串中的起始和终止的位置
4. 带有配置参数的perl脚本如何调试
脚本保存后,用在cmd命令里边直接运行,调试也比较方便的
5. 求教,怎样用perl 读命令行传进来的参数,
最简单的是用@ARGV获得命令后面的参数表
如执行“perl ppp.pl 1 2 3 4 5”
ppp.pl后面跟着5个参数,在程序中可以直接通过调用$ARGV[0],$ARGV[1],$ARGV[2],$ARGV[3],$ARGV[4]来分别调取。
6. perl脚本编写
open IN,"<$ARGV[0]";
open OUT,">$ARGV[1]";
while(<IN>){
@a=split("",$_,29);
if($a[28]=~m/\s/){
print OUT "$_";}
close IN;
close OUT;
望采纳
7. perl脚本中$ARGV[0]是什么意思
$ARGV[0]是从命令行来的,$ARGV[0]是程序名,$ARGV[1]是第一个参数,一次类推。
例如执行下面的命令:
test.pl abc .def
或者:
perl test.pl abc def
那么:
$ARGV[0]=='test.pl'
$ARGV[1]='abc'
$ARGV[2]='def'
8. 谁帮我解释下这个Perl脚本,越详细越好
在指定目录下,遍历所有文件包括子目录下文件,寻找关键词,并打印出来!
指定目录为第一个参数,关键词为第二个,比如该脚本名为 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(<F>){ ##读取文件,一行一行来,读取到EOF标志是while循环结束
if($_=~ m/$ARGV[1]/){ ##如果当前行中有和 $ARGV[1]中需要查询字符一样的字符
print "$f\r\n";last; ##打印出文件名
}
}
close F; ##关闭文件句柄
}
----------------------------------差不多就是这样的了,perl用起来还是很方便的就是需要记的东西相对多点儿,而且一点不对,不好调试,这个脚本写的不是很规范,虽然语法检查没问题。但是运行起来貌似有死循环,最后只好kill掉了..........目前只能看这么多了
9. 如何调试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>
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产生coremp
-U可以执行不安全操作
-S从路径中查找程序
-D设置调试标志
-T写安全程序。从外部获得的数据不能作为命令或修改文件系统
-d使用调试器