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;
}
}
}