1

此代码有效 - 它采用一组完整的 txt 文件路径并将它们剥离,以便在$exam_nums[$x]调用时返回文件名

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

你换了两次。if 语句中的第一个移位删除了值,第二个移位什么也没有。 shift实际修改@_. 除了返回第一个元素之外,它还会从 . 中永久删除第一个元素@_

编辑:从man perlfunc

   移位数组
   shift 将数组的第一个值移出并返回,
           将数组缩短 1 并将所有内容向下移动。如果有
           数组中没有元素,返回未定义的值。如果
           省略 ARRAY,在词法范围内移动 @_ 数组
           子程序和格式,...
于 2009-11-19T18:12:39.897 回答
6

您试图ex_num@_(参数列表) 中提取您的参数两次:shift(which alters @_) 与$_[0](which just 查看第一个元素@_但不改变它) 不同。请参阅perldoc -f shift

此外,您的功能正在关闭$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

根据吉姆加里森的信息,我拉了一个开关来解决这个问题:

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 回答