在Perl中以编程方式从stdin或输入文件(如果提供)中读取的最巧妙的方法是什么?
Answers:
while (<>) {
print;
}
将从命令行上指定的文件或如果未提供文件的stdin中读取
如果需要在命令行中进行此循环构建,则可以使用以下-n
选项:
$ perl -ne 'print;'
在这里,您只需将代码{}
从第一个示例放到''
第二个
@ARGV = "/path/to/some/file.ext";
并读取文件-因此您甚至可以在某些条件下对默认文件进行编程。
perl -n -e '$_ = uc($_); print;' yourfile
。使用-p而不是-n,perl会在末尾自动打印$ _。
my @slurp = <>; foreach my $line (@slurp) { ... }
while (my $line = <>) {...
吗?
这提供了一个可使用的命名变量:
foreach my $line ( <STDIN> ) {
chomp( $line );
print "$line\n";
}
要读取文件,请像下面这样通过管道输入:
program.pl < inputfile
foreach my $line ( <STDIN> ) {
我同意@MikeKulls。如果Perl脚本不可读,这不是Perl的错。程序员要怪这里!
while(my $line = <>) { print $line; }
。
while (my $line = <>, defined $line) { ... }
还是while (<>) { my $line = $_; }
要避免停在空白行?
在某些情况下,“最流畅”的方法是利用-n
切换。它使用while(<>)
循环隐式地包装代码,并灵活地处理输入。
在slickestWay.pl
:
#!/ usr / bin / perl -n 开始: { #在这里做一次 } #为单行输入实现逻辑 打印$ result;
在命令行中:
chmod +x slickestWay.pl
现在,根据您的输入执行以下操作之一:
等待用户输入
./slickestWay.pl
从参数中命名的文件中读取(无需重定向)
./slickestWay.pl input.txt
./slickestWay.pl input.txt moreInput.txt
使用管道
someOtherScript | ./slickestWay.pl
BEGIN
如果需要初始化某种面向对象的接口,例如Text :: CSV或类似的东西,可以使用将该块添加到shebang中,则该块是必需的-M
。
-l
并且-p
也是你的朋友。
如果有原因不能使用上述ennuikiller提供的简单解决方案,则必须使用Typeglobs来操纵文件句柄。这是更多工作的方式。本示例将文件从中复制$ARGV[0]
到中$ARGV[1]
。如果未指定文件,则默认分别为STDIN
和STDOUT
。
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($_);
}
$ARGV[0]
为其他变量)在其他所有答案均失败的情况下可以使用...
unshift
将文件名放到@ARGV
并使用菱形运算符即可<>
。
做
$userinput = <STDIN>; #read stdin and put it in $userinput
chomp ($userinput); #cut the return / line feed character
如果你只想读一行
这是我制作脚本的方式,该脚本可以接受命令行输入或重定向文本文件。
if ($#ARGV < 1) {
@ARGV = ();
@ARGV = <>;
chomp(@ARGV);
}
这会将文件的内容重新分配给@ARGV,从那里您就可以像对待某人包括命令行选项一样处理@ARGV。
警告
如果没有文件被重定向,则程序将处于空闲状态,因为它正在等待来自STDIN的输入。
我还没有找到一种方法来检测文件是否已被重定向,以消除STDIN问题。
$#ARGV < 1
而不是(我认为是)更清晰@ARGV == 1
?
if(my $file = shift) { # if file is specified, read from that
open(my $fh, '<', $file) or die($!);
while(my $line = <$fh>) {
print $line;
}
}
else { # otherwise, read from STDIN
print while(<>);
}
<>
运算符将自动查找和读取命令行上提供的任何文件。不需要if
。
shift
此处的操作