1

$exam_nums[$x]このコードは機能します -が呼び出されたときにファイル名を返すように、完全な txt ファイル パスの配列を取り、それらを取り除きます。

for (0..$#exam_nums)
{
 $exam_nums[$_] =~ s/\.txt$//; #remove extension
 $exam_nums[$_] =~ s/$dir//g; #remove path
}

単一の変数に対してこれを実行しようとすると、機能しません。サブルーチンを呼び出してプレゼントを送っていますが、最後は変数が空です。(そこにある他の行は正常に実行されるため、if ステートメント ブロックに入ります。) コードは次のとおりです。

サブへの呼び出し:

notify($_);

$_は、機能するforeach(@files)ループからのものです

サブ:

sub notify
{
 if(shift)
 { 
  $ex_num = shift;
  $ex_num =~ s/\.txt$//; #remove extension
  $ex_num =~ s/$dir//g; #remove path
        print $ex_num;
        print "\nanything";
 }
}

$正規表現の「拡張子の削除」部分を取り出してみましたが、役に立ちませんでした。

4

5 に答える 5

13

あなたは2回シフトしています。if ステートメントの最初のシフトは値を削除し、2 番目のシフトは何も取得しません。 shift実際に変更するという副作用があり@_ます。最初の要素を返すだけでなく、最初の要素を から完全に削除し@_ます。

編集:からman perlfunc

   シフト配列
   shift 配列の最初の値をシフトして返します。
           配列を 1 短縮し、すべてを下に移動します。もしそこにあるなら
           配列に要素がない場合は、未定義の値を返します。もしも
           ARRAY は省略され、字句スコープ内で @_ 配列をシフトします
           サブルーチンとフォーマットの...
于 2009-11-19T18:12:39.897 に答える
6

(引数リスト) から引数を 2 回抽出ex_numしようとしています。perldoc -f shiftを参照してください。@_shift@_$_[0]@_

また、あなたの関数は を閉じています$dirが、これはあなたの意図である場合とそうでない場合があります。(クロージャーの詳細については、 perldoc perlfaq7を参照してください。) 私はそれを取り出して、追加の関数パラメーターとして追加しました。

sub notify
{
    my ($ex_num, $dir) = @_;
    return unless $ex_num;

    $ex_num =~ s/\.txt$//; # remove extension
    $ex_num =~ s/$dir//g;  # remove path
    print $ex_num . "\n";
}
于 2009-11-19T18:21:31.297 に答える
5

自分でローリングする代わりに、File::Basenameを使用します。それはあなたがそれらのディレクトリ、ファイル名とサフィックスにファイルパスを解析することを可能にします。

于 2009-11-19T18:51:03.247 に答える
1

Jim Garrison の情報によると、スイッチを引っ張って問題を解決しました。

sub notify
{
    $ex_num = shift;
    if($ex_num)
    {   
        $ex_num =~ s/\.txt$//; #remove extension
        $ex_num =~ s/$dir//g; #remove path
    }
}
于 2009-11-19T19:11:51.603 に答える
0

コア モジュール、ローカル変数、および Perl 5.10 を使用します。

use 5.010;
use File::Basename;

sub notify {
    my $ex_num = shift;
    my $name = basename($ex_num, '.txt');
    say $name;
}
于 2009-11-24T22:04:07.703 に答える