2011-06-07 17 views
13

The answers to this question, <STDIN> numaralı girdiye nasıl giriş yapılacağını açıklar. Amacım şu soruya benzer: Benim birim testimin <>'a sahte giriş yapması gerekiyor.Perl'in elmas operatörüne giriş nasıl yapılır?

Aynı tekniği <>'a sahte girdiye uyguladığımda, çalışmaz. <>'un giriş seviyesi açıklamaları bana komut satırında hiçbir dosya verilmediğinde STDIN'den okuduğuna inanmamı sağladı, ancak bu durum böyle görünmüyor.

Ben iş yapmaya çalışıyorum örnek:

#!/usr/bin/perl -w 

use strict; 
use warnings; 
use Carp; 
use English qw(-no_match_vars); 

sub fake1 { 
    my $fakeinput = "asdf\n"; 
    open my $stdin, '<', \$fakeinput 
     or croak "Cannot open STDIN to read from string: $ERRNO"; 
    local *STDIN = $stdin; 

    my $line = <>; 
    print "fake1 line is $line\n"; 

    return 0; 
} 

sub fake2 { 
    my $fakeinput = "asdf\n"; 
    open my $stdin, '<', \$fakeinput 
     or croak "Cannot open STDIN to read from string: $ERRNO"; 
    local *STDIN = $stdin; 

    my $line = <STDIN>; 
    print "fake2 line is $line\n"; 

    return 0; 
} 

fake1(); 
fake2(); 

fake2 eserler fake1 yapmaz. Örnek bir oturum ("qwerty" Bana yazıyor):

$ perl /tmp/diamond.pl 
qwerty 
fake1 line is qwerty 

fake2 line is asdf 

Sorularım:

  1. Nasıl <> için can Sahte girdi?
  2. Komut satırında hiçbir dosya verilmediğinde <> ve <STDIN> arasındaki fark nedir? (Yanı Neden <STDIN> ancak <> için için bağlantılı soru çalışmalarında tekniği? Yapar)

teşekkürler.

+0

Perlop için belgelerin okunması ([I/O operatörleri] 'de (http://perldoc.perl.org/perlop.html#I%2fO) -Operatörler)) daha dikkatli, '<> 'sihir kullanır gibi görünüyor. Burada '@ ARGV'yi değiştiren ilgili bir örnek var, ancak testimin' <> 'nin ilk örneği olduğunu veya '@ ARGV'nin değiştirilmesinin güvenli olduğunu garanti edeceğinden emin değilim. – bstpierre

+0

Neden "local @ARGV = ...' kullanmaman gerektiğini anlamıyorum. – tchrist

+0

@tchrist - Bu nasıl çalışır? – bstpierre

cevap

9

ilk testte bu deneyin:

open ARGV, '<', \$fakeinput 
     or croak "Cannot open STDIN to read from string: $ERRNO"; 

my $line = <>; 
print "fake1 line is $line\n"; 

Bu "yerel" olmama dezavantajına sahiptir - hiçbir fikri bunu yerel ya da değil yapmak eğer. (Her testten önce sıfırlama işlemini birkaç kez yapabilirsiniz.)

+2

Mükemmel. Aslında, değiştirmem gereken tek şey yereldi * ARGV = $ stdin; '. Teşekkürler! El kitabındaki anahtar "<>, sadece için bir eşanlamlı" gibi görünüyor. ("Büyülü" bölüm beni biraz korkutuyor, ama şimdilik çalışıyor gibi görünüyor.) – bstpierre

+2

Aslında, <> '' readline (* ARGV); Detaylar için bkz. "Perldoc -f readline". – shawnhcorey

İlgili konular