2016-12-12 1 views
0

Ich habe ein Problem mit initialisierten Werten. Ich habe ein Skript, das Verfahren hat:

sub compare_with_terminal { 
    use Term::Size::Any qw(chars pixels); 
    my $columns = 0; 
    my $rows = 0; 
    ($columns, $rows) = chars *STDOUT{IO}; 

    print "Columns: ".$columns."\n"; #line 73 
    print "Rows: ". $rows."\n"; 

    if($height > $columns || $width > $rows){ 
     print "Bigger than terminal: "; 
     my $option = <>; 
     chomp($option); 
     if($option eq "N"){ 
      print "End."; 
      exit 0; 
     } 
    } 
} 

Wie Sie sehen können, habe ich dort und initialisiert zwei Werte $columns und $rows. Aber, wenn ich das Skript bis Unix laufen erhalte ich:

Use of uninitialized value $columns in concatenation (.) or string at ./perl/script.pl line 73 (#1) (W uninitialized) An undefined value was used as if it were already defined. It was interpreted as a "" or a 0, but maybe it was a mistake. To suppress this warning assign a defined value to your variables.

$rows gleichen Fehler aufweist.

Diese Fehler sagen, dass ich Variable $columns nicht initialisiert habe, aber ich tat es. Kann mir jemand erklären und versuchen, dieses Problem zu lösen?

+0

Was ist Linie 73? (Ich nehme an, Sie haben es nicht gezeigt, weil Sie '$ columns' in einer Zeichenkette nirgends in Ihrem Snippet verwenden) – ThisSuitIsBlackNot

+0

Ich lese die Konsolengröße und schreibe sie in' $ columns' und '$ rows' Variablen. Sie sind Zahlen, hoffe ich, keine Strings. Unter Windows funktioniert alles einwandfrei und ich bekomme keine Fehler. – allocer

+0

Sie überprüfen nicht, ob $ columns definiert ist, nachdem Sie es zugewiesen haben. – stevesliva

Antwort

4

There is a bug report for Term::Size::Any

Mit char ohne Argumente gibt Werte für mich auf Linux (Term::Size::Any Version 0,002):

use warnings; 
use strict; 

use Term::Size::Any qw(chars); 
my ($columns, $rows) = chars(); 
print "$columns $rows\n"; 

__END__ 

80 24 

Sie $ Spalte auf 0 initialisiert, aber es wird überschrieben, wenn Sie die chars Funktion aufrufen .

+0

Es sieht gut aus. Ich habe es unter Windows getestet und alles funktioniert gut. Bald werde ich es auf Unix überprüfen. – allocer

+0

Hinweis: 'chars()' ist äquivalent zu 'chars (* STDIN)', also sollten Sie stattdessen 'chars (* STDOUT)' verwenden. – ikegami

Verwandte Themen