0

好的,所以问题标题可能有点混乱。我在下面的代码中复制了我的实际问题:

我正在创建具有两个不同 IP 地址作为前缀的文件,然后我想仅列出具有特定 IP 地址前缀的文件:

我正在创建以“10.10.10.10”和“11.11.11.11”为前缀的文件,然后我只想列出带有“10.10.10.10”前缀的文件。

这是我的代码:

#!/usr/bin/perl -w
use strict;

my $ipaddr1 = '10.10.10.10';
for ( my $counter = 1; $counter < 10; $counter++)
{
    my $filename = $ipaddr1."_".$counter.".txt";
    open (my $fh, ">", $filename) or die "$! \n";
}

my $ipaddr2 = '11.11.11.11';
for ( my $counter = 1; $counter < 10; $counter++)
{
    my $filename = $ipaddr2."_".$counter.".txt";
    open (my $fh, ">", $filename) or die "$! \n";
}
print "Done with creating hte files. \n";

print "Lets print the files with only 10.10.10.10 prefix \n";

for my $var ( `ls -1 $ipaddr1_*` )  ### <<< this is the probelm
{
    print $var;
}

输出

Global symbol "$ipaddr1_" requires explicit package name at test.pl line 21.
Execution of test.pl aborted due to compilation errors.

因此,我完全理解在执行 bash 命令时无法解释 perl 变量的错误。

问题

如何做到这一点?我不想将显式 IP 地址传递给ls -1命令,而是想传递包含相应 IP 地址的变量。

谢谢。

4

3 回答 3

3

问题是 Perl 将下划线解释_为变量名的一部分。最直接的解决方案是添加消除歧义的括号,这样就不会发生这种情况:

`ls -1 ${ipaddr1}_*`
于 2013-03-07T10:56:33.963 回答
2

${ipaddr1}_Ilmari Karonen 给出的语法是正确的解决方案。还有一些其他方面可能会改进:

  1. 不要为 Perl 已经可以做的事情开始一个新的过程:

    for my file (glob "${ipaddr1}_*") {
      print "$file\n";
    }
    

    这也更便携:)

  2. 请注意,这open my $fh, ">", $filename会破坏文件。如果您只想创建不存在的文件但不想破坏内容,请改用>>附加模式。

  3. 让您的生活更轻松,代码更短!使用循环和范围:

    for my $ipaddr ("10.10.10.10", "11.11.11.11") {
      for my $counter (1 .. 9) {
        my $filename = sprintf "%s_%d.txt", $ipaddr, $counter;
        open my $fh, ">", $filename or die "Can't open $filename: $!";
      }
    }
    
于 2013-03-07T13:05:08.377 回答
1

解决了:

my $cmd = "ls -1 ". $ipaddr1."_*.txt";
for my $var ( `$cmd` )
{
    print $var;
}
于 2013-03-07T10:19:48.250 回答