While和foreach混合循环问题 !C:\Perl\bin\Perl.exe

While和foreach混合循环问题 !C:\Perl\bin\Perl.exe,perl,foreach,Perl,Foreach,如何修复它?感谢您的阅读和回复 [更新] 我不想打印重复的行 我看不出有什么问题,您的脚本处理\uuuuu数据\uuuuuuuu并测试所有输入字:因为“Hello”和“World”各匹配两次,所以它打印4行 如果您不想让它写多行,只需添加last在print语句之后。获得重复输出的原因是正则表达式$line=~/Hello/既匹配“Hello World”行,又匹配$line=~/World/也匹配“Hello World”行。为了防止出现这种情况,您需要添加一些内容来记住\uuuu DATA\

如何修复它?感谢您的阅读和回复

[更新]
我不想打印重复的行

我看不出有什么问题,您的脚本处理
\uuuuu数据\uuuuuuuu
并测试所有输入字:因为“Hello”和“World”各匹配两次,所以它打印4行


如果您不想让它写多行,只需添加
last
print
语句之后。

获得重复输出的原因是正则表达式
$line=~/Hello/
既匹配“Hello World”行,又匹配
$line=~/World/
也匹配“Hello World”行。为了防止出现这种情况,您需要添加一些内容来记住
\uuuu DATA\uuuu
部分中的哪些行已经打印出来,以便在它们与另一个参数匹配时可以跳过打印

此外,还有一些非常细微的风格清理:

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

my $numArgs = @ARGV;
print "thanks, you gave me $numArgs command-line arguments.\n";

while (my $line = <DATA> ) { 
    foreach my $arg (@ARGV) {
        if ($line =~ /$arg/)
            {
                print $line;
            }
    }
} 

__DATA__ 
A
B
Hello World :-)
Hello World !
#!C:\Perl\bin\Perl.exe
严格使用;
使用警告;
我的$numArgs=@ARGV;
打印“谢谢,您给了我$numArgs命令行参数。\n”;
而(我的$line=){
foreach my$arg(@ARGV){
如果($line=~/$arg/)
{
打印$行;
}
}
} 
__数据
A.
B
你好,世界:-)
你好,世界!
  • 在标量上下文中使用数组返回其大小,因此
    $size=@arr
    优于
    $size=$\arr+1

  • 如果除了通过数组进行索引之外,不打算使用计数器(
    对于$i(0..$#arr){$elem=$arr[$i];…}
    ),那么只需在数组上循环(
    对于$elem(@arr){…}
    )就更简单、更直接了


您的
foreach
循环也可以替换为
grep
语句,但我将把它作为练习留给读者。

假设您只想在一个或多个模式匹配的情况下打印
数据中的每一行,您可以使用
grep
。请注意,使用
\Q
在命令行参数中引用regex元字符,并使用
@patterns
数组预编译模式

如果grep{$line=~$\}@patterns
匹配一个或多个模式,请大声阅读

命令行参数在中(请阅读文档)。在标量上下文中,
@ARGV
计算为该数组中的元素数。因此,您可以简单地使用:

printf "Thanks, you gave me %d command line arguments.\n", scalar @ARGV;
此外,您可以在
foreach
循环中直接迭代
@ARGV
的元素,而不是索引访问

while (my $line = <DATA> ) { 
    foreach my $arg ( @ARGV ) {
        if ( $line =~ /$arg/ ) {
            print $line;
        }
    }
} 
while(my$line=){
foreach my$arg(@ARGV){
如果($line=~/$arg/){
打印$行;
}
}
} 

现在,如果我通过
在命令行上?或者,甚至是
World?
应该发生什么?

嗨,肯普。是的,正如你所说。但是我不想打印重复的行。谢谢。然后在
print
语句之后添加一个
最后;
。嗨,戴夫,我发现了一个bug。如果我运行
test.pl World Hello
,(将Hello World切换到World Hello)输出仍然错误。:-)顺便说一句,当我将
传递到上面的程序时,产生并生成了一个不匹配的错误
(在regex中;由@Nano HE Rica ederim;-)标记)主要问题是,如果在
\uuuu数据中没有字符串
World?
,是否希望
World?
匹配输入。这是匹配,因为
d?
意味着
d
在模式中是可选的。在将
\Q
插入
$\ucode>qr
之前,在模式中使用
\Q
,意味着e
将被引用,现在
必须按字面意思匹配。
#!/usr/bin/perl

use strict; use warnings;

printf "Thanks, you gave me %d command line arguments.\n", scalar @ARGV;

my @patterns = map { qr/\Q$_/ } @ARGV;

while ( my $line = <DATA> ) {
    print $line if grep { $line =~ $_ } @patterns;
}

__DATA__
A
B
Hello World :-)
Hello World !
my $numArgs = $#ARGV + 1;
print "thanks, you gave me $numArgs command-line arguments.\n";
printf "Thanks, you gave me %d command line arguments.\n", scalar @ARGV;
while (my $line = <DATA> ) { 
    foreach my $arg ( @ARGV ) {
        if ( $line =~ /$arg/ ) {
            print $line;
        }
    }
}