免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cxfcxf
打印 上一主题 下一主题

请教一个判断@ARGV的问题  关闭 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-07-30 11:02 |只看该作者

回复 #9 cxfcxf 的帖子

因为foreache在第一次执行时if就匹配成功了,接着会执行last,从而结束循环。如果你想要的是执行下一次循环,请使用next。

论坛徽章:
0
12 [报告]
发表于 2009-07-30 11:04 |只看该作者
#!/usr/bin/perl -w

use strict;
my @list = `ls /var/www/apps`;

$ARGV[0] or die "usage:line.pl start|stop|restart dirs\n";
$ARGV[1] or die "no dir\n";

if ($ARGV[0] ne "start" or "stop" or "restart")
{
    print "usage again!\n";
}

foreach (@list)
{
    chomp ($_);
    if ($ARGV[1] ne "$_")
   {
    print "wrong dir\n";
    }
}

我就照你这个写的,把""改成了``,再加了句chomp,可以的啊。

论坛徽章:
0
13 [报告]
发表于 2009-07-30 11:31 |只看该作者
to 版主
那个就是我的代码 最原始的是 start那边用的or 我改掉了 还有最下面用你说的@list做的 注释掉的就是测试用的

to yashiro_lj
对的 你说的很对
用last 第一个就打断了..我想问题是这里
但是用next 结果 如果你第一个进去的argv1 是b 第一个进去的list 是a的话 那么还是会有问题 但是其实已经匹配了



不过你提醒的很对 我做出来了...
#!/usr/bin/perl

use strict;
use warnings;
my @list = glob "/var/www/apps/*";

$ARGV[0] or die "usage:line.pl start|stop|restart dirs\n";
$ARGV[1] or die "no dir\n";


if ($ARGV[0] =~ /start|stop|restart/) {
}else{
    print "usage again!\n";
}

my $switch = 0;
foreach (@list) {
    if ("/var/www/apps/$ARGV[1]" eq "$_") {
        $switch = 1;
        next;
    }
}

print "wrong dir\n" if ($switch == 0);

主要问题就是最后一个循环 不等于的时候不能去print.....而是做一个开关 然后 循环过后再去print 不然就是 成功 print3边 不成功print4边
非常感谢大家...

to ls...
那个代码有问题- -别用了.....这个不是chomp的问题啦/.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
14 [报告]
发表于 2009-07-30 11:37 |只看该作者
原帖由 cxfcxf 于 2009-7-30 11:31 发表
to 版主
那个就是我的代码 最原始的是 start那边用的or 我改掉了 还有最下面用你说的@list做的

我知道那你你的代码,可那不是你执行的代码。我需要的是你实际执行的代码,直接拷贝粘贴,一个字符都不要修改。

论坛徽章:
0
15 [报告]
发表于 2009-07-30 12:12 |只看该作者
原帖由 MMMIX 于 2009-7-30 11:37 发表

我知道那你你的代码,可那不是你执行的代码。我需要的是你实际执行的代码,直接拷贝粘贴,一个字符都不要修改。

#!/usr/bin/perl


use strict;
use warnings;
my @list = glob "/var/www/apps/*";

$ARGV[0] or die "usage:line.pl start|stop|restart dirs\n";
$ARGV[1] or die "no dir\n";


if ($ARGV[0] =~ /start|stop|restart/) {
}else{
    print "usage again!\n";
}

foreach (@list) {
print "/var/www/apps/$ARGV[1]\n";
print "$_\n";
print "\n";
}

这个是我当时测试用的代码 执行效果就是

development:~# ./line.pl start c
/var/www/apps/c
/var/www/apps/a

/var/www/apps/c
/var/www/apps/b

/var/www/apps/c
/var/www/apps/c

/var/www/apps/c
/var/www/apps/d


这个是你要得吗?


最早那个那个 就是第一贴

这个是测试时候用的

然后之后回你那贴 是测试完了 上来提问的....
一个字都不修改 准确的那个已经没了..因为我是一遍测试一遍修改的...用vi的perl - support...\\r....



不过你说的是没错 这2个是可以匹配的 问题是出在循环上.....

谢谢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
16 [报告]
发表于 2009-07-30 12:48 |只看该作者
原帖由 cxfcxf 于 2009-7-30 12:12 发表

这个是我当时测试用的代码 执行效果就是

development:~# ./line.pl start c
/var/www/apps/c
/var/www/apps/a

/var/www/apps/c
/var/www/apps/b

/var/www/apps/c
/var/www/apps/c

/var/www/apps/c
/var/www/apps/d


这个是你要得吗?

不是,我本来是指望你把这两个输出语句放在 foreach 中的 if 之前的。


这个是测试时候用的

这个对我定位你的问题完全没有帮助,因为我还是不知道在出错的时候你到底执行了什么代码,以及它们在执行时关键变量的值到底是什么。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
17 [报告]
发表于 2009-07-30 13:03 |只看该作者
my $switch = 0;
foreach (@list) {
    s/[\r\n\]//g;
    $ARGV[1]=~s/[\r\n]//g;
    if ("/var/www/apps/$ARGV[1]" eq "$_") {
        $switch = 1;
        last;
    }
}
die  "wrong dir\n" if ($switch == 0);

这样不是就好了.....
看不懂这还需要讨论什麽??

论坛徽章:
0
18 [报告]
发表于 2009-07-30 14:49 |只看该作者
to版主...
那个也测试过的 我一般测试 就是 从上一个语句那边开始print 然后出结果 在foreach和if之前的结果 argv1是一样的 就是输入的那个目录...

to楼上..
是的..13楼就好了...主要是我之前给出的测试 没表达清楚

谢谢各位

论坛徽章:
0
19 [报告]
发表于 2009-07-30 14:50 |只看该作者
原帖由 cxfcxf 于 2009-7-30 03:50 发表
谢谢版主
不好意思 那个是我打错了 本来用的是``
但是其实还是有问题

@list = glob "/var/www/apps/*";
foreach (@list) {
    if ("/var/www/apps/$ARGV[0]" ne "$_") {
         print "wrong dir"; ...



znm,脑子有毛病的人真多,评论了一下程序烂就被喷了

论坛徽章:
0
20 [报告]
发表于 2009-07-30 14:52 |只看该作者
原帖由 redicaps 于 2009-7-30 14:50 发表



znm,脑子有毛病的人真多,评论了一下程序烂就被喷了

程序烂不烂管你p事 你谁啊?你写个不烂的给我看看?
要么给意见 要么写代码 要么就别回我贴 累不累
第一次看你这么说话的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP