すべての Perl プログラムの先頭で (コマンドライン修飾子より優先して)常に use strict
andを使用し、 を使用して最初の使用ポイントで各変数を宣言する必要があります。そうすることで、Perl は他の方法では見落としがちな単純なエラーを教えてくれます。use warnings
-w
my
また、 の 3 パラメータ形式でレキシカル ファイル ハンドルを使用しopen
、ステータスをチェックして成功したことを確認する必要があります。Perl は終了時にすべてのファイルを閉じてくれるので、プログラムがかなりの時間実行されることが予想される場合を除き、入力ファイルを明示的に閉じることにはほとんど意味がありません。
require
Perl v5.4は本当に必要ですか? そのバージョンは 15 年前のものであり、それよりも古いバージョンがインストールされている場合は、博物館です。
あなたのプログラムは次のようになります。
use strict;
use warnings;
open my $fh, '<', './text.txt' or die $!;
while (my $line = <$fh>) {
my @arr = split /\s+/, $line;
foreach my $w (@arr) {
if ($w !~ /^\s+$/) {
print $w."\n";
}
}
}
注:申し訳ありません。プラグマとレキシカル ファイル ハンドルは v5.6 でのみ導入されたwarnings
ため、私の回答の一部は無関係です。Perl の最新バージョンは v5.16 であり、アップグレードする必要があります。
Bireiが指摘したように、問題は、行の先頭に空白がある場合、最初のセパレータの前に空のフィールドがあることです。データがコンマで区切られていて、行がコンマで始まっている場合、Perl に先頭の空のフィールドを報告させたいと想像してください。
すべての非スペース文字を抽出するには、まさにそれを行う正規表現を使用できます
my @arr = $line =~ /\S+/g;
これは、単一引用符で囲まれたスペース (正規表現ではありません) であるデフォルトのパラメーターを使用してエミュレートできます。split
my @arr = $line =~ split ' ', $line;
この場合split
、ユーティリティのように動作awk
し、期待どおりに先頭の空のフィールドを破棄します。
$_
Perlに読み取りループで変数を使用させると、これはさらに簡単になりますsplit
。
while (<F1>) {
my @arr = split;
foreach my $w (@arr) {
print "$w\n" if $w !~ /^\s+$/;
}
}