以编程方式从STDIN读取或在Perl中输入文件

时间:2010-06-29 07:23:09

标签: perl stdin

在Perl中以编程方式从stdin或输入文件(如果提供)中读取最简单的方法是什么?

7 个答案:

答案 0 :(得分:77)

while (<>) {
print;
}
如果没有给出文件,

将从命令行中指定的文件或stdin读取

如果在命令行中需要此循环构造,则可以使用-n选项:

$ perl -ne 'print;'

在这里,您只需将代码从第一个示例中的{}放到第二个

中的''之间

答案 1 :(得分:44)

这提供了一个命名变量来使用:

foreach my $line ( <STDIN> ) {
    chomp( $line );
    print "$line\n";
}

要读取文件,请将其管道输入:

program.pl < inputfile

答案 2 :(得分:14)

在某些情况下,“最简单”的方式是利用-n switch。它隐式地用while(<>)循环包装你的代码并灵活地处理输入。

slickestWay.pl

#!/usr/bin/perl -n

BEGIN: {
  # do something once here
}

# implement logic for a single line of input
print $result;

在命令行:

chmod +x slickestWay.pl

现在,根据您的输入,执行以下操作之一:

  1. 等待用户输入

    ./slickestWay.pl
    
  2. 从参数中指定的文件中读取(不需要重定向)

    ./slickestWay.pl input.txt
    ./slickestWay.pl input.txt moreInput.txt
    
  3. 使用烟斗

    someOtherScript | ./slickestWay.pl 
    
  4. 如果你需要初始化某种面向对象的接口,例如Text :: CSV或其他类似的接口,BEGIN块是必需的,你可以使用-M将其添加到shebang。 / p>

    -l-p也是您的朋友。

答案 3 :(得分:13)

您需要使用&lt;&gt;操作者:

while (<>) {
    print $_; # or simply "print;"
}

可以压缩到:

print while (<>);

任意档案:

open F, "<file.txt" or die $!;
while (<F>) {
    print $_;
}
close F;

答案 4 :(得分:8)

如果您无法使用上面的ennuikiller提供的简单解决方案,那么您将不得不使用Typeglobs来操作文件句柄。这是更多的工作。此示例从$ARGV[0]中的文件复制到$ARGV[1]中的文件。如果未指定文件,则默认分别为STDINSTDOUT

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($_);
}

答案 5 :(得分:6)

待办事项

$userinput =  <STDIN>; #read stdin and put it in $userinput
chomp ($userinput);    #cut the return / line feed character

如果你只想读一行

答案 6 :(得分:-2)

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(<>);
}