developer tip

Perl의 STDIN 또는 입력 파일에서 프로그래밍 방식으로 읽기

copycodes 2020. 11. 13. 23:41
반응형

Perl의 STDIN 또는 입력 파일에서 프로그래밍 방식으로 읽기


Perl에서 stdin 또는 입력 파일 (제공된 경우)에서 프로그래밍 방식으로 읽는 가장 매끄러운 방법은 무엇입니까?


while (<>) {
print;
}

명령 줄에 지정된 파일에서 읽거나 파일이 지정되지 않은 경우 stdin에서 읽습니다.

명령 줄에서이 루프 구성이 필요한 경우 다음 -n옵션을 사용할 수 있습니다 .

$ perl -ne 'print;'

여기에 {}첫 번째 예제 ''에서 두 번째 예제 사이에 코드 를 넣 습니다.


이것은 작업 할 명명 된 변수를 제공합니다.

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

파일을 읽으려면 다음과 같이 파이프하십시오.

program.pl < inputfile

특정 상황에서 "가장 매끄러운"방법은 -n스위치를 활용하는 것입니다 . 코드를 while(<>)루프로 암시 적으로 래핑 하고 입력을 유연하게 처리합니다.

에서 slickestWay.pl:

#! / usr / bin / perl -n

시작 : {
  # 여기서 한 번만
}

# 한 줄의 입력에 대한 로직 구현
$ result 인쇄;

명령 줄에서 :

chmod +x slickestWay.pl

이제 입력에 따라 다음 중 하나를 수행하십시오.

  1. 사용자 입력을 기다립니다

    ./slickestWay.pl
    
  2. 인수로 명명 된 파일에서 읽기 (재 지정 필요 없음)

    ./slickestWay.pl input.txt
    ./slickestWay.pl input.txt moreInput.txt
    
  3. 파이프 사용

    someOtherScript | ./slickestWay.pl 
    

BEGIN블록은 Text :: CSV와 같은 객체 지향 인터페이스를 초기화해야하는 경우에 필요하며 -M.

-l그리고 -p또한 당신의 친구입니다.


<> 연산자를 사용해야합니다.

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

다음과 같이 압축 할 수 있습니다.

print while (<>);

임의 파일 :

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

If there is a reason you can't use the simple solution provided by ennuikiller above, then you will have to use Typeglobs to manipulate file handles. This is way more work. This example copies from the file in $ARGV[0] to that in $ARGV[1]. It defaults to STDIN and STDOUT respectively if files are not specified.

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

Do

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

if you want to read just one line


Here is how I made a script that could take either command line inputs or have a text file redirected.

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


This will reassign the contents of the file to @ARGV, from there you just process @ARGV as if someone was including command line options.

WARNING

If no file is redirected, the program will sit their idle because it is waiting for input from STDIN.

I have not figured out a way to detect if a file is being redirected in yet to eliminate the STDIN issue.


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

참고URL : https://stackoverflow.com/questions/3138649/programmatically-read-from-stdin-or-input-file-in-perl

반응형