Print оператор печатает дважды во внешнем блоке в Perl - PullRequest
0 голосов
/ 23 мая 2018

Ниже приведен код, адаптированный из этой ссылки для получения погоды и отображения на i3blocks.

#!/bin/bash 

METRIC=1 #Should be 0 or 1; 0 for F, 1 for C

if [ -z $1 ]; then
    echo
    echo "USAGE: weather.sh <locationcode>"
    echo
    exit 0;
fi

curl -s http://rss.accuweather.com/rss/liveweather_rss.asp\?metric\=${METRIC}\&locCode\=$1 | perl -ne 'use utf8;

if ( /Currently/ ) {

    chomp;
    /\<title\>Currently: (.*)?\<\/title\>/;

    my @values  = split(":", $1); 
    my $deg     = "°C";
    my @values2 = split("C", $values[1]);

    if ( $values[0] eq "Sunny" || $values[0] eq "Mostly Sunny" || $values[0] eq "Partly Sunny" || $values[0] eq "Intermittent Clouds" || $values[0] eq "Hazy Sunshine" || $values[0] eq "Hazy Sunshine" || $values[0] eq "Hot") {
        my $sun = "";
        binmode(STDOUT, ":utf8");
        print "$sun";
    }

    if ( $values[0] eq "Mostly Cloudy" || $values[0] eq "Cloudy" || $values[0] eq "Dreary (Overcast)" || $values[0] eq "Fog" ) {
        my $cloud = "";
        binmode(STDOUT, ":utf8");
        print "$cloud";
    }

    if ( $values[0] eq "Showers" || $values[0] eq "Mostly Cloudy w/ Showers" || $values[0] eq "Partly Sunny w/ Showers" || $values[0] eq "T-Storms"|| $values[0] eq "Mostly Cloudy w/ T-Storms"|| $values[0] eq "Partly Sunny w/ T-Storms"|| $values[0] eq "Rain" ) {
        my $rain = "";
        binmode(STDOUT, ":utf8");
        print "$rain";
    }

    if ( $values[0] eq "Windy" ) {
        my $wind = "";
        binmode(STDOUT, ":utf8");
        print "$wind";
    }

    if ( $values[0] eq "Flurries" || $values[0] eq "Mostly Cloudy w/ Flurries" || $values[0] eq "Partly Sunny w/ Flurries"|| $values[0] eq "Snow"|| $values[0] eq "Mostly Cloudy w/ Snow"|| $values[0] eq "Ice"|| $values[0] eq "Sleet"|| $values[0] eq "Freezing Rain"|| $values[0] eq "Rain and Snow"|| $values[0] eq "Cold" ) {
        my $snow = "";
        binmode(STDOUT, ":utf8");
        print "$snow";
    }

    if ( $values[0] eq "Clear" || $values[0] eq "Mostly Clear" || $values[0] eq "Partly Cloudy"|| $values[0] eq "Intermittent Clouds"|| $values[0] eq "Hazy Moonlight"|| $values[0] eq "Mostly Cloudy"|| $values[0] eq "Partly Cloudy w/ Showers"|| $values[0] eq "Mostly Cloudy w/ Showers"|| $values[0] eq "Partly Cloudy w/ T-Storms"|| $values[0] eq "Mostly Cloudy w/ Flurries" || $values[0] eq "Mostly Cloudy w/ Snow" ) {
        my $night = "";
        binmode(STDOUT, ":utf8");
        print "$night";
    }

    binmode(STDOUT, ":utf8");
    print  "$values2[0]$deg"; 
}'

(Текст, который может выглядеть как прямоугольники, взят из fontawesome font).Все, что я добавил, это следующие строки

my $deg = "°C";
my @values2 = split("C",$values[1]);

и изменил последний оператор print, который изначально был print "$values[1]".Старый оператор print показывает температуру без знака градуса, например 35C.Мое намерение состояло в том, чтобы просто добавить градус между ними, например 35°C, но вывести

35°C°C

Почему подстрока печатается дважды?Это происходит, даже если я включаю его в отдельный оператор print или включаю непосредственно подстроку (print $values2[0]°C).

Как ни странно, включение значения и единицы во внутренние блоки, такие как print "$sun$values2[0]$deg";, похоже, работаетштраф без дублирования.

1 Ответ

0 голосов
/ 23 мая 2018

Сценарий работает, ища тег <title> в RSS.Если вы сделаете это вручную, вы увидите, что их несколько. '

curl -s 'http://rss.accuweather.com/rss/liveweather_rss.asp?metric=1&locCode=ASI|IN|IN031|MADRAS' | grep title
<title>Madras, IN - AccuWeather.com Forecast</title>
            <title>Madras, IN - AccuWeather.com Forecast</title>
            <title>Currently: Partly Sunny: 35C</title> 
                <title>5/23/2018 Forecast</title>
                <title>5/24/2018 Forecast</title>
<title>The AccuWeather.com RSS Center</title>

Если вы добавите

use strict;
use warnings;

, вы получите массу предупреждений о неопределенности переменных.Это потому, что он не находит совпадения для title с этим шаблоном, но все равно печатает.

  if (/Currently/) {
    chomp;
    /\<title\>Currently: (.*)?\<\/title\>/;

    # ....
    print "$values2[0]$deg";
  }

Вот почему вы получаете дополнительный вывод.

Вам нужно пропустить строку, если совпадений нет.

/\<title\>Currently: (.*)?\<\/title\>/ or next;
...