免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4109 | 回复: 5
打印 上一主题 下一主题

Getopt::Long一问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-18 22:07 |只看该作者 |倒序浏览
我想实现用户的输入如下:
command -option1 1, 2, 3 -option2
请问采用Getopt能否实现? 主要的困惑是对 option1 后的 “1, 2, 3” 不知道怎么做,请教大侠,谢了先。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2010-04-19 08:07 |只看该作者
后面那个 1,2,3 Getopt::Long 是做不了的,
不过你可以拿到 option1 的值以后作个简单的 split 就可以了。

论坛徽章:
0
3 [报告]
发表于 2010-04-19 09:43 |只看该作者
回复 2# flw
可是问题就在于我怎么才能拿到后面的那些值呢?
我说的例子是后面的值是以逗号分割,同时还可能夹杂着空格,试了一遍Getopt里的方法,好像都有问题,难道只能从◎ARGV里去想办法?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-04-19 10:05 |只看该作者
回复  flw
可是问题就在于我怎么才能拿到后面的那些值呢?
我说的例子是后面的值是以逗号分割,同时还可 ...
unicornx 发表于 2010-04-19 09:43

空格肯定是不行的。

论坛徽章:
0
5 [报告]
发表于 2010-04-19 13:17 |只看该作者
本帖最后由 zeroxia 于 2010-04-19 13:23 编辑

option1的值先作为字符串读进来,然后你自己对这个字符串进行分析,按照你的格式提取你需要的内容。同时也要注意非法格式的问题。

昨天刚好写了个脚本,提取出来一部分改改供参考。

使用的时候,如果“包含空格”,可以这样:
# perl test.pl --option1 "1, 2, 3, 4"
也就是防止shell来给你split掉了。

建议自己看看文档就知道了:
# perldoc Getopt::Long
  1. #!/usr/bin/env perl
  2. use warnings;
  3. use strict;

  4. use Getopt::Long qw(:config gnu_getopt);

  5. my %options = (
  6.         'help' => +{spec => 'help|?|h', value => undef },
  7.         # default output is "short" options
  8.         'long' => +{spec => 'long-options|l!', value => undef },
  9.         # count of options printed each line
  10.         'width' => +{spec => 'width|w=i', value => 4},
  11.         # verbose mode, report each option hit as scanning
  12.         'verbose' => +{spec => 'verbose|v!', value => 0},
  13.         # dummy option
  14.         'option1' => +{spec => 'option1|o=s', value => undef},
  15. );
  16. GetOptions(
  17.         map {;
  18.                 $options{$_}{spec} =>
  19.                         (ref($options{$_}{value}) ? $options{$_}{value} : \$options{$_}{value});
  20.         } keys(%options)
  21. );
  22. if ($options{help}{value}) { usage(); }

  23. ## 这里是要特殊处理的地方
  24. if (defined($options{option1}{value})) {
  25.         my @items = split '\s*,\s*', $options{option1}{value};
  26.         $options{option1}{value} = \@items;
  27. }

  28. ### option dumping
  29. print "Your options:\n";
  30. foreach (keys(%options)) {
  31.         printf "  %s: %s\n", $_, argument_value($options{$_}{value});
  32. }

  33. exit 0;

  34. sub argument_value {
  35.         my ($val) = @_;
  36.         unless (defined($val)) {
  37.                 return '<undef>';
  38.         }
  39.         if (ref($val)) {
  40.                 if (ref($val) eq 'ARRAY') {
  41.                         return "[" . join(" ", @$val) . "]";
  42.                 } else { ## ignore other types
  43.                         return "<UNKNOWN>";
  44.                 }
  45.         } else {
  46.                 # scalar
  47.                 return $val;
  48.         }
  49. }

  50. sub usage {
  51.         (my $PROG = $0) =~ s/^.*\///;
  52.         print <<EOF;
  53. USAGE
  54.         $PROG OPTIONS

  55. OPTIONS:
  56.            -l, --long                Long options switch
  57.            -w, --width=N             Number of options to print each line
  58.            -h, --help                This help screen

  59. COPYRIGHT
  60.            (C) 2010 XXX XXXXXXX, <XXX\@gmail.com>
  61. EOF
  62.         exit 1;
  63. }

复制代码

论坛徽章:
0
6 [报告]
发表于 2010-04-26 20:56 |只看该作者
回复 5# zeroxia


    xiexie, 看来有空格还是很特殊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP