質問
次のようなXMLファイルを解析しています:
while (<files/*.xml>) { ... }
「ファイル」に定数を使用したい、
use constant FILES_PATH => 'files';
while (<FILES_PATH/*.xml>) { ... }
アイデアを理解し、私を助けてください:)..
事前に感謝します。
解決
うーん、これは定数ではなく読み取り専用を使用する理由の1つです。 Perlがサブルーチンであることを認識するために、&
開始または定数の終了で()
を使用できる場合があります。確認させてください。
いいえ、しかし、参照解除するarrayrefを作成する古典的なトリックを使用できます:
#!/usr/bin/perl
use strict;
use warnings;
use constant DIR => "/tmp";
print map { "$_\n" } <${[DIR]}[0]/*>;
ただし、glob "*"
は<*>
と同じであるため、好むかもしれません:
#!/usr/bin/perl
use strict;
use warnings;
use constant DIR => "/tmp";
print map { "$_\n" } glob DIR . "/*";
おそらく言うでしょう
#!/usr/bin/perl
use strict;
use warnings;
use Readonly;
Readonly my $DIR => "/tmp";
print map { "$_\n" } <$DIR/*>;
他のヒント
他の人が言ったように、これはすべて文字列の補間についてです。
補間コンテキストでは定数プラグマが失敗するため、機能するものを使用する必要があります。
既に述べたように、読み取り専用は1つのオプションです。
古い<!> quot; typeglobトリックに読み取り専用の値を割り当てることもできます<!> quot;。
our $FILES_PATH; # declare FILES_PATH scalar to keep strict happy.
*FILES_PATH = \'files'; # Assign to typeglob so $FILES_PATH points to a string literal
while( <$FILES_PATH/*.xml> ) {
# read the files
}
確かに<!> quot; / <!> quot;この文脈では分割として扱われ、それはどこにも行きそうにないでしょう。あなたは少し戻って、あなたが持っている他のオプションを見てみる必要があるかもしれないと思います。あなたは<!> quot; file globbing <!> quot;しようとしていると思います。詳細については思い出せませんが、そのためのperlでのサポートを思い出すようです。 <!> quot; Glob <!> quot;があります。あなたが見たいかもしれないCPANのモジュール。個人的には、もっと歩行者になり、DirHandleを使用して、XML以外のファイルを<!> quot; next ...が... <!> quot;でない限り除外します。行。