0

このようなtxtファイルがあります
$CHUNK_QTY = "50000";
$CLIENT = "こんにちは";
$CLIENT_CODE = "NMB";
$COMPOSER = "対話";
$CONTROL_FILE_NAME = "NMBM725.XML";
$COPY_BASE = "01";
$CSITE = "NSH";
$DATA_TYPE = "MET";
$DIALOGUE_VERSION = "V7R0M624";
$DISABLE = "N";
$DPI = "300";
$DP_BAR_START = "A";
$DP_BAR_STOP = "Z";
$DUPLEX = "N";
$Dialogue_Version = "V7R0M624";
$EMAIL_ERROR = "Y";
$EMAIL_ON = "N";

500 までの多くの変数があります。対応する変数の値にアクセスしたいと思います。たとえば、 $DPI にアクセスしたい場合は、 300 を出力する必要があります。どうすればそれをperlで行うことができますか。どんな助けでも大歓迎です。正規表現とは違うものが欲しいです。

ありがとう

4

4 に答える 4

2

間違った、間違った、悪い、危険な方法:

eval qx{cat filename.txt};
print "$DPI\n";

また

do "filename.txt";
print "$DPI\n";

だからしないでください。

たとえば正規表現を使用して、ファイルを解析して汚染を除去する方がはるかに優れています...

正規表現ベースのソリューションが必要ない場合は、少なくとも Safe.pm モジュールを使用できます。

use Safe;
my $sandbox = new Safe;
$sandbox->rdo( "filename.txt"  ) or die "safe problem $@";

#more safe now
do "filename.txt";
print "$DPI\n";

rdoようですdoが、安全な環境では、特に$X = qx {rm -rf /};構造物に引っかかる可能性があります。ファイルが渡された場合、rdoおそらく実行できます

もちろん、use strict;TLP が既に述べたように使用できないため、上記も間違っています。最良の方法は、ファイルを解析することです。

正規表現ベースのソリューションの場合、次を使用できます。

use strict;
use warnings;
my $re = qr /^\s*\$(\w+)\s*=\s*"(.*)"\s*;\s*$/o;
my %conf = map { m/$re/;($1,$2) } grep {$re} <DATA>;
__END__
$CHUNK_QTY = "50000";
$CLIENT = "hi all";
$CLIENT_CODE = "NMB";
$COMPOSER = "DIALOGUE";
$CONTROL_FILE_NAME = "NMBM725.XML";
$COPY_BASE = "01";
$CSITE = "NSH";
$DATA_TYPE = "MET";
$DIALOGUE_VERSION = "V7R0M624";
$DISABLE = "N";
$DPI = "300";
$DP_BAR_START = "A";
$DP_BAR_STOP = "Z";
$DUPLEX = "N";
$Dialogue_Version = "V7R0M624";
$EMAIL_ERROR = "Y";
$EMAIL_ON = "N";
于 2012-07-10T18:49:13.950 に答える
1

doファイルを実行するために使用できます。

do "yourfile";
print $DPI;

ただし、で実行しているuse strict場合は、必要に応じて、最初に変数を次のように宣言する必要がありますour

use strict;
use warnings;

our $DPI; # plus any other variables you want to use
do "yourfile";
print $DPI;
于 2012-07-10T18:55:48.030 に答える
1

hash を使用すると、名前と値をハッシュリストに書き込み、名前に基づいてそれらを取得できます。

ファイルの内容を読み取り、その内容をハッシュ構造に入れる方法を次に示します。

my $hash = ();
open FILE, "<", "stuff.txt" or die $!;

while(<FILE>)
{
    my @attr  = split(/=/);
    #this is actually a regexp, but you can read the data in any way you want

    my $key   = $attr[0];
    my $value = $attr[1];
    #only splitting up so that it becomes easier to read

    $hash{$key} = $value;#insert key and value  
}
close (FILE);
print 'Content of $CLIENT:'.$hash{'$CLIENT'};
print 'Content of $CHUNK_QTY:'.$hash{'$CHUNK_QTY'};

ファイル「stuff.txt」の内容

$CLIENT="hi all"
$CHUNK_QTY="50000"
于 2012-07-10T18:59:46.223 に答える
0

上記の形式で行を取得し、それらをハッシュに入れる方法を示す簡単な例を次に示します。

#!/usr/bin/env perl    

use strict;
use warnings;

my %vars;
while (my $line = <DATA>) {
  chomp $line;          # remove linebreak
  $line =~ s/^\$//;     # Optional: remove $ from start of variable name

  my ($key, $value) = $line =~ /^(\w+)\s*=\s*(.*)$/;
  $value =~ s/;$//;     # Remove trailing semicolon
  $value =~ s/^"//;     # Remove leading double-quotes
  $value =~ s/"$//;     # Remove trailing double-quotes
  $vars{$key} = $value;
} 

for my $key (sort keys %vars) {
  print "$key has value $vars{$key}\n";
}

print "CLIENT says $vars{CLIENT}\n";

__DATA__
$CHUNK_QTY = "50000";
$CLIENT = "hi all";
$CLIENT_CODE = "NMB";
$COMPOSER = "DIALOGUE";
$CONTROL_FILE_NAME = "NMBM725.XML";
$COPY_BASE = "01";
$CSITE = "NSH";
$DATA_TYPE = "MET";
$DIALOGUE_VERSION = "V7R0M624";
$DISABLE = "N";
$DPI = "300";
$DP_BAR_START = "A";
$DP_BAR_STOP = "Z";
$DUPLEX = "N";
$Dialogue_Version = "V7R0M624";
$EMAIL_ERROR = "Y";
$EMAIL_ON = "N";

__DATA__ここには開始するのに十分な情報が含まれているはずですが、(ここで行ったようにセクションを使用する代わりに) 実際のファイルを開く方法を自分で読む必要があります。perldoc open例と完全な詳細を確認することをお勧めします。

于 2012-07-10T21:19:10.327 に答える