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

f3temu5u  于 2022-11-27  发布在  Perl
关注(0)|答案(8)|浏览(172)

用Perl编程读取stdin或输入文件(如果提供)的最佳方法是什么?

bmp9r5qi

bmp9r5qi1#

while (<>) {
print;
}

将从命令行上指定的文件读取,如果未指定文件,则从stdin读取
如果需要在命令行中进行此循环构造,则可以使用-n选项:

$ perl -ne 'print;'

在这里,您只需将第一个示例中{}与第二个示例中''之间代码

kokeuurv

kokeuurv2#

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

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

要读取文件,请按如下方式将其输入:

program.pl < inputfile
pw136qt2

pw136qt23#

在某些情况下,“最巧妙”的方法是利用-n开关,它用while(<>)循环隐式地 Package 代码,并灵活地处理输入。
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

1.从参数中命名的文件读取(不需要重定向)

./slickestWay.pl input.txt
./slickestWay.pl input.txt moreInput.txt

1.使用管道

someOtherScript | ./slickestWay.pl

如果你需要初始化某种面向对象的接口,比如Text::CSV或者类似的东西,那么BEGIN块是必需的,你可以用-M把它添加到shebang中。
-l-p也是你的朋友。

jk9hmnmh

jk9hmnmh4#

您需要使用〈〉运算符:

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

可压缩为:

print while (<>);

任意文件:

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

wvmv3b1j5#

如果你 * 不能 * 使用ennuikiller提供的简单解决方案,那么你将不得不使用Typeglob来操作文件句柄。这需要更多的工作。这个例子从$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($_);
}
0dxa2lsx

0dxa2lsx6#

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

如果你只想读一行

ct3nt3jp

ct3nt3jp7#

下面是我如何创建一个脚本,它可以接受命令行输入或重定向文本文件。

if ($#ARGV < 1) {
    @ARGV = ();
    @ARGV = <>;
    chomp(@ARGV);
}

这会将文件的内容重新分配给@ARGV,从那里您只需处理@ARGV,就好像有人在包括命令行选项一样。

  • 注意事项 *

如果没有文件被重定向,程序将处于空闲状态,因为它正在等待来自STDIN的输入。
我还没有想出一种方法来检测文件是否被重定向,以消除STDIN问题。

xtfmy6hx

xtfmy6hx8#

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

相关问题