use English;
my $in;
my $out;
if ($#ARGV >= 0){
unless (open($in, "<", $ARGV[0])){
die "could not open $ARGV[0] for reading.";
}
}
else {
$in = *STDIN;
}
if ($#ARGV >= 1){
unless (open($out, ">", $ARGV[1])){
die "could not open $ARGV[1] for writing.";
}
}
else {
$out = *STDOUT;
}
while ($_ = <$in>){
$out->print($_);
}
8条答案
按热度按时间bmp9r5qi1#
将从命令行上指定的文件读取,如果未指定文件,则从stdin读取
如果需要在命令行中进行此循环构造,则可以使用
-n
选项:在这里,您只需将第一个示例中
{}
与第二个示例中''
之间代码kokeuurv2#
这提供了一个要使用的命名变量:
要读取文件,请按如下方式将其输入:
pw136qt23#
在某些情况下,“最巧妙”的方法是利用
-n
开关,它用while(<>)
循环隐式地 Package 代码,并灵活地处理输入。在
slickestWay.pl
中:在命令行:
现在,根据您的输入执行以下操作之一:
1.等待用户输入
1.从参数中命名的文件读取(不需要重定向)
1.使用管道
如果你需要初始化某种面向对象的接口,比如Text::CSV或者类似的东西,那么
BEGIN
块是必需的,你可以用-M
把它添加到shebang中。-l
和-p
也是你的朋友。jk9hmnmh4#
您需要使用〈〉运算符:
可压缩为:
任意文件:
wvmv3b1j5#
如果你 * 不能 * 使用ennuikiller提供的简单解决方案,那么你将不得不使用Typeglob来操作文件句柄。这需要更多的工作。这个例子从
$ARGV[0]
中的文件复制到$ARGV[1]
中的文件。如果没有指定文件,它分别默认为STDIN
和STDOUT
。0dxa2lsx6#
做
如果你只想读一行
ct3nt3jp7#
下面是我如何创建一个脚本,它可以接受命令行输入或重定向文本文件。
这会将文件的内容重新分配给@ARGV,从那里您只需处理@ARGV,就好像有人在包括命令行选项一样。
如果没有文件被重定向,程序将处于空闲状态,因为它正在等待来自STDIN的输入。
我还没有想出一种方法来检测文件是否被重定向,以消除STDIN问题。
xtfmy6hx8#