将值分配给散列中的*字符

时间:2016-02-02 12:00:15

标签: perl hash

使用以下代码部分,我通常根据存储在%r中的一组规则,分割混合字符串整数字段(例如45A34C)并计算每个字母的实例(由进行它的整数指定)。这很好用。

use strict;
use warnings;

my @F; $F[5] = '*';
my @ar = split(/([ABCD])/, $F[5]);
my %r = (A => 1, B => 1, C => 0, D => 1, '*' => 0);
my $s = 0;
my $op;
my $n;
$s += $n * $r{$op} while ($n,$op) = splice @ar,0,4;

但是,在某些情况下,$F[5]只包含星号 - 文字*字符。任何包含此行的行都会返回以下警告:

Use of uninitialized value $op in hash element at b.pl line 10.
Use of uninitialized value in multiplication (*) at b.pl line 10.
Argument "*" isn't numeric in multiplication (*) at b.pl line 10.

鉴于没有为*分配号码,这是预期的。我试图在哈希中为字符分配一个数字,但我无法找出正确的语法。我试过了:

my %r = (A => 1,B => 1,C => 0,D => 1, * => 0);
my %r = (A => 1,B => 1,C => 0,D => 1, \* => 0);

但警告仍然存在。为特殊字符赋值的正确方法是什么?为什么*不能像'A'那样处理?

1 个答案:

答案 0 :(得分:4)

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="240dp"
        android:layout_marginBottom="10dp"
        android:background="@color/Pink">

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:weightSum="1"
            android:layout_marginTop="20dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="12dp"
            android:background="@drawable/shape"> <!--here is shape file-->

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="0dp"
                android:layout_weight="0.80"
                android:layout_marginTop="14dp"
                android:layout_marginLeft="14dp"
                android:weightSum="1"
                android:layout_height="160dp">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:text="Large Text"
                    android:id="@+id/title" />

                <RelativeLayout
                    android:layout_width="40dp"
                    android:layout_height="20dp"
                    android:layout_marginTop="-20dp"
                    android:layout_marginLeft="236dp">


                </RelativeLayout>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceSmall"
                    android:text="Small Text"
                    android:id="@+id/desc" />        

     </LinearLayout> 
 </LinearLayout>
    </RelativeLayout>

my %r = (A => 1, B => 1, C => 0, D => 1, '*' => 0); &#34; autoquotes&#34;它的LHS是标识符,但不一定是标识符;它可以是任何表达。 (事实上​​,你甚至不需要使用=>,这只是一个花哨的逗号(=>)。)

但这并不能解决你的问题。 ,仅包含@ar,因此*$n*未定义。 $op需要至少有两个值才能使该代码生效。因此,让我们明确地寻找有意义的价值观。

@ar

顺便说一下,

my %r = (A => 1, B => 1, C => 0, D => 1 ); my $s = 0; while ($F[5] =~ /(\d+)([ABCD])/g) { my $n = $1; my $op = $2; $s += $n * $r{$op}; } 编写* => 0是一种奇怪的方式,这意味着&#34;是全局*= > 0,数字大于零&#34;。

*=是一种写\* => 0的奇怪方式,这意味着&#34;是全局\*= > 0的地址,数值大于零&#34;。