2

そのため、foreach 内の正規表現に基づいて配列のハッシュを作成しようとしています。

いくつかのファイル パスを取得していますが、その形式は次のとおりです。

longfilepath/name.action.gz

したがって、基本的には同じ名前でアクションが異なるファイルが存在するため、アクションの配列である名前のキーを使用してハッシュを作成したいと考えています。コードを実行するとこのエラーが発生し続けるため、明らかに何か間違っていると思われます。

Not an ARRAY reference at ....the file I'm writing in

セットされているかどうかを確認しており、配列として宣言していない場合は取得できません。私はまだ perl に慣れているので、問題は単純なものだと思います。

また、正規表現が「名前」文字列と「アクション」文字列の両方を適切に生成していることを確認したので、問題は間違いなく foreach にあります。

ご協力いただきありがとうございます。:)

私のコードはこうです。

my %my_hash;
my $file_paths = glom("/this/is/mypath/*.*\.gz"); 
foreach my $path (@$bdr_paths){

    $path =~ m"\/([^\/\.]+)\.([^\.]+)\.gz";

    print STDERR "=>".Dumper($1)."\n\r";
    print STDERR "=>".Dumper($2)."\n\r";

    #add the entity type to a hash with the recipe as the key
    if($my_hash{$1})
    {
        push($my_hash{$1}, $2);
    }
    else
    {
        $my_hash{$1} = ($2);
    }

}
4

2 に答える 2

2

globはありませんglom。glob 式では、ピリオドはメタ文字ではありません。→ glob '/this/is/mypath/*.gz'.

別の正規表現区切り文字を使用する理由は、不要なエスケープを避けるためです。スラッシュは正規表現のメタ文字ではなく、区切り文字です。文字クラスの内部では、多くの演算子が特殊性を失います。ピリオドをエスケープする必要はありません。エルゴm!/([^/.]+)\.([^.]+)\.gz!

\n\r出力に追加しないでください。①Dumper関数はすでに改行を追加しています。② CRLF を期待する OS を使用している場合は、すべての s を CRLF に:crlf変換する PerlIO レイヤーを使用します。\nでレイヤーを追加できますbinmode STDOUT, ':crlf'。③ネットワーキングをしている場合は、送信したい正確なバイトを指定する方が良いかもしれませ\x0A\x0D\012\015。(しかし、この場合、すべての PerlIO レイヤーも削除します)。

参照を最初の引数として使用するとpush、v5.14 より古い perl では機能しません。

ハッシュにスロットを設定したかどうかを手動で確認しないでください。それがundefarrayref として使用されている場合、配列参照がそこに自動的に作成されます。これはautovivificationとして知られています。もちろん、これにはこの逆参照を実行する必要があります (短い形式の をスキップしますpush)。

Perl では、括弧は優先順位のみを整理し、代入の LHS で使用されるとリスト コンテキストを作成します。配列は作成されません。匿名配列参照を作成するには、括弧を使用します: [$var]. あなたのように括弧を使うのは無意味です。$x = $y$y = ($y)完全に同一です。

だからあなたはどちらかが欲しい

push @{ $my_hash{$1} }, $2;

また

if ($my_hash{$1}) {
  push $my_hash{$1}, $2;
} else {
  $my_hash{$1} = [$2];
}

編集:見落とした3つのこと。

スカラー コンテキストで使用するglobと、イテレータになります。while(my $path = glob(...)) { ... }これは、同様の方法で使用されない限り、通常は望ましくありません。そうしないと、イテレータが使い果たされていることを確認することがより困難になります。むしろ、globリスト コンテキストで使用して、すべての一致を一度に取得しますmy @paths = glob(...)

どこ$bdr_pathsから来たの?中身は?

正規表現が実際に一致したことを常に確認してください。$1これにより、キャプチャなどは次の成功する一致まで値を保持するため、微妙なバグを回避できます。

于 2013-07-31T20:09:59.570 に答える
1

あなたが言う$my_hash{$1} = ($2);と、それはリストコンテキストで評価され、リストの最後のオブジェクトがハッシュに保存されます。

my %h;
$h{a} = ('foo');
$h{b} = ['bar'];
$h{c} = ('foo', 'bar', 'bat'); # Will cause warning if 'use warnings;'
print Dumper(\%h);

与える

$VAR1 = {
          'c' => 'bat',
          'b' => [
                   'bar'
                 ],
          'a' => 'foo'
        };

配列参照ではなく、値として格納されていることがわかります。したがって、匿名配列参照を保存できます$my_hash{$1} = [$2];次に、それをプッシュしますpush( @{ $my_hash{$1} }, $2);

于 2013-07-31T20:16:15.327 に答える