あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

paizaコーディングスキルチェックのサンプルコードに挑戦 (2017.07.15)

面白いツイートを見つけて

Perlのサンプルがあんまりだった

サンプル。
my $input_lines = <STDIN>;
for ( $i = 0; $i < $input_lines; $i++) {
        my $s = <STDIN>;
        chomp($s);
        @s = split(/,/,$s);
        print "hello = ".$s[0]." , world = ".$s[1]."\n";
}
確かにオプション-cを付けてチェックしても警告出ないよ。
でもstrictやwarningsは付けとくでしょ?
付けない?
#!/usr/bin/perl -w

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use Encode::Locale;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

my $input_lines = <STDIN>;
for ( $i = 0; $i < $input_lines; $i++) {
        my $s = <STDIN>;
        chomp($s);
        @s = split(/,/,$s);
        print "hello = ".$s[0]." , world = ".$s[1]."\n";
}
オプション-cでこうなる。
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at sample_1.pl line 15.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at sample_1.pl line 15.
Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at sample_1.pl line 15.
Global symbol "@s" requires explicit package name (did you forget to declare "my @s"?) at sample_1.pl line 18.
Global symbol "@s" requires explicit package name (did you forget to declare "my @s"?) at sample_1.pl line 19.
Global symbol "@s" requires explicit package name (did you forget to declare "my @s"?) at sample_1.pl line 19.
sample_1.pl had compilation errors.

挑戦した

どうせデータの1行目とデータ行数は一致しないので1行目を破棄。 入力データはテキストファイルを標準入力にリダイレクトする可能性がある。 テキストの作成環境が実行環境と異なる場合はchompで改行文字が削除されない場合がある。 Linux/Windows/Macintoshのどれか分からないので行末の空白文字を全て削除。 1行のデータ数が2個とは限らないので先頭2個だけ取得。 この書き方で高々3分割。
#!/usr/local/bin/perl -w

use utf8;
use warnings;
use strict;
use open IO => ":utf8";

use Encode::Locale;

binmode STDOUT, ":encoding(console_out)";

$| = 1;

<STDIN>;
while (<STDIN>) {
        s/[\r\n]*$//;
        my ($hello, $world) = split /,/;
        print "hello = $hello, world = $world\n";
}