为什么在这个Perl程序中会收到关于未初始化值的警告?

为什么在这个Perl程序中会收到关于未初始化值的警告?,perl,subroutine,Perl,Subroutine,我得到这些错误 在testscript.pl第164行第1行的模式匹配(m//)中使用未初始化值$vm\u name。 在testscript.pl第173行第1行的串联(.)或字符串中使用未初始化的值$vm_name。 有人能帮忙吗?我有一种感觉,这与子程序有关,但无法准确地理解它。我是Perl新手,已经研究了几个小时了 # !/usr/bin/perl use strict; use warnings; use feature ":5.10"; ###########

我得到这些错误

在testscript.pl第164行第1行的模式匹配(m//)中使用未初始化值$vm\u name。

在testscript.pl第173行第1行的串联(.)或字符串中使用未初始化的值$vm_name。

有人能帮忙吗?我有一种感觉,这与子程序有关,但无法准确地理解它。我是Perl新手,已经研究了几个小时了

# !/usr/bin/perl

use strict;
use warnings;
use feature ":5.10";

###############################################################################
# Static Variables
my $templateID = "XXXXXXXXXX";
my $serviceID  = "XXXXXXXXXXX";
###############################################################################

###############################################################################
# Global Variables
my $zone;
my $input;
my $zone_ID;
my $vm_name;
my $net_default;
my $net_secondary;
my $vm_ID;
my $start;
my $char_count;
my $ipaddr_1;
my $ipaddr_2;
###############################################################################

# ----------------------- BASIC CONFIGURATIONS [ZONES] ------------------------

print " *** ";
print "
ZONES: paris, milan, berlin, geneva, amsterdam, london, slough";
print " which zone would you like to deploy to? \n ";

# Capture input for ZONE
$input = <STDIN>;

# Data formatting
$input =~ s/^\s+|\s+$|^\t//g;
$zone = lc $input;

# Declare ZONE to USER
print "You are deploying to $zone \n";

# Map input to function

# ZONE PARIS
if ($zone eq "paris") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "374b937d-2051-4440-b02c-a314dd9cb27e";
}

# ZONE MILAN
elsif ($zone eq "milan") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "58848a37-db49-4518-946a-88911db0ee2b";
}

# ZONE BERLIN
elsif ($zone eq "berlin") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "fc129b38-d490-4cd9-acf8-838cf7eb168d";
}

# ZONE GENEVE
elsif ($zone eq "geneva") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "1ef96ec0-9e51-4502-9a81-045bc37ecc0a";
}

# ZONE AMSTERDAM
elsif ($zone eq "amsterdam") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "3c43b32b-fadf-4629-b8e9-61fb7a5b9bb8";
}

# ZONE SLOUGH
elsif ($zone eq "slough") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "5343ddc2-919f-4d1b-a8e6-59f91d901f8e";
}

# ZONE LONDON
elsif ($zone eq "london") {
   print "Deploying to $zone\n";
   # assign zone id
   $zone_ID = "f6b0d029-8e53-413b-99f3-e0a2a543ee1d";
}

# ELSE
else {
   print "Please choose a ZONE";
   system('./deploy_vm');
}

# SUBROUTINE: Assigning Virtual Machine name
sub vm_name {

   # Name of Virtual Machine
   print "Enter name of Virtual Machine: \n";
   print "[VDC Bug: Please do not include '_' in the name]\n";
   my $vm_name = <STDIN>;

   # Data formatting
   $vm_name =~ s/^\s+|\s+$//g;
   print("VM Name: $vm_name");

}

# Apply input filters (no underscores, length constraints)
if (my $vm_name =~ /_/) {
   return ('underscore error');
   print "Cannot use underscore in VM name, please try again";
   vm_name();
}

# DisPlay config
print "
$vm_name will be provisioned with:
1GB HDD and compute offering of 2CPUs with 2GB-RAM";

# ----------------------- NETWORK CONFIGURATIONS ------------------------------

# Gather network information
print "available networks in $zone";
system('cloudmonkey list networks zoneid=$zone_id filter=name,id');

# Users to choose Networks through display
print "";

# Default NIC & IP address
print "please enter Network ID for Default NIC:\n";
$net_default = <STDIN>;

# IP Address DEFAULT
print "please enter IP address\n";
$ipaddr_1 = <STDIN>;

# formatting IP address
$ipaddr_1 =~ m/^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/;

# SECONDARY NIC & IP address
print "please enter Network ID for secondary NIC";
$net_secondary = <STDIN>;

# IP Address SECONDARY
print "please enter IP address\n";
$ipaddr_2 = <STDIN>;

# Formatting IP address
$ipaddr_2 =~ m/^\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/;

print "IP ADDRESS is $ipaddr_2\n";

# Deployment notice
print "... deploying ... \n";

# Provision Machine

# + startvm=false due to provisioning constraints

system('cloudmonkey deploy virtualmachine startvm=false name=$vm_name diplayname=$vm_name zoneid=$zone_id templateid=$templateID serviceofferingid=$serviceID networkids=$net_default ipaddress=$ipaddr_1');

# Add second network to VM
print "Adding second network to VM";
system('cloudmonkey addNicToVirtualMachine networkid=$network_id_second ipaddress=$ip_address_second virtualmachineid=$vm_id');

# Display machine ID
print "$vm_ID";
my $feedback = system('cloudmonkey list networks zoneid=$zone_id filter=name,id');

# ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
# #     Sotiris Comments     # #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
# if (lc($feedback) =~ /error/) {
#    Warn user and fall back to known state. }

# User to copy&paste ID
print "Paste VM ID:\n";
$vm_ID = <STDIN>;

# Data Validation
$vm_ID      =~ s/^\s+|\s+$//g;
$vm_ID      = lc $vm_ID;
$char_count = length($vm_ID);

# IF statement to impliment length validation
if ($char_count != 36) {
   print "your ID is too long/short";
}

# Start Virtual Machine?
print "Start Virtual Machine $vm_name?";
$start = <STDIN>;

if ($start eq "yes") {
   system('');
}
elsif ($start eq "no") {
   system('');
}

# done!
#/usr/bin/perl
严格使用;
使用警告;
使用特征“:5.10”;
###############################################################################
#静态变量
我的$templateID=“xxxxxxxxx”;
我的$serviceID=“xxxxxxxxxx”;
###############################################################################
###############################################################################
#全局变量
我的$zone;
我的$input;
我的$zone_ID;
我的$vm_名称;
我的$net_违约;
我的$net_中学;
我的$vm_ID;
我的$start;
我的$char_计数;
我的$ipaddr_1;
我的$ipaddr_2;
###############################################################################
#--------------------------基本配置[区域]------------------------
打印“***”;
“打印”
区域:巴黎、米兰、柏林、日内瓦、阿姆斯特丹、伦敦、斯劳”;
打印“要部署到哪个区域?\n”;
#捕捉区域的输入
$input=;
#数据格式
$input=~s/^\s+|\s+$|^\t//g;
$zone=lc$输入;
#向用户声明区域
打印“您正在部署到$zone\n”;
#将输入映射到函数
#巴黎区
if($zone eq“巴黎”){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“374b937d-2051-4440-b02c-a314dd9cb27e”;
}
#米兰区
elsif($zone eq“米兰”){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“58848a37-db49-4518-946a-88911db0ee2b”;
}
#柏林区
elsif(柏林均价区){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“fc129b38-d490-4cd9-acf8-838cf7eb168d”;
}
#地带基因
elsif(日内瓦均价区){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“1ef96ec0-9e51-4502-9a81-045bc37ecc0a”;
}
#阿姆斯特丹区
elsif($zone eq“阿姆斯特丹”){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“3c43b32b-fadf-4629-b8e9-61fb7a5b9bb8”;
}
#区域剥落
elsif($zone eq“slough”){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“5343ddc2-919f-4d1b-a8e6-59f91d901f8e”;
}
#伦敦区
elsif($zone eq“伦敦”){
打印“部署到$zone\n”;
#分配区域id
$zone_ID=“f6b0d029-8e53-413b-99f3-e0a2a543ee1d”;
}
#否则
否则{
打印“请选择一个区域”;
系统(“./deploy_vm”);
}
#子例程:分配虚拟机名称
子虚拟机名称{
#虚拟机的名称
打印“输入虚拟机名称:\n”;
打印“[VDC错误:请不要在名称中包含”\n”;
我的$vm_name=;
#数据格式
$vm_name=~s/^\s+|\s+$//g;
打印(“虚拟机名称:$VM_名称”);
}
#应用输入过滤器(无下划线、长度限制)
如果(我的$vm\u name=~/\u/){
返回('下划线错误');
打印“无法在VM名称中使用下划线,请重试”;
vm_name();
}
#显示配置
“打印”
$vm_name将设置为:
1GB硬盘和计算产品,提供2CPU和2GB-RAM”;
#--------------------------网络配置------------------------------
#收集网络信息
打印“可用网络在$zone中”;
系统('cloudmonkey list networks zoneid=$zone_id filter=name,id');
#用户可通过显示器选择网络
打印“”;
#默认NIC和IP地址(&IP)
打印“请输入默认NIC的网络ID:\n”;
$net_default=;
#IP地址默认值
打印“请输入IP地址\n”;
$ipaddr_1=;
#格式化IP地址
$IPADDR1=~m/^\b(25[0-5][0-4][0-9][1]?[0-9][0-9][0-9]。\(25[0-5][2[0-4][0-9][01]?[0-9][0-9][0-9]。\(25[0-5][0-4][0-9][0-01]?)\(25[0-5][0-4][0-9][0-9]。\(25[0-5];2[0-4][0-9][0-9]。\0-9]。\0;
#辅助NIC和IP地址
打印“请输入辅助NIC的网络ID”;
$net_secondary=;
#IP地址辅助
打印“请输入IP地址\n”;
$ipaddr_2=;
#格式化IP地址
$ipaddr|u 2=~m/^\b(25[0-5][0-4][0-9][1]?[0-9][0-9]。\(25[0-5][2[0-4][0-9][01]?[0-9][0-9][0-9]。\(25[0-5][0-4][0-9][0-01]?[0-9][0-9]。\(25[0-5];2[0-4][0-9][0-9]。\0;
打印“IP地址为$ipaddr\u 2\n”;
#部署通知
打印“…正在部署…\n”;
#供应机器
#+startvm=由于设置限制而为false
系统('cloudmonkey deploy virtualmachine startvm=false name=$vm\u name diplayname=$vm\u name zoneid=$zone\u id templateid=$templateid serviceofferingid=$serviceID NetworkId=$net\u默认ipaddress=$ipaddress\u 1');
#将第二个网络添加到虚拟机
打印“向VM添加第二个网络”;
系统('cloudmonkey addNicToVirtualMachine networkid=$network\u id\u second ipaddress=$ip\u address\u second virtualmachineid=$vm\u id');
#显示机器ID
打印“$vm_ID”;
my$feedback=system('cloudmonkey list networks zoneid=$zone_id filter=name,id');
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
##Sotiris评论##
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#如果(lc($feedback)=~/error/){
#警告用户并返回到已知状态。}
#要复制和粘贴ID的用户
打印“粘贴虚拟机ID:\n”;
$vm_ID=;
#数据验证
$vm_ID=~s/^\s+|\s+$//g;
$vm_ID=lc$vm_ID;
$char\u count=长度($vm\u ID);
#执行长度验证的IF语句
如果($char\u count!=36){
打印“您的ID太长/太短”;
}
#启动虚拟机?
打印“启动虚拟机$vm_name?”;
$start=;
如果($start eq“yes”){
系统(“”);
}
elsif($start eq“否”){
系统(“”);
}
#完成了!
将始终在警告下警告
在模式匹配中使用未初始化值$vm\u name,因为您在
if
条件中错误地声明了另一个词法

此外,您还应根据需要清理用户输入

my $vm_name = <STDIN>;
my$vm_name=;
如果用户按下
Ctrl-D
或存在e,则返回未定义
my $vm_name = <STDIN>;
die "Premature EOF\n" if !defined($vm_name);
my $vm_name=<STDIN>;